瀏覽器渲染程式漏洞利用的一般思路是:在利用漏洞獲得使用者態任意地址讀寫許可權後,透過篡改DOM、js等物件的虛表函式指標劫持程式執行流,透過ROP鏈呼叫VirtualProtect等Win32 API,修改儲存shellcode buffer的記憶體屬性為PAGE_EXECUTE_READWRITE,最終由ROP鏈跳轉到shellcode執行。Windows 8.1後,Microsoft引入了CFG(Control Flow Guard)緩解技術[1],對間接呼叫的函式指標進行驗證,從而緩解了透過篡改虛表函式指標劫持程式執行流這種利用技術。
然而對抗不會因此終止,隨後出現了一些繞過CFG緩解技術的新方法,比如chakra/jscript9中透過篡改棧上函式返回地址劫持程式執行流[2],v8中利用具有可執行記憶體屬性的WebAssembly物件執行shellcode[3]等。 2020年12月,Microsoft在Windows 10 20H1中基於Intel Tiger Lake CPU加入了CET緩解技術[4],防護了透過篡改棧上函式返回地址劫持程式執行流的利用方法。因此,如何在有CET防護的環境中繞過CFG再次成為漏洞利用的難題。
在分析CVE-2021-26411在野利用樣本時[5],我們發現了一種利用Windows RPC(Remote Procedure Call)[5] 繞過CFG的新方法,這種方法無需依賴ROP鏈,透過構造RPC_MESSAGE並呼叫rpcrt4!NdrServerCall2即可實現任意程式碼執行。
1. CVE-2021-26411回顧
《IE瀏覽器在野0day:CVE-2021-26411分析》[5] 一文中介紹了該漏洞的根因:removeAttributeNode()觸發屬性物件nodeValue的valueOf回撥,回撥期間手動呼叫clearAttributes(),導致nodeValue儲存的BSTR被提前釋放。回撥返回後,沒有檢查nodeValue是否存在繼續使用該物件,最終導致UAF。
3月份Windows補丁中該漏洞的修復方法為,在CAttrArray::Destroy函式中刪除物件操作前增加索引檢查:
對於這樣一個大小可控的UAF漏洞,利用思路為:利用兩個不同型別的指標(BSTR和Dictionary.items)指向該空洞記憶體,透過型別混淆實現指標洩露和指標解引用:
2. RPC原理及利用方法
Windows RPC用來解決分散式客戶端/服務端函式呼叫問題。基於RPC,客戶端可以像呼叫本地函式一樣呼叫服務端函式,RPC基本架構如下圖:
客戶端/服務端程式將呼叫引數/返回值等傳給下層Stub函式,Stub函式負責封裝資料成NDR(Network Data Representation)格式,最後透過rpcrt4.dll提供的runtime庫進行通訊。
下面給出一示例idl:
當客戶端呼叫add函式後,服務端由rpcrt4.dll接受處理請求並呼叫rpcrt4!NdrServerCall2:
rpcrt4!NdrServerCall2只有一個引數PRPC_MESSAGE,其中包含了客戶端呼叫的函式索引、傳參等重要資料,服務端RPC_MESSAGE結構及主要子資料結構如下圖(32位):
如上圖所示,RPC_MESSAGE結構中,函式呼叫關鍵的兩個變數為Buffer和RpcInterfaceInformation。其中Buffer存放了函式的傳參,RpcInterfaceInformation指向RPC_SERVER_INTERFACE結構。RPC_SERVER_INTERFACE結構儲存了服務端程式介面資訊,其中+0x2c DispatchTable儲存了runtime庫和Stub函式的介面函式指標,+0x3c InterpreterInfo指向MIDL_SERVER_INFO結構。MIDL_SERVER_INFO結構儲存了服務端IDL介面資訊,其中DispatchTable儲存了服務端提供的遠端呼叫例程的函式指標陣列。
下面以一個例項介紹RPC_MESSAGE的結構:
根據上面給出的idl,當客戶端呼叫add(0x111, 0x222),服務端程式斷在rpcrt4!NdrServerCall2:
可以看到,動態除錯的記憶體dump與RPC_MESSAGE結構分析一致,其中add函式就存放在MIDL_SERVER_INFO. DispatchTable中。
接下來分析rpcrt4!NdrServerCall2是如何根據RPC_MESSAGE呼叫add函式的:
rpcrt4!NdrServerCall2內部呼叫rpcrt4!NdrStubCall2,rpcrt4!NdrStubCall2內部根據MIDL_SERVER_INFO. DispatchTable的基地址和RPC_MESSAGE. ProcNum計算呼叫的函式指標地址,將函式指標、函式引數和引數長度傳給rpcrt4!Invoke:
rpcrt4!Invoke內部最終呼叫服務端例程函式:
透過上面的分析可以知道,在獲得任意地址讀寫許可權後,可以構造一個RPC_MESSAGE資料結構,傳入想要呼叫的函式指標和函式引數,最後手動呼叫rpcrt4!NdrServerCall2,即可實現任意函式執行。
接下來需要解決兩個問題:
1)如何透過js指令碼呼叫rpcrt4! NdrServerCall2
2)觀察rpcrt4!Invoke最後的服務端例程函式呼叫:
可以看到這裡是一處間接呼叫,且有CFG檢查。因此需要考慮替換MIDL_SERVER_INFO. DispatchTable函式指標後如何繞過這裡的CFG防護。
首先解決問題1: 如何透過js指令碼呼叫rpcrt4! NdrServerCall2
這裡可以複用替換DOM物件虛表函式指標劫持程式執行流的方法,因為rpcrt4!NdrServerCall2是記錄在CFGBitmap裡的合法指標,所以替換後依然可以透過CFG檢查。樣本里透過篡改MSHTML!CAttribute::normalize,最終由“xyz.normalize()”呼叫rpcrt4!NdrServerCall2。
接著解決問題2: 如何繞過rpcrt4!NdrServerCall2中的CFG防護
樣本里的思路是:
1) 利用偽造的RPC_MESSAGE和rpcrt4!NdrServerCall2呼叫VirtualProtect修改RPCRT4!__guard_check_icall_fptr記憶體屬性為PAGE_EXECUTE_READWRITE
2)替換rpcrt4!__guard_check_icall_fptr裡儲存的指標ntdll!LdrpValidateUserCallTarget為ntdll!KiFastSystemCallRet,從而關閉rpcrt4的CFG檢查
3) 恢復RPCRT4!__guard_check_icall_fptr記憶體屬性
解決了問題1,2後,後續即可利用偽造的RPC_MESSAGE實現任意函式的呼叫。樣本中將shellcode寫入msi.dll + 0x5000的位置,最終透過rpcrt4!NdrServerCall2呼叫shellcode:
最終完整的利用演示:
3. 一些思考
CVE-2021-26411在野樣本中出現了利用RPC繞過CFG緩解技術的這一創新方法。這種利用方法無需構造ROP鏈,直接透過偽造RPC_MESSAGE即可實現任意程式碼執行,利用簡單且穩定,有理由相信該方法會成為繞過CFG緩解措施的一種新的有效利用技術。
4. 參考文獻
[1] https://docs.microsoft.com/en-us/windows/win32/secbp/control-flow-guard
[2] https://zhuanlan.kanxue.com/article-14133.htm
[3] https://www.anquanke.com/post/id/201951
[4] https://windows-internals.com/cet-on-windows/
[5] https://mp.weixin.qq.com/s?__biz=MzI4NjE2NjgxMQ==&mid=2650250070&idx=1&sn=5906feea0cfe498bffbb961e73f5c285
[6] https://docs.microsoft.com/en-us/windows/win32/rpc/rpc-start-page
5. 團隊簡介
深信服南研安全研究團隊專注於APT攻擊,在野漏洞利用追蹤、研究、檢測,攻防對抗等方向的研究工作。團隊成員曾在Windows,MacOS/iOS,Linux/Android等主流作業系統中發現了上百個安全漏洞,在BlackHat USA、BlackHat Europe、BlackHat Asia、HITB、Microsoft BlueHat、CodeBlue、HITCON、Virus Bulletin、Pacsec、看雪SDC、Freebuf CIS等國內外知名安全會議上發表過演講和論文。
如果你對以下技術內容感興趣,希望和高手切磋共事,趕緊發簡歷過來吧(郵箱caolei@sangfor.com.cn 工作地點:南京):
[APT攻擊溯源] 病毒木馬分析,威脅情報研究,APT溯源分析
[檢測引擎研發] EDR、XDR等檢測引擎研發
[攻防對抗技術] 紅藍對抗,ATT&CK技術研究,檢測規則編寫
[漏洞挖掘與利用] 在野漏洞利用研究,漏洞挖掘
[雲原生安全] 雲原生安全技術研究和產品研發
[MacOS安全] macOS安全產品核心模組開發,macOS沙箱、EDP、EDR、DLP等安全產品開發
[大資料安全] 研發基於大資料技術的下一代安全產品