《V8漏洞挖掘與利用.pdf》由會員分享,可在線閱讀,更多相關《V8漏洞挖掘與利用.pdf(39頁珍藏版)》請在三個皮匠報告上搜索。
1、V8V8漏洞挖掘與利用漏洞挖掘與利用 About Us:About Us:TheDog京東安全實驗室-漏洞研究:共發現Android、iOS、MacOS等CVE超過200個,獲得Google、Apple、Samsung、Huawei等致謝并入選全球名人堂-國際演講:研究成果在Black Hat USA/ASIA、DEFCON、CanSecWest、RECON、PoC、MOSEC、GeekCon等發表技術演講,并入選多個頂級學術會議(CCF A類會議)如ACM ISSTA(Proceedings of the 33nd ACM SIGSOFT International Symposium on
2、 Software Testing and Analysis)。并將在即將到來的Black Hat USA 2024上現場發表關于Mac安全研究和靜態代碼分析的分享-行業認可:2022年度CNNVD 一級支撐單位,2023、2024年度GeekCon優秀合作伙伴、評審委員會成員,中國反網絡病毒聯盟成員單位,華為終端安全優秀合作伙伴,入選谷歌全球優質開源項目-行業榮譽:黑客奧斯卡Pwnie Award 2022最佳提權漏洞獎-公司內榮譽:2022、2023、2024信息安全部攻堅克難優秀項目獎,2023年度CCO體系杰出項目獎About Us:About Us:部門工作方向1.供應鏈安全:建設從
3、組件構建到發布再到運行的全鏈路安全能力,通過技術手段及時發現和消除內部軟件供應鏈安全風險2.業務安全:廣告黑灰產挖掘,主要工作是識別虛假流量,惡意推廣,流量劫持等作弊行為。3.APP安全:IOS,安卓,鴻蒙4.安全研究:瀏覽器,Linux,MacOS,IOS,安卓等方向的漏洞挖掘與利用簡歷投遞:,請標注:意向方向,實習or校招,List:List:對于Fuzzilli的改進1.擴展語料生成的覆蓋面2.v8 Builtins覆蓋率插樁漏洞利用3.v8某漏洞利用思路擴展語料生成的覆蓋面擴展語料生成的覆蓋面所有js引擎可能的輸入所有Fuzz可能生成的語料空間Fuzz永遠不可能發現這部分的漏洞擴展語料
4、生成的覆蓋面擴展語料生成的覆蓋面所有js引擎可能的輸入所有Fuzz可能生成的語料空間Fuzz永遠不可能發現這部分的漏洞Modulenew builtins擴展語料生成的覆蓋面擴展語料生成的覆蓋面所有js引擎可能的輸入所有Fuzz可能生成的語料空間Modulenew builtinsv8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁覆蓋率引導:如果一個樣本執行到了新的BasicBlock(觸發的新邊),那么該樣本更優否則拋棄該樣本LLVM Coverage Instrumentationv8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁String.prototype
5、.at()方法通過Torque編寫實現k是否超過字符串長度會進入兩個不同的分支v8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁abc.at(2)與abc.at(3)顯然執行到了不同的分支但是LLVM插樁卻并沒有收集到CSA1.宏展開StubCPP語言CPP:Turbofan,GC,.Torque:BuiltinsCSA1.宏展開StubCPP:Turbofan,GC,.Torque:Builtinsmksnapshot2.編譯cpp代碼mksnapshot是一個可執行文件CSA1.宏展開StubCPP:Turbofan,GC,.Torque:Builtinsmksnapshot
6、2.編譯cpp代碼snapshot.bin3.執行Turbofan優化編譯運行mksnapshot1.CSA調用turbofan接口生成IR2.turbofan優化IR生成匯編指令3.內存中的匯編指令打包進行snapshot.bin中CSA1.宏展開StubCPP:Turbofan,GC,.Torque:Builtinsmksnapshot2.編譯cpp代碼snapshot.bin3.執行Turbofan優化編譯v84.編譯cpp代碼CSA1.宏展開StubCPP:Turbofan,GC,.Torque:Builtinsmksnapshot2.編譯cpp代碼snapshot.bin3.執行Tu
7、rbofan優化編譯v84.編譯cpp代碼5.運行時加載CSA1.宏展開StubCPP:Turbofan,GC,.Torque:Builtinsmksnapshot2.編譯cpp代碼snapshot.bin3.執行Turbofan優化編譯v84.編譯cpp代碼5.運行時加載LLVM編譯Turbofan編譯CSA1.宏展開StubCPP:Turbofan,GC,.Torque:Builtinsmksnapshot2.編譯cpp代碼snapshot.bin3.執行Turbofan優化編譯v84.編譯cpp代碼5.運行時加載LLVM編譯覆蓋率缺失v8 Builtinsv8 Builtins覆蓋率覆蓋
8、率插樁插樁schedule后生成CFGv8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁schedule后生成CFG指令選擇時插入樁指令v8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁schedule后生成CFG指令選擇時插入樁指令指令生成:emit匯編指令v8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁指令生成:emit匯編指令共享內存CPP插樁部分0 x1000v8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁v8 Builtinsv8 Builtins覆蓋率覆蓋率插樁插樁v8 Builtinsv8 Builtins覆蓋率覆蓋率插
9、樁插樁漏洞漏洞利用利用相同結構的對象共享同一個隱式類漏洞漏洞利用利用1.JSFunction對象的initial_map字段表示構造出的對象的隱式類2.initial_map是lazy allocate的,只有在new F()之后才有該字段漏洞漏洞利用利用POC:Crash:漏洞漏洞利用利用1.隱式類中屬性過多2.開啟feedback-normalization功能3.訪問:obj對象構造函數的initial_map job(obj)-map-constructor-initial_map漏洞漏洞利用利用job(obj)-map-constructor-initial_map背后的假設:如果:
10、obj有構造函數constructornew constructor()那么:constructor一定被new過lazy allocate那么:constructor一定具有initial_map字段因此省略了對于initial_map字段存在性的檢查,直接訪問漏洞漏洞利用利用job(obj)-map-constructor-initial_map背后的假設:如果:obj有構造函數constructornew constructor()那么:constructor一定被new過lazy allocate那么:constructor一定具有initial_map字段因此省略了對于initial
11、_map字段存在性的檢查,直接訪問job(Object)-mapjob(Object)-map-constructor不存在不存在initial_mapinitial_map字段字段漏洞漏洞利用利用job(obj)-map-constructor-initial_map背后的假設:如果:obj有構造函數constructornew constructor()那么:constructor一定被new過lazy allocate那么:constructor一定具有initial_map字段因此省略了對于initial_map字段存在性的檢查,直接訪問job(Object)-mapjob(Objec
12、t)-map-constructor不存在不存在initial_mapinitial_map字段字段漏洞漏洞利用利用1.隱式類中屬性過多2.開啟feedback-normalization功能這里越界讀4B用作constructor-initial_map()漏洞漏洞利用利用越界讀:1.越界讀的內容是否能控制?2.越界讀之后數據會如何被處理?漏洞漏洞利用利用發現constructor后面的對象為constructor-properties指向的PropertyArray對象漏洞漏洞利用利用偽造initial_map1.棄用原來的PropertyArray2.GC3.把evil堆噴到constructor后面這樣訪問initial_map時讀入的實際是job(evil)-map漏洞漏洞利用利用偽造的initial_map如何被使用 Normalize(initial_map)保留elements_kind用于原對象的新隱式類漏洞漏洞利用利用elements_kind決定了job(obj)-elements數組的解釋方式DICTIONARY_ELEMENTS稀疏利用思路1.在elements中偽造字典,控制字典的關鍵元信息2.混淆elements_kind為DICTIONARY_ELEMENTS3.訪問對象的索引屬性,實現更長的內存越界