錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
詳細分析關于CVE-2018-1040微軟Windows遠程內核崩潰漏洞

作者: 佚名  日期:2018-06-26 21:38:29   來源: 本站整理

 在2018年1月底,FortiGuard Labs團隊在微軟Windows中發現了一個遠程內核崩潰漏洞,并按照Fortinet公司負責任的披露流程向微軟進行了報告。6月12日,微軟發布了一份包含此漏洞修復程序的公告,并將其標識為CVE-2018-1040。
這個漏洞存在于微軟Windows代碼完整性內核模塊“ci.dll”中。所有流行的Windows版本都受到影響,包括Windows 10、Windows 7、Windows 8.1、Windows Server 2008、Windows Server 2012和Windows Server 2016。
漏洞可以通過在網站或SMB共享遠程下載一個精心制作的.DLL或.LIB文件到Windows上來觸發。當使用IE或Edge下載文件并保存時,將執行Windows內核指針解引用到無效地址。因此,會發生Windows Bugcheck(內核崩潰)。在Windows 10上,系統重新啟動后,用戶登錄時會發生內核崩潰。這導致Windows 10內核的崩潰出現無限循環。
在這篇文章中,我將分享關于這個漏洞的詳細分析。
 
分析
要重現此遠程內核崩潰漏洞,你可以在Windows 10上打開IE或Edge,輸入url http://192.168.0.111/poc.dll(它可以是托管PoC文件的任何URL),然后“在彈出窗口中選擇“保存。當保存文件poc.dll時,可以看到Windows 10 Bugcheck(內核崩潰)。對于Windows 10中的內核崩潰,內核崩潰即使重新啟動也會繼續發生,這會導致Windows 10無法正常工作。對于用戶,系統可能需要重新安裝。
以下是發生崩潰時的調用堆棧。 

圖1.發生崩潰時的調用堆棧
從上面的調用堆棧輸出中,我們可以看到在調用函數“KERNELBASE!GetFileVersionInfoSizeExW”時會發生內核崩潰,然后調用函數“KERNELBASE!LoadLibraryExW”。最后,它會導致一個完整的內核崩潰。
當IE/Edge下載.dll或.lib文件并保存在磁盤上時,它將調用函數“KERNELBASE!GetFileVersionInfoSizeExW”來檢索.dll/.lib的版本信息。想要獲取.dll/.lib的版本信息,它會調用函數“KERNELBASE!LoadLibraryExW”以加載dwFlags等于0x22的.dll/.lib文件。在微軟MSDN中搜索,我們可以看到dwFlags 0x22是“LOAD_LIBRARY_AS_DATAFILE(0x00000002)”和“LOAD_LIBRARY_AS_IMAGE_RESOURCE(0x00000020)”的組合。因此,IE/Edge會將下載的.dll /.lib文件加載為資源.dll/.lib和數據文件以檢索相關信息。由于精心制作的poc.dll,在Windows 10發生內核崩潰后,即使重新啟動也無法恢復系統。這是因為用戶登錄Windows時,會掃描IE/Edge臨時目錄中的.dll /.lib文件。
函數LoadLibraryExW加載精心制作的PoC文件poc.dll。當它處理SizeOfHeaders時,它會得到一個0x06的尺寸大小(這是一個精心制作的大小,正確的大小應該是0x200)。在計算CI.dll中的函數CI!CipImageGetImageHash中的sha1散列塊大小時,會導致整數溢出。溢出的塊大小是0xfffffeb6。通過調用函數CI!SymCryptSha1AppendBlocks,計算得到溢出塊的大小為0xfffe7a。由于制作的sha1塊尺寸過大,導致大循環和內核內存讀訪問沖突。因此,會發生Windows Bugcheck(內核崩潰)。 

圖2.包含精心制作的SizeOfHeaders的poc.dll
通過你想工程和跟蹤,我們可以看到函數_CipImageGetImageHash的調用導致一個sha1塊大小整數溢出。
 PAGE:85D15618 _CipImageGetImageHash@36 proc near ; CODE XREF:
