[翻译]Win10 CloudExperienceHostBroker COM对象导致提权

> 原文作者：forshaw@google.com
> 原文链接：https://bugs.chromium.org/p/project-zero/issues/detail?id=2051
> 译者：Y4er 水平有限，如有错误请及时反馈

Win10中计划任务中存在CloundExperienceHostBroker托管普通用户可以访问的不安全COM对象，从而导致特权提升。

# 复现
下载源码 https://bugs.chromium.org/p/project-zero/issues/attachment?aid=449687&signed_aid=Zh89DlsWY5cj_V-HXxphCQ== 

编译项目生成exe（关注公众号回复**20200909**获取已经编译好的EXP），测试系统版本 Win10 1909 18363.592
这里公众号后台设置自动回复 https://cloud.189.cn/t/zuyUNbrQZzqm（访问码：ilj5）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/296884d9-b47b-c536-5c1c-57e39bda6c6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/528f46a7-8a58-3f67-deaf-9b71435b76f5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/548066ff-0b22-7e02-1ae7-b3eaa0eedc9b.png)

管理员用户名**宋冬** 密码为空


# 挖掘

在Win10的默认安装中存在一个计划任务 `\Microsoft\Windows\CloudExperienceHost\CreateObjectTask`，该计划任务会用SYSTEM权限创建一个进程托管com类 `CloudExperienceHost Create System Object Server / f7fa3149-91e7-43b7-8040-b707688ced1a`。这是一个通用的COM代理，用于为用户提供在SYSTEM运行的类，以配置诸如OOBE和Retail Demo之类的东西。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/5c93133a-542f-85f3-fbd5-2d00323aa017.png)

只要计划的任务和COM服务器都经过适当的ACL，这本身就不会成为问题。不幸的是，他并没有做ACL。计划任务可以由普通用户启动，并且COM服务器（f7fa3149-91e7-43b7-8040-b707688ced1a）在其AppID（f7fa3149-91e7-43b7-8040-b707688ced1a）中未指定限制性启动权限。 使用默认值授予INTERACTIVE组访问权限。

通常来讲，尽管INTERACTIVE可以创建新实例，但默认的访问权限仅会授予Administrators和SELF SID（即SYSTEM）访问权限。 但是，不知道是bug还是由于设计而定，当CloundExperienceHostBroker进程调用CoInitializeSecurity时，它都会使用不同的AppID（efe2d6d8-a81b-41e7-ae77-e5244ab80522），该ID也会授予 INTERACTIVE 访问权限。 最终结果是普通的非特权用户可以通过计划任务启动COM服务器，激活新实例并访问生成的COM服务器。

同样，只要COM服务器没有做任何危险的事情，这也不是问题。 COM服务器出售通用的ICreateObject接口，该接口允许用户传递要创建的CLSID。 代理将仅创建在`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudExperienceHost\Broker\ElevatedClsids`中注册的类，在Windows 10 1909中为以下类。

