AdobeReader邏輯漏洞分享(CVE-2021-21037)

語言: CN / TW / HK

背景

我們在第三屆“天府杯”國際網路安全大賽中成功完成AdobeReader RCE專案,這篇文章將會詳細介紹其中使用到的2個邏輯漏洞:長達15年之久的DLL載入漏洞與隨機數轉換邏輯漏洞,漏洞編號為CVE-2021-21037。

DLL載入邏輯漏洞分析

我們在挖掘AdobeReader時發現一個DLL載入的邏輯漏洞,該漏洞位於XFA模組中,在解析XFA語句的barcode型別type屬性時,沒有校驗是否支援該barcode屬性,直接嘗試載入輸入的值,導致任意DLL載入漏洞。該漏洞從2006年至2021年初修復,POC無需做任何修改,期間無差別執行長達15年之久。POC如圖1:

圖1:CVE-2021-21037 POC

執行POC並使用Process Monitor監控會發現:AdobeReader會嘗試載入當前目錄下的aaaaapmp.dll。如果輸入值為\xxx.xxx.xxx.xxx\aaaaa時,則會載入遠端IP共享目錄下的DLL,如果輸入值為c:\windows\aaaaa時,則會載入系統目錄中的DLL。但是有一個限制是:AdobeReader在執行LoadLibrary之前,會執行類似strcpy(in_type, “pmp”)的語句,導致LoadLibrary目標檔案的字尾只能是pmp.dll。

圖2:Adobe Reader 7.0.7中復現(2006年01月版本)
圖3:Adobe Reader DC 2020.013.20074中復現(2021年01月版本)

DLL釋放邏輯漏洞分析

有了任意DLL載入漏洞之後,我們還缺少一個DLL釋放的漏洞,AdobeAcrobat存在建立“PDF包”的功能,可以新增任意型別的附件到PDF中,並且可以在PDF中可以預覽該附件,在預覽時,該附件會被自動釋放到%temp%目錄下的隨機目錄中。我們使用這個方法將製作好的DLL新增到PDF中,使用JavaScript指令碼釋放到使用者目錄下的%temp%目錄中,然後用barcode任意DLL載入漏洞執行%temp%目錄下釋放出來的DLL檔案,由於目錄名稱是隨機的,我們還需要分析一下隨機目錄的生成方式。PDF釋放檔案時,會在%temp%目錄中建立隨機目錄並寫入,隨機目錄生成程式碼位於sub_60059740函式,程式碼片段如圖4。

圖4:sub_60059740()函式片段

首先了解一下Windows短路徑名命名規則:主檔名的長度如果超過了8個,系統自動擷取前6個字元,然後加上~1。從程式碼中可以觀察到隨機目錄生成格式為A9R+隨機字串+隨機字串+PID,由於A9R的存在,可以使用Windows短路徑的方式遍歷出這個目錄,總共需要遍歷4萬多個路徑,經過測試,觸發時間大約10多分鐘,但達不到我們的想要的速度。

圖5:遍歷所有路徑

挖掘隨機數轉換邏輯漏洞

我從上述程式碼中發現了一個有意思的地方,隨機數轉換為字串時使用itow()函式,並且引數設定為36進位制,在使用itow將數值轉換為36進位制字串時存在一個概率問題:轉換後的隨機路徑第一位數有51%概率為“1”,0%概率為“0”,其他值為1%概率。如下圖是我用C語言復現了AdobeReader使用itow()函式的轉換方式,統計並打印出第一位隨機數的概率。

圖6:隨機目錄第一位數的概率

將此邏輯漏洞在AdobeReader中實踐可以觀察到:釋放一次檔案,有51%概率目錄開頭為A9R1,釋放多次之後,生成開頭為A9R1的目錄概率約為100%。此時我們已經確定了Windows短路徑的前4位內容,再遍歷剩下2位路徑,只需1000次遍歷就可以在10秒左右載入指定DLL。

圖7:%temp%目錄下的隨機目錄

漏洞利用

最後,將DLL釋放漏洞與DLL載入漏洞組合起來,完成一套完整的利用。

圖8:邏輯漏洞組合

CVE公告

http://helpx.adobe.com/security/products/acrobat/apsb21-09.html

http://nvd.nist.gov/vuln/detail/CVE-2021-21037