......
PAGE:85D1571F mov edx, edi
PAGE:85D15721 mov ecx, [ebp+arg_4]
PAGE:85D15724 call _HashpHashBytes@12 ; HashpHashBytes(x,x,x)
PAGE:85D15729 lea edx, [esi+0A0h]
PAGE:85D1572F
PAGE:85D1572F loc_85D1572F: ; CODE XREF: CipImageGetImageHash(x,x,x,x,x,x,x,x,x)+CF↑j
PAGE:85D1572F mov edi, [ebp+arg_10]
PAGE:85D15732 mov eax, [edi+54h] ; -----> here [edi+54h] is obtained from poc.dll at offset 0x104, its value is 0x06.
PAGE:85D15735 sub eax, edx ; -----> here edx=83560150
PAGE:85D15737 add eax, [ebp+BaseAddress] ----> here [ebp+BaseAddress]=83560000
PAGE:85D1573A push eax ; ---------> So, after the above calculation, eax occurs integer subtraction overflow,result in eax=fffffeb6
PAGE:85D1573B mov ecx, [ebp+arg_4]
PAGE:85D1573E call _HashpHashBytes@12 ------> the function call chain finally results in a kernel crash
PAGE:85D15743 mov esi, [edi+54h] ;
PAGE:85D15746 mov [ebp+var_30], esi
In following function, an insufficient bounds check is performed:
.text:85D0368C @SymCryptHashAppendInternal@16 proc near
.text:85D0368C ; CODE XREF: SymCryptSha1Append(x,x,x)+10↑p
.text:85D0368C ; SymCryptMd5Append(x,x,x)+10↑p
.text:85D0368C
.text:85D0368C var_18 = dword ptr -18h
.text:85D0368C var_14 = dword ptr -14h
.text:85D0368C var_10 = dword ptr -10h
.text:85D0368C var_C = dword ptr -0Ch
.text:85D0368C var_8 = dword ptr -8
.text:85D0368C var_4 = dword ptr -4
.text:85D0368C Src = dword ptr 8
.text:85D0368C MaxCount = dword ptr 0Ch
.text:85D0368C
.text:85D0368C mov edi, edi
.text:85D0368E push ebp 
.text:85D0368F mov ebp, esp .
......
85D0372D mov ecx, [ebp+var_8]
.text:85D03730 mov edx, [ebp+var_18]
.text:85D03733 jmp short loc_85D0373B
.text:85D03735 ; ---------------------------------------------------------------------------
.text:85D03735.text:85D03735 loc_85D03735: ; CODE XREF: SymCryptHashAppendInternal(x,x,x,x)+46↑j
.text:85D03735 ; SymCryptHashAppendInternal(x,x,x,x)+52↑j
.text:85D03735 mov ecx, [ebp+Src]
.text:85D03738 mov [ebp+var_8], ecx
.text:85D0373B
.text:85D0373B loc_85D0373B: ; CODE XREF: SymCryptHashAppendInternal(x,x,x,x)+A7↑j
.text:85D0373B cmp esi, [edx+18h] ; ----> here [edx+18h] equals 40h, esi equals fffffe7a, due to unsigned integer comparison, the crafted block size is not found
.text:85D0373E jb short loc_85D03769
.text:85D03740 mov edi, [edx+1Ch]
.text:85D03743 lea eax, [ebp+var_C]
.text:85D03746 push eax
.text:85D03747 push esi
.text:85D03748 mov esi, [edx+0Ch]
.text:85D0374B add edi, ebx
.text:85D0374D mov ecx, esi
.text:85D0374F call ds:___guard_check_icall_fptr ; _guard_check_icall_nop(x)
.text:85D03755 mov edx, [ebp+var_8]
.text:85D03758 mov ecx, edi
.text:85D0375A call esi 
隨著sha1塊的溢出,它最終調用了以下函數:
.text:85D01060 @SymCryptSha1AppendBlocks@16 proc near ; CODE XREF: SymCryptSha1Result(x,x)+40↑p
......
.text:85D010A4 mov eax, [ebp+arg_0] -----> here eax gets the overflowed sha1 block size= 0xfffffe7a
.text:85D010A7 mov [esp+0D0h+var_B4], edi
.text:85D010AB mov [esp+0D0h+var_C4], ecx
.text:85D010AF cmp eax, 40h
.text:85D010B2 jb loc_85D02507
.text:85D010B8 mov [esp+0D0h+var_58], ecx
.text:85D010BC mov ecx, [esp+0D0h+var_C0]
.text:85D010C0 mov [esp+0D0h+var_54], ecx
.text:85D010C4 lea ecx, [edx+8] ;
.text:85D010C7 shr eax, 6 -------> the overflowed block size is used as the following loop function counter
.text:85D010CA mov [esp+0D0h+var_60], esi
.text:85D010CE mov [esp+0D0h+var_5C], edi
.text:85D010D2 mov [esp+0D0h+var_68], ecx ;
.text:85D010D6 mov [esp+0D0h+var_50], eax -----> here is the loop counter
......
.text:85D01359 ror edx, 2
.text:85D0135C mov ecx, [ecx+28h]
.text:85D0135F bswap ecx
.text:85D01361 mov [esp+0D0h+var_6C], ecx
.text:85D01365 mov ecx, eax
.text:85D01367 rol ecx, 5
.text:85D0136A mov eax, edi
.text:85D0136C add ecx, [esp+0D0h+var_6C]
.text:85D01370 xor eax, edx
.text:85D01372 and eax, [esp+0D0h+var_C0]
.text:85D01376 xor eax, edi
.text:85D01378 add edi, 5A827999h
.text:85D0137E add eax, ecx
.text:85D01380 mov ecx, [esp+0D0h+var_68]
.text:85D01384 add eax, esi
.text:85D01386 mov esi, [esp+0D0h+var_C0]
.text:85D0138A mov [esp+0D0h+var_84], eax
.text:85D0138E ror esi, 2
.text:85D01391 mov ecx, [ecx+2Ch] ----> after a large loop call, here it results in a read access violation, so the bugcheck (kernel crash) occurs 
.text:85D01394 bswap ecx
.text:85D01396 mov [esp+0D0h+var_9C], ecx
.......
.text:85D024DD mov ecx, [esp+0D0h+var_68]
.text:85D024E1 mov [esp+0D0h+var_54], eax
.text:85D024E5 add ecx, 40h ----> memory access pointer increases 0x40 in each loop
.text:85D024E8 mov [esp+0D0h+var_C0], eax
.text:85D024EC mov eax, [ebp+arg_0]
.text:85D024EF sub eax, 40h
.text:85D024F2 mov [esp+0D0h+var_68], ecx
.text:85D024F6 sub [esp+0D0h+var_50], 1 ------> here the loop counter decreases by 1, not equaling 0, to continue the loop. Due to the overflowed large sha1 block size, here a large loop is executed.
.text:85D024FE mov [ebp+arg_0], eax
.text:85D02501 jnz loc_85D010DD
.text:85D02507
從上面的分析中可以看出,遠程內核崩潰的根本原因是LoadLibraryEx函數無法正確解析精心制作的.dll/.lib文件作為資源和數據文件。當poc.dll包含精心制作的SizeOfHeaders值0x06(正確的值應為0x200)位于PoC文件中的偏移量0x104處時,會發生整數溢出。
精心制作的大小值會導致計算錯誤的sha1塊大小(它會變成一個負值)。由于邊界檢查不足,sha1計算函數進入一個較大的循環,這會導致內存讀取訪問沖突。最后,發生系統Bugcheck(內核崩潰)。
 
