PDF漏洞(CVE-2018-12794)淺析
CVE-2018-12794屬於類型混淆漏洞,產生漏洞原因是通過構建XML數據包(XML Data Package,XDP)模版,並對XML表單體系結構(XML Forms Architecture,XFA)對象執行某些JavaScript操作,***者就可以強制Adobe Reader從模版對象的邊界引用數據。
2018年7月份,Adobe補丁更新:
漏洞基本信息
漏洞ID:CVE-2018-12794
漏洞名稱:PDF類型混淆漏洞
漏洞類型:遠程代碼執行
威脅類型:類型混淆
影響版本:影響2018.011.20040及之前版本
漏洞測試
系統環境:Win7 32
Adobe Reader:2018.011.20040
PoC:https://github.com/thezdi/PoC/tree/master/CVE-2018-12794
PoC分析
XML Data Package(XDP)是Adobe Systems創建的XML 文件格式。該格式允許將PDF內容或Adobe XML Forms Architecture(XFA)資源打包在XML 容器中。XDP符合XML 1.0的規範,可以作為獨立文檔,也可以在PDF文檔中攜帶。XDP提供了一種在XML容器中打包表單組件的機制,XDP還可以打包PDF文件以及XML表單和模板數據。
第1個object流對象裏面的XFA(XML Forms Architecture)對象會執行Java代碼,該代碼會操作sub1和sub2,先將sub1添加為xfa.template對象,sub2添加為xfa.from對象,然後將sub2附加到sub1。
最後執行Java代碼將o2的presence屬性設置為inactive ,該屬性的含義為隱藏對象並將其從事件處理中排除。在執行該操作的時候將觸發crash。
調試分析
通過gflags 開啟頁堆後,用Windbg附加Adobe Acrobat DC打開PoC文件。程序會停在發生crach的位置。
從上面調試信息中可以看到,異常出現在AcroForm.api模塊,ecx的值異常導致程序crash,通過棧回溯可以定位到crash的上一層函數AcroForm!PlugInMain+0x979f1,反匯編該函數並觀察ecx的值(ecx的值是直接傳入crash函數使用)。
反匯編代碼後發現ecx的值來自[eax+esi*8],而esi只是一個偏移且為0,故ecx的值與eax有關,來自[edi+1d4h]。該地址的值是一些字符串,由此推測,是把該字符串的值當成了指針來引用,從而導致crash。
經多次調試發現[edi+1d4h]每次的值都不同,這個地址的值是未知的,如下圖。
使用堆命令查看edi所在的空間大小為140h,猜測是一個對象指針或者一塊申請的內存空間,而[edi+1d4h]顯然已經是越界訪問。
從代碼中知道為XFA對象,參考《SyScan3602016-_Pwning_Adobe_Reader_with_XFA》報告
中給出的關於XFA內部對象的識別辦法獲取Type-IDs。使用uf poi(poi(對象地址)+8)的命令可以顯示出Type-IDs。
可以看到類型為7C00h,說明了該堆塊保存的就是一個XFA對象。
通過交叉引用得到 XFATemplateModelImpl 的虛表,再通過交叉引用構造函數就能找到這個對象大小為 140h 字節。
在XFATemplateModelFactoryImpl::newModel函數中可以看到申請了140h字節的空間,從函數名猜測這裏是new一個大小為140h的Template對象。
在虛表進行交叉引用可定位到相應的初始化Form對象的地址,Form對象申請的空間大小是270h, [edi+1d4h]的地址實際應該是讀取的Form對象中的值,Template對象大小是140h,所以漏洞的根本原因是代碼在處理Template對象時使用了Form對象的函數進行處理,造成了類型混淆漏洞。
參考資料
https://github.com/siberas/arpwn/blob/master/slidedecks/SyScan360_2016_-_Pwning_Adobe_Reader_with_XFA.pdf
https://xz.aliyun.com/t/4262
http://blogs.adobe.com/formfeed/2009/03/xfa_30_presenceinactive.html
更多漏洞播報:四維創智
PDF漏洞(CVE-2018-12794)淺析