|                ClsID                 | desc                                             |
| :----------------------------------: | :----------------------------------------------- |
| 0316bbc2-92d9-4e2e-8345-3609c6b5c167 | CloudExperienceHost Diagnostics Elevated Manager |
| 06dc6740-fd0d-426a-9bf6-20ddbd7d53ce |                                                  |
| 0b26fe8c-9e57-48ff-ad9f-3084ef402443 | ProvOperationsCleanContext                       |
| 1c308b42-b4b4-42ad-864c-48440c12b7a5 |                                                  |
| 1ee026d0-f551-4c71-aea2-f9897b159eaf | User OOBE Controller Auto Elevated               |
| 2134da04-4faa-42ed-ada2-43707b4e1de1 |                                                  |
| 2b2cad40-19c1-4794-b32d-397e41d5e8a7 | User OOBE Controller                             |
| 2c012f55-1318-44f4-a235-20c4df918fb3 | Cloud Domain Join OS Upgrade Helper              |
| 3a965ed4-0e14-4a1b-a71e-972f1c1044f6 | CloudExperienceHost Util Elevated Manager        |
| 40afa0b6-3b2f-4654-8c3f-161de85cf80e | Connected User Store                             |
| 4c1b3c1d-5c78-4a73-be8b-de1ec4b3637e |                                                  |
| 54337179-c8b2-4ed4-95e4-95601c850d8c |                                                  |
| 558c258c-90fe-401c-8772-7edca8016d2c |                                                  |
| 6447e897-294b-409a-bf15-5f349a20f2c0 | OOBE Registered Owner                            |
| 80a90d72-a834-4f3d-ad3b-c7abbe4a0f66 | OOBE User Authentication                         |
| 973e4ce8-85a2-4207-8147-4778b50644db | Azure AD Join with Authentic User Gesture        |
| 9a31d292-655f-48f7-b5ad-553358bcd0c9 |                                                  |
| 9caf4a2e-c957-48c7-b4d2-4d11188e0b94 | OOBE Elevated Util                               |
| 9dea6e0b-8856-45d8-a424-57244aef1e3c |                                                  |
| a3987437-f1b5-4296-a7dd-6cc3a8b738b9 |                                                  |
| b742e827-ede6-400f-8312-cd522198be86 |                                                  |
| d2b3db04-b843-11e7-abc4-cec278b6b50a |                                                  |
| d2d28389-85ee-4f9c-b45f-58bd9e664976 |                                                  |
| df3460ae-d92d-40f3-b5cd-f83259936f23 |                                                  |
| df436197-c14c-4f1d-99cc-4c7bbb399a2f |                                                  |
| e1f5aa5b-065c-4e29-b454-c1bbfe0819d2 | Microsoft Account Credential Manager             |
| efeb5035-1da0-4b73-afa2-68ed7a1d98e0 | RetailInfoSetterInternal                         |
| f32fcfec-9054-470a-acee-867f2277b772 |                                                  |
| fd5a78d9-c2f5-45ff-9097-c615acd0aa51 |                                                  |


我没有遍及整个列表，但有些突出的地方包括 **Connected User Store**，它使您可以将本地帐户链接到在线帐户。**54337179-c8b2-4ed4-95e4-95601c850d8c** 公开了本地帐户管理器类。

让我们集中讨论Local Account Manager类，它具有许多接口，但是最有趣的是ILocalAccountManager。 它具有以下功能：

1. CreateAccount - 创建一个任意本地用户帐户。
2. CreateRetailDemoAccount - 创建零售演示模式的帐户。
3. UpdateRecoveryData - 更新帐户的恢复问题。

出于说明目的，CreateRetailDemoAccount将使用空密码在Administrators组中创建一个新的用户帐户。 但是，应该将其用作设置零售演示模式的一部分，如果通过“设置”应用完成此操作，则需要管理员权限。 这是一个非常琐碎的EoP：

1. 启动计划任务。
2. 创建COM服务器。
3. 创建本地帐户管理器类。
4. 调用CreateRetailDemoAccount创建管理员帐户。
5. 以该用户身份登录以获得管理员权限。

如果你可以交互式运行POC，你只需要注销重新登陆即可。如果没有用户交互，则这会有点困难，因为默认情况下您无法在没有密码的情况下进行身份验证，但是包括Connected User Store在内的其他一些类将暂时出于自身目的禁用空密码检查，因此可能存在可利用的竞争窗口，这些竞争窗口系统不执行检查，因此用户可以调用CreateProcessWithLogon创建进程，或通过LogonUser获取具有空密码的模拟令牌。

此任务的行为与我在2015年报告的先前错误（CVE-2015-2528）相似，该错误位于`Microsoft\Windows\Shell\CreateObjectTask`计划任务中。我不知道是否从那个问题中学到了什么教训。特别是，代理托管的COM类不一定设计为托管在普通用户可以访问的SYSTEM COM服务器中。 我认为将SYSTEM COM服务器隐藏在预定任务后面会产生后门的感觉。

毫无疑问应该修复INTERACTIVE组可以访问或激活系统COM服务器这点。实际上，我认为用户根本不应该甚至可以启动计划的任务。 我认为尝试并“修复”托管的COM类并不是一种彻底的解决方案。

# PoC证明

我提供了C＃项目作为PoC。 它将创建一个管理员零售演示用户，该用户将成为管理员。 它不会再尝试使用该用户，但是您可以清楚地看到它已被添加。 如果您真的要测试它，则只需注销并以新用户身份重新登录。

1）编译C＃项目。
2）以普通用户身份运行PoC。
3）检查Administrators组的成员。

预期结果：
无法访问SYSTEM COM服务器。

观察结果：
已访问SYSTEM COM Server，并且创建了用户"Darrin DeYoung"，该用户是Administrators组的成员。