【原創漏洞】微軟IE/Edge腳本引擎漏洞CVE-2020-0768分析
發布時間 2020-03-13微軟在近日發布的補丁公告中,修復了一個由啟明星辰ADLab安全研究員提交的漏洞,漏洞編號為CVE-2020-0768。漏洞位于ChakraCore引擎代碼庫中,可同時影響Internet Explorer 11和Microsoft Edge (基于EdgeHTML)瀏覽器。該漏洞是一個內存破壞型漏洞,有遠程代碼執行的風險,因此微軟將其評級為“嚴重”,并致謝ADLab。
應對措施
使用Windows自動更新或手動下載補丁包修復漏洞。
漏洞和補丁分析
PART1
本漏洞是ChakraCore引擎在JIT編譯過程中,單一指令的數據流分析錯誤,導致的變量活躍性分析和寄存器分配出錯。首先,從漏洞樣本的控制流圖開始。
其中,在Block 4有如下的字節碼:
符號s10代表[1337],s6代表const修飾的arr。按照編譯原理的術語,變量獲取定義值稱為def,變量值被使用稱為use,在InitConst指令中s6被def,s10被use,隨后在StElemC這條指令下,s6被use??梢钥吹絪6與s10關系密切,s6可以看作s10按照另一種方法對同一變量的引用,ChakraCore稱為copy-prop符號對原始符號的引用。但調試顯示,這里發生了錯誤。
如此一來形成了原始符號為s10,copy-prop符號為s6,即s6->s10的鍵值對。其?;厮菸挥冢?
錯誤鍵值對是根據數據流分析的錯誤結果得出的。隨后,這個鍵值對被加入了Block 4中blockOptData->capturedValues->copyPropSyms,其?;厮菸挥冢?
隨后,在JIT ForwardPass這樣從前向后的優化過程中,Block 4的blockOptData->capturedValues被合并給Block 5,其中包含s6->s10這一鍵值對,其?;厮菸挥冢?
再之后,在JIT BackwardPass這樣從后向前的優化過程中,Block 5的upwardExposedUses通過訪問blockOptData->capturedValues->copyPropSyms,把s6->s10這一鍵值對加入。其?;厮菸挥冢?
upwardExposedUses在編譯原理中被稱為“向上暴露的使用”,它是變量活躍性分析的對稱過程。隨后在反向傳播的過程中,含有上述鍵值對的upwardExposedUses被傳遞給Block 4、Block 3和Block 2。而作為Loop Header的Block 2將其upwardExposedUses用于活躍性分析和后續的寄存器分配過程。
上述過程可以通過下圖來表示??梢钥吹?,錯誤的數據經過了正向傳播和反向傳播,最終在循環體的全部范圍都被污染。
隨后,由于上述錯誤數據,在JIT的寄存器分配過程為s10計算出了錯誤的生命周期,其生命周期橫跨循環的開始到結束。于是陰差陽錯,JIT插入了一個MOV指令,形如MOV labelReg, mem,但并沒有初始化其instr->src->m_offset,該值始終為0。在最后生成機器碼的時候,生成了一個指向棧幀指針、偏移為0的讀內存操作,表示為[EBP+0x0]或[RBP+0x0]。
這樣,一個非預期的內存訪問把非法的數據讀入了JavaScript引擎上下文,隨后在BailOut或其他情況會引用到,這樣的非法數據將會造成類型混淆。
PART2
造成上述錯誤數據傳播的原因在于InitConst這一指令其實沒有在ChakraCore的JIT代碼中得到正確的數據流分析,因此在微軟的修復中,在JIT剛開始介入的時候,InitConst指令就被替換成Ld_A指令。
ChakraCore完整實現了對Ld_A指令的數據流分析。此時,在分析Forward Pass中,發現Block 4中的鍵值對不再是s6->s10,而是s10->s6,也就是說s10是原始符號,s6是引用s10的copy-prop符號。如此一來,自然不會造成錯誤數據的傳播。微軟在IE11瀏覽器中使用了相同的代碼來修補這個漏洞。
事實上,在ECMAScript 6標準中,const修飾符用來表示一個變量在定義之后不可再被賦值,是語法層次的約束;而JavaScript引擎中的JIT過程始終發生在解釋執行之后,如果const修飾符的約束在解釋執行階段被違反,將會立即退出,不會優化執行JIT過程。因此,JIT過程只需要考慮數據流問題,而不必考慮const修飾符的約束。由于ChakraCore在JIT的優化階段與解釋執行階段使用同一套中間語言,不管是Ld_A還是InitConst都兼容JIT的全過程,本漏洞可以明確認為是一個業務邏輯漏洞。
參考鏈接:
1.https://portal.msrc.microsoft.com/en-us/security-guidance/acknowledgments
2.https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0768