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