當前位置:
首頁 > 新聞 > Microsoft Windows JET資料庫引擎堆溢出漏洞CVE-2018-1003分析

Microsoft Windows JET資料庫引擎堆溢出漏洞CVE-2018-1003分析

2017年底,FortiGuard Labs團隊發現Microsoft Windows JET資料庫引擎中存在堆溢出漏洞,並依據Fortinet的披露流程向微軟報告。2018年4月10日,Microsoft發布了一個包含此漏洞修復程序的公告,並將其標識為CVE-2018-1003。

Microsoft JET資料庫引擎的動態鏈接庫msexcl40.dll中存在此堆溢出漏洞,該鏈接庫歷史悠久。它最初是在Windows XP中引入的,並且是從Windows 7到Windows 10的所有Windows系統的組件。

我發現的這個漏洞可以通過精心製作的Excel文件觸發。當Excel使用指向精心製作的Excel文件的外部數據源ODBC Connect解析文件時,將執行長度不正確的堆複製操作。因此,由於邊界檢查不足,目標堆緩衝區溢出。

在本博客中,我想分享一下我對這個漏洞的詳細分析。

分析

要重現此堆溢出漏洞,需在Excel中打開ODBC外部數據源,設置ODBC連接字元串為「DRIVER = ; DBQ = c: poc poc.xls」。然後可以看到Excel因此崩潰。PoC文件poc.xls可以放入任何本地文件夾或SMB共享。

以下是發生崩潰時的調用堆棧。

圖1. 崩潰時的調用堆棧

從上面的調用堆棧輸出中,我們可以看到崩潰發生在函數msexcl40!memcpy中,該函數被函數msexcl40!ExcelMIReadRecord調用。

目標堆內存的地址是0x0766efdc,分配的大小是0x202C。目標堆是通過調用函數RtlpAllocateHeap來分配的。

通過逆向和追蹤,我們可以看到函數_ExcelScanFile @ 12的調用導致崩潰。

在多次調用函數_ExcelReadTotalRecord之後,可以通過計算第一個參數edi來確定堆複製的實際大小為poi(poi(poi(edi + 28h)+8)+4),這是一個HIWORD。跟蹤程序,最後可以看到堆複製的大小由PoC文件中的三個鏈接列表節點確定。

圖2顯示了PoC文件中的第一個鏈接列表節點。

圖2.PoC文件中的第一個鏈接列表節點

第一個鏈接列表節點的大小為0x1014,在圖2中突出顯示。由此可以獲得第二個鏈接列表節點,其偏移量從0x1373 + 0x1014 = 0x2387開始。

圖3.PoC文件中的第二個鏈接列表節點

第二個鏈接列表節點的大小為0x08,在圖3中突出顯示。由此我們可以得到第三個鏈接列表節點,其偏移量從0x238B + 0x08 = 0x2393開始。

同樣從圖3中,我們可以看到第三個鏈接列表節點的大小為0x2604,位於文件偏移0x2395處,此值為目標堆memcpy的size。從前面的分析中我們已經知道,目標堆分配的大小為0x202c(當整個頁堆未啟用時,大小由!heap -x 0x0766efdc確定)。結果,堆緩衝區溢出發生。

從上面的分析中,我們可以看到堆溢出的根本原因是位於PoC文件偏移0x1372處錯誤的大小值0x1014,正確的值應該是0x14。因此,格式錯誤的大小值導致第二個鏈接列表節點的位置錯誤,第三個鏈接列表節點也位於錯誤位置,導致memcpy時的參數size為無效的0x2604,而目標堆只分配了0x202c。由於邊界檢查不足,發生堆溢出。成功利用此漏洞可能會導致遠程執行代碼。

解決方案

所有存在漏洞的Microsoft Windows用戶請升級到最新的Windows或應用最新的補丁。此外,已部署Fortinet IPS解決方案的機構已經通過簽名MS.JET.Database.Engine.Heap.Overflow免受此漏洞的影響。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

F5做負載均衡時,如何通過修改cookie查找敏感信息
又一次大規模數據泄露事件上演,1.5億MyFitnessPal用戶的數據被泄漏

TAG:嘶吼RoarTalk |