解決方案
所有易受攻擊的微軟Windows用戶都被鼓勵升級到最新的Windows版本或應用最新的補丁。此外,已經部署了Fortinet IPS解決方案的組織已經通過以下簽名保護不受此漏洞影響:
MS.Windows.Code.Integrity.Module.DoS
 



熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    主站蜘蛛池模板: 无码人妻久久久一区二区三区| 亚洲中文字幕无码av| 日韩乱码人妻无码中文字幕视频 | 中文无码不卡的岛国片| 亚洲av无码一区二区三区人妖| 麻豆亚洲AV成人无码久久精品 | 亚洲级αV无码毛片久久精品| av无码久久久久不卡免费网站| 亚洲成A人片在线观看无码3D | 丰满少妇被猛烈进入无码| 亚洲AV无码一区二区三区国产| 精品无码国产一区二区三区AV| 国模无码一区二区三区| 无码137片内射在线影院| 极品粉嫩嫩模大尺度无码视频 | 尤物永久免费AV无码网站| 亚洲Av综合色区无码专区桃色| 亚洲Av永久无码精品黑人| 狠狠躁夜夜躁无码中文字幕| 成人麻豆日韩在无码视频| 亚洲国产成AV人天堂无码 | 无码人妻精品内射一二三AV| 久久精品中文字幕无码| 国产亚洲情侣一区二区无码AV | 亚洲熟妇无码八V在线播放| 无码专区—VA亚洲V天堂| 伊人久久综合精品无码AV专区| 无码精品前田一区二区| 无码天堂va亚洲va在线va| 无码无套少妇毛多69XXX| 无码国产精成人午夜视频不卡 | 亚洲精品午夜无码专区| 狠狠躁天天躁中文字幕无码| 手机在线观看?v无码片| 日韩电影无码A不卡| 久久久久亚洲?V成人无码| AV无码小缝喷白浆在线观看 | 亚洲日韩精品无码专区| 中文字幕日产无码| 粉嫩大学生无套内射无码卡视频 | 日本无码一区二区三区白峰美|