作者:yyjb, redrain@360高級攻防實驗室
原文鏈接:http://noahblog.#/cve-2020-0687_analysis/

3月23日,微軟公司發布了一份編號ADV200006的緊急漏洞通告,通告表示有在野攻擊行動使用了位于Adobe Type Manager Library中的兩個遠程代碼執行0Day漏洞,由于漏洞嚴重,發布該通告指導用戶在補丁發布前規避風險。

4月15日的補丁日中,微軟發布了針對此風險通告的補丁外,還對一個字體庫漏洞CVE-2020-0687進行修復,諾亞實驗室第一時間對補丁進行了比對分析,并確認了漏洞的利用性,兩個漏洞均屬于高危遠程代碼執行漏洞,由于CVE-2020-0938/CVE2020-1020已有安全團隊驗證并形成POC,本文將會著筆于vincss報告的CVE-2020-0687進行簡要技術分析。

img

根本原因

漏洞產生于字體處理庫fontsub.dll的ReadTableIntoStructure中,由于循環邏輯中讀取數據賦值檢查不嚴格,在數據拷貝到目的堆后超過原申請的堆內存大小,形成堆溢出漏洞。

補丁細節分析

通過補丁比對,我們很快確認了問題函數

__int64 __fastcall ReadTableIntoStructure(__int16 *a1, _WORD *a2, unsigned __int16 *a3)

img

通過前后差異判別,可以看出補丁代碼將while循環的一個返回條件放到了循環入口處,其目的是為了防止當變量v5中的變量大于v3[4]中保存的的變量時,會執行一次while循環的第一句賦值代碼。

img

故原始漏洞代碼中存在判斷不嚴謹的情況,將會導致ReadGeneric中讀取到的4字節數據,放入至一個結構體數組中:

img

通過跟蹤v3和v5返回上層調用函數可知,v3在上層函數MergeEblcEbdtTables中,是作為一個從新申請的堆內存的大小參數進行傳遞的;而v5則是作為ReadTableIntoStructure中第三個參數,可以理解為一個類似Table大小的變量。

而此處的堆空間大小則是由v92來決定,根據跟蹤的情況,v92將由漏洞觸發函數中的v3[4]確定:

img

由于漏洞觸發點的while循環語句中首句代碼作用是向這個堆數組添加從ReadGeneric讀取的數據,若我們控制v5變量大于v3[4]時,將會導致拷貝到目的堆中數據超過申請堆內存的最大值+16,ReadGeneric中所讀取的數據將會覆蓋到已申請堆空間后置位+16個字節中的4個字節數據,從而形成明顯的堆溢出。

構造思路

我們通過跟蹤漏洞觸發函數可以發現,該觸發所屬模塊用于處理MergeFonts字體,通過對應的table類型(EblcEbdt Tables)也可以輕松找到漏洞觸發函數路徑。

img

通過查閱MergeFonts結構信息,可精心構造相應字體控制上述覆蓋,形成常規堆溢出利用。

修復

img

如上圖示,微軟的修復方案是通過判斷v5和v3[4]的比值大小,避免ReadGeneric讀取值覆蓋。

漏洞影響

該漏洞影響面極大,以下為漏洞影響的操作系統版本:

Windows 10 for 32-bit Systems
Windows 10 for x64-based Systems Windows 10 Version 1607 for 32-bit Systems
Windows 10 Version 1607 for x64-based Systems
Windows 10 Version 1709 for 32-bit Systems
Windows 10 Version 1709 for ARM64-based Systems
Windows 10 Version 1709 for x64-based Systems
Windows 10 Version 1803 for 32-bit Systems
Windows 10 Version 1803 for ARM64-based Systems
Windows 10 Version 1803 for x64-based Systems
Windows 10 Version 1809 for 32-bit Systems
Windows 10 Version 1809 for ARM64-based Systems
Windows 10 Version 1809 for x64-based Systems
Windows 10 Version 1903 for 32-bit Systems
Windows 10 Version 1903 for ARM64-based Systems
Windows 10 Version 1903 for x64-based Systems
Windows 10 Version 1909 for 32-bit Systems
Windows 10 Version 1909 for ARM64-based Systems
Windows 10 Version 1909 for x64-based Systems
Windows 7 for 32-bit Systems Service Pack 1
Windows 7 for x64-based Systems Service Pack 1
Windows 8.1 for 32-bit systems
Windows 8.1 for x64-based systems
Windows RT 8.1
Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)
Windows Server 2008 for Itanium-Based Systems Service Pack 2
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)
Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2012
Windows Server 2012 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation)
Windows Server 2016
Windows Server 2016 (Server Core installation)
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1803 (Server Core Installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)

修復建議

由于該漏洞還涉及到已經停止服務的win7系統,我們建議Windows用戶及早進行修復,相關建議如下:

通過微軟補丁頁面尋找對應操作系統的補丁,進行手工修復
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0687
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0938
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1020

或通過360安全衛士實現對應操作系統補丁自動修復。

http://www.#/brain_of_security/


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1717/