啟明星辰ADLab:Chrome 任意代碼執行漏洞分析

發布時間 2021-04-16

4月13日,國外安全研究人員在社交媒體上發布了Chrome 的0Day 漏洞(參見參考鏈接[1]),漏洞編號為CVE-2021-21220,并在github上公開了該漏洞的POC以及利用代碼,相關的利用代碼在關閉沙盒的情況下可達到遠程代碼執行。由于chromium 相關框架的廣泛應用,該漏洞在其他瀏覽器或腳本引擎中仍有存在的可能。該漏洞在chrome 90.0.4430.72版本已經修復,提醒廣大用戶及時更新到最新版本(參見參考鏈接[2]),以規避該漏洞存在的攻擊風險。


啟明星辰ADLab分析發現,該漏洞存在于Chrome 的JavaScript 解析引擎V8中,POC主要代碼如下:


1.png


在POC line4執行異或操作,(2**31)^0=-2147483648。根據ECMA標準(參見參考鏈接[3]),異或的結果是32位整數:


2.png


在v8 SimplifiedLowering階段,增加了對異或的結果執行ChangeInt32ToInt64的操作:


3.png


SimplifiedLowering 執行后,異或的類型被標記為Word32:


4.png


在MachineOperatorOptimizer階段,由于是和0做異或,所以用左操作數代替異或操作。


5.png


此時的結構圖如下,可以看出異或的結果是Word32|TypeUint32:


6.png


在指令選擇時,對于VisitChangeInt32ToInt64操作,根據其輸入類型選擇操作碼:


7.png


所以,這里的操作碼是kX64Movl操作碼,該指令在將源操作數移至目的位置時并不做符號擴展,這樣在POCline4中x的值為2147483649,于是在poc line12的位置,編譯器其實使用的是x=1的值作為創建數組的長度。這是編譯器未曾預料到的情況。


在變量的范圍分析中,編譯器認為創建的數組長度是0:


8.png


 在執行POP時,會先判斷數組的長度是否為0,如果不是就會將其長度減1:


9.png


由于數組長度固定,編譯器在LoadElimination 的過程中會進行常量折疊,在代碼路徑走到這里的時候通過StoreField操作將數組的長度直接賦值為-1:


10.png

11.png


由于是smi,所以是0xfffffffe:


12.png


打印數組長度:


13.png

這時超長的數組就出爐了,任由你玩了。從補丁對比上來看(參見參考鏈接[4]),對于ChangeInt32ToInt64將其輸入作為有符號對待,這樣就避免了該漏洞通過該路徑觸發。


14.png


關于利用的部分,基本是老套路,這里就不再贅述。


參考鏈接:

[1]https://twitter.com/r4j0x00/status/1381643526010597380

[2]https://www.google.com/chrome/

[3]https://www.ecma-international.org/publications-and-standards/standards/ecma-262/

[4]https://chromium-review.googlesource.com/c/v8/v8/+/2820971/3/src/compiler/backend/x64/instruction-selector-x64.cc#1379


啟明星辰積極防御實驗室(ADLab)


ADLab成立于1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員,“黑雀攻擊”概念首推者。截止目前,ADLab已通過CVE累計發布安全漏洞近1100個,通過 CNVD/CNNVD累計發布安全漏洞1000余個,持續保持國際網絡安全領域一流水準。實驗室研究方向涵蓋操作系統與應用系統安全研究、智能終端安全研究、物聯網智能設備安全研究、Web安全研究、工控系統安全研究、云安全研究。研究成果應用于產品核心技術研究、國家重點科技項目攻關、專業安全服務等。


adlab.jpg