0x00背景
2017年11月, 微軟在例行系統補丁發佈中, 修復了一個Office遠端代碼執行的嚴重漏洞, 編號CVE-2017-11882。 該漏洞類型為緩衝區溢位, 位於EQNEDT32.EXE組件。 受害用戶打開惡意的office文檔時,
據悉, 這個元件是由Design Science Inc.開發的, 後來由微軟收購。 該組件於2001年編譯嵌入office, 之後沒有任何進一步的修改。 所以該漏洞已存在17年之久。 影響現階段流行的所有office版本。
360CERT經過分析確認, 確定該漏洞存在遠端命令執行風險, 建議用戶儘快更新相應補丁。
0x01漏洞概述EQNEDT32.EXE用於在文檔中插入和編輯方程式。 插入到文檔中的任何公式都是OLE物件。 該元件是在OLE技術規範下設計的。 首發於Microsoft Office 2000和Microsoft 2003。 從Microsoft Office 2007套件開始, 顯示和編輯方程的方法發生了變化, 雖然EQNEDT32.EXE變得過時, 不過, 為了保持版本相容性, 它並沒有從Office套件中刪除。
EQNEDT32.EXE為OLE實現了一組標準的COM介面。
IOleObject
IDataObject
IOleInPlaceObject
IOleInPlaceActiveObject
IpersistStorage
而問題的就在於IpersistStorage:Load這個位置。 因為歷史久遠, 該元件開發的時候並沒有例如ASLR這樣的漏洞緩解措施。
檢測到VirusTotal上有該漏洞的POC, 多家檢測機構標注為CVE-2017-11882。 (最開始只有微軟能檢測)
如上所說, 通過惡意樣本分析, 問題出在EQNEDT.EXE中sub_41160F函數中。 如圖所示, strcpy函數沒有檢查複製時的長度造成了溢出。
通過調試可以猜測在正常情況下eax寄存器也就是第一個參數應該是字體名。
通過rtfobj抽取樣本中的OLE物件, 發現字體名為cmd.exe……。
在填充的AAA……之後是0x430C12, 也就是EQNEDT.EXE中調用WinExec的地方。
返回位址被覆蓋為0x430C12, 從而執行命令。
最後執行效果:
Office 365
Microsoft Office 2000
Microsoft Office 2003
Microsoft Office 2007 Service Pack 3
Microsoft Office 2010 Service Pack 2
Microsoft Office 2013 Service Pack 1
Microsoft Office 2016
0x04修復建議360CERT建議用戶及時更新補丁, 以提高系統安全性。
緩解措施:該問題可通過修改註冊表, 禁用該模組的方式進行緩解。 其中XX.X為版本號。
1reg add "HKLMSOFTWAREMicrosoftOfficeXX.XCommonCOM Compatibility{0002CE02-0000- 0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x4001reg add "HKLMSOFTWAREWow6432NodeMicrosoftOfficeXX.XCommonCOM Compatibility{0002CE02-0000-0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x4000x05時間線2017年11月14日 微軟發佈安全更新
2017年11月20日 Github放出利用代碼
2017年11月21日 360CERT及時跟緊發佈預警通報
0x06參考文檔https://github.com/embedi/CVE-2017-11882
https://embedi.com/blog/skeleton-closet-ms-office-vulnerability-you-didnt-know-about
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11882