Drupal 遠程代碼執行漏洞安全通告
發布時間 2019-02-22漏洞編號和級別
CVE編號:CVE-2019-6340,危險級別:嚴重, CVSS分值:官方未評定
影響范圍
受影響版本:
漏洞影響Drupal 8.6.x、Drupal 8.5.x 及 Drupal 7中的部分組件。詳細版本信息如下:
Drupal 8.6.9 及以下版本
Drupal 8.6.10 及以下版本
影響組件
RESTful Web Services
JSON:API
Link
Metatag
Video
Paragraphs
Translation Management Tool
Font Awesome lcons
漏洞概述
2月20日,Drupal 官方披露了一個 Drupal 的遠程命令執行漏洞,漏洞是由Drupal 未對RESTful Web的數據進行嚴格效驗造成。如果網站開啟了RESTful Web服務,并且接受PATCH 、POST請求,或站點中開啟了其他web服務模塊,將會出現反序列化問題,進而造成代碼執行。
根據Drupal 的配置,此漏洞可能不需要任何權限即可觸發。但是如果被利用,攻擊者則可以直接在Web服務器上執行任意PHP代碼,造成服務器被入侵、用戶信息泄露等后果。
RESTful 服務默認不開啟,大大降低漏洞風險。為安全起見,建議使用Drupal 的用戶及時進行版本升級。
漏洞細節
1. 漏洞定位
漏洞通告指出了 Drupal 8 在開啟了 RESTful Web Services 模塊,同時允許了 PATCH / POST 方法請求后,可以造成代碼執行漏洞。
根據 commit log(https://github.com/drupal/core/commit/24b3fae89eab2b3951f17f80a02e19d9a24750f5)可以定位到漏洞的觸發原因在于反序列化的操作:
可以推測應該是在進行 REST API 操作的過程中,options 參數的內容帶入到 unserialize 函數導致的。通過 diff 可以發現 LinkItem.php 和 MapItem.php 都受到影響,這里從 LinkItem 來向上挖掘漏洞點。
查看 core\modules\link\src\Plugin\Field\FieldType\LinkItem.php:
梳理了其整個調用鏈,從 REST 請求開始,先通過用戶傳入的 JSON 的 _links.type 獲取了其對應的 Entity,再獲取 Entity 內的 Fields 列表,遍歷這個列表得到 key,從用戶傳入的 JSON 內取出 key,拼接成為 field_item:key 的形式(過程略),最終在 getDefinition 內查找了 definitions 數組內的字段定義,得到一個對應的 Field 的實例對象,過程大體如下:
接著 FieldNormalizer 的 denormalize 方法調用了 Field 的 setValue 方法。
也就是說,我們如果可以將 $field_item 控制為 LinkItem 或者 MapItem,即可觸發反序列化。
2. 觸發點構造
我們在 Drupal 后臺配置好 RESTful Web Service 插件,選擇一個可以進行 POST
的操作。為了盡可能模擬網站管理員的配置,我們這里允許對于/user/register的 POST操
作。于情于理,用戶注冊處必然可以作為匿名用戶來進行操作。開啟/user/register :
設置允許匿名用戶利用 POST 來訪問 /user/register 。
上文中提到,我們需要一個Entity內存在LinkItem Field。通過對于Entity的查找,定位到MenuLinkContent和Shortcut使用了LinkItem,利用Shortcut來進行進一步的測試。
Shortcut 的 _links.type 為 http://127.0.0.1/rest/type/shortcut/default,可以在單步的時候找到,過程不敘。向 /user/register 發送 POST 請求,同時在 PHPStorm 內將斷點下在
ore\modules\hal\src\Normalizer\FieldItemNormalizer.php 的 denormalize 函數:
可以發現,在調用 setValue 方法的現場,$field_item為LinkItem。跟入setValue 方法,根據邏輯,如果$values為一個數組。且$values['options']存在,那么就執行反序列化操作。我們修改payload為即可觸發反序列化。
攻擊者利用此反序列化可以在服務器上執行任意代碼。
修復建議
修復方案如下:
Drupal 8.6.x版本升級到8.6.10
Drupal 8.5.x或更早期版本版本升級到8.5.11版本
Drupal 7暫無更新
緩解措施如下:
禁用RESTful Web Services模塊
配置服務器不允許POST/PATCH請求
參考鏈接
https://www.drupal.org/sa-core-2019-003