[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

雲鼎實驗室發表於2019-02-25

0. 漏洞背景


2 月 20 日 Drupal 官方披露了一個 Drupal 的遠端命令執行漏洞:https://www.drupal.org/sa-core-2019-003,漏洞的觸發條件為開啟了 RESTful Web Services,且允許 POST / PATCH 請求。

根據 Drupal 的配置,此漏洞可能不需要任何許可權即可觸發,但普適性不高。一旦該漏洞被利用,攻擊者則可以直接在 Web 伺服器上執行任意 PHP 程式碼,造成伺服器被入侵、使用者資訊洩露等後果。

騰訊雲不受該漏洞影響,此漏洞爆發後,騰訊雲安全團隊第一時間進行跟蹤分析,且對雲上客戶進行預警通知。

1. 漏洞定位


漏洞通告指出了 Drupal 8 在開啟了 RESTful Web Services 模組,同時允許了 PATCH / POST 方法請求後,可以造成程式碼執行漏洞。

根據 commit log ( https://github.com/drupal/core/commit/24b3fae89eab2b3951f17f80a02e19d9a24750f5 )可以定位到漏洞的觸發原因在於反序列化的操作:

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

可以推測應該是在進行 REST API 操作的過程中,options 引數的內容帶入到 unserialize 函式導致的。通過 diff 可以發現 LinkItem.php 和 MapItem.php 都受到影響,這裡從 LinkItem 來向上挖掘漏洞點。檢視 core\modules\link\src\Plugin\Field\FieldType\LinkItem.php:

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

梳理了其整個呼叫鏈,從 REST 請求開始,先通過使用者傳入的 JSON 的 _links.type 獲取了其對應的 Entity,再獲取 Entity 內的 Fields 列表,遍歷這個列表得到 key,從使用者傳入的 JSON 內取出 key,拼接成為 field_item:key 的形式(過程略),最終在 getDefinition 內查詢了 definitions 陣列內的欄位定義,得到一個對應的 Field 的例項物件,過程大體如下:

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

接著 FieldNormalizer 的 denormalize 方法呼叫了 Field 的 setValue 方法。

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

也就是說,我們如果可以將 $field_item 控制為 LinkItem 或者 MapItem,即可觸發反序列化。

2. 觸發點構造


我們在 Drupal 後臺配置好 RESTful Web Service 外掛,選擇一個可以進行 POST 的操作。為了儘可能模擬網站管理員的配置,我們這裡允許對於 /user/register 的 POST 操作。於情於理,使用者註冊處必然可以作為匿名使用者來進行操作。開啟 /user/register :

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

設定允許匿名使用者利用 POST 來訪問 /user/register 。

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

上文中提到,我們需要一個 Entity 記憶體在 LinkItem Field。通過對 Entity 的查詢,定位到 MenuLinkContent 和 Shortcut 使用了 LinkItem,利用 Shortcut 來進行進一步的測試。

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

Shortcut 的 _links.type 為:http://127.0.0.1/rest/type/shortcut/default 。向 /user/register 傳送 POST 請求,同時在 PHPStorm 內將斷點下在core\modules\hal\src\Normalizer\FieldItemNormalizer.php 的 denormalize 函式:

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

可以發現,在呼叫 setValue 方法的現場,$field_item 為 LinkItem。跟入 setValue 方法(圖 2),根據邏輯,如果 $values 為一個陣列。且 $values['options'] 存在,那麼就執行反序列化操作。我們修改 payload 為即可觸發反序列化。

驗證視訊:

攻擊者利用此反序列化可以在伺服器上執行任意程式碼,利用此漏洞在伺服器上彈出計算器的視訊如下:

[原創]Drupal SA-CORE-2019-003 遠端命令執行分析

3. 安全建議

修復方案如下:

1. Drupal 8.6.x 版本升級到 8.6.10 版本

2. Drupal 8.5.x 或更早期版本版本升級到 8.5.11 版本

3. Drupal 7 暫無更新

緩解措施如下:

1. 禁用 RESTful Web Services 模組

2. 配置伺服器不允許 POST/PATCH 請求



本文作者:Rico @騰訊安全雲鼎實驗室

騰訊安全雲鼎實驗室 關注雲主機與雲內流量的安全研究和安全運營。利用機器學習與大資料技術實時監控並分析各類風險資訊,幫助客戶抵禦高階可持續攻擊;聯合騰訊所有安全實驗室進行安全漏洞的研究,確保雲端計算平臺整體的安全性。相關能力通過騰訊雲開放出來,為使用者提供黑客入侵檢測和漏洞風險預警等服務,幫助企業解決伺服器安全問題。



[推薦]看雪企服平臺,提供安全分析、定製專案開發、APP等級保護、滲透測試等安全服務!

相關文章