ShellExperienceHost.exe 是 Windows 10 操作系统中的一个系统进程,它负责管理和运行一些用户界面相关的功能和效果。具体来说,ShellExperienceHost 主要有以下作用:
ShellExperienceHost.exe(Windows Shell Experience Host)完整解构
路径:
C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy\ShellExperienceHost.exe定位:UWP 应用容器 (AppContainer) 宿主进程,XAML 现代 UI 渲染容器,负责承载 Windows 外壳的现代弹出 UI(通知中心、快速设置、时钟 / 网络 / 电池 Flyout、任务栏跳转列表、动态壁纸、 accent 色彩);Win11 新版 24H2 起部分功能迁移到ShellHost.exe,ShellExperienceHost 逐步缩减职责。 安全身份:AppContainer 隔离容器,低权限沙箱 S-1-15-2-xxx,不是管理员 / SYSTEM,通过 DCOM/LRPC 和 explorer、RuntimeBroker 通信。
一、底层原理
核心架构
- AppContainer 沙箱模型:进程启动时由 RuntimeBroker 创建 AppContainer 隔离环境,强制资源隔离、文件 / 注册表 / COM 对象访问受限;所有 UI 组件运行在这个低权限容器内。
- XAML UI 渲染引擎:基于
Microsoft.UI.Xaml,负责绘制现代 Win10/11 的非 Win32 原生弹出 UI。 - 组件 DLL 插件化:功能拆分为独立 DLL,按需加载,每个 Flyout 对应单独模块,单个模块崩溃不会直接全盘干掉整个进程(进程会自动重启)Microsoft ...。
- COM/DCOM+LRPC 跨进程通信:和
explorer.exe、RuntimeBroker.exe、DcomLaunch、audiodg.exe使用本地 ORPC (LRPC)调用;经典 10016 DCOM 警告就来自 ShellExperienceHost AppContainer 尝试调用其他 COM 组件权限不足(仅日志警告,功能不中断)。 - 进程挂起机制:空闲时 Windows 内存管理器将进程Suspend 挂起(任务管理器绿色叶子图标),释放内存;触发 UI 弹出时自动恢复运行,属于正常性能优化。
承载 UI 模块清单
| DLL | 功能 |
|---|---|
| StartUI.dll | 开始菜单相关现代 UI |
| ClockFlyoutExperience.dll | 任务栏时钟、日历弹出面板 |
| NetworkUX.dll | 网络 / 无线 Flyout |
| BatteryFlyoutExperience.dll | 电池弹窗 |
| Windows.UI.ActionCenter.dll | 通知中心、Toast 通知 |
| JumpviewUI.dll | 任务栏右键跳转列表 (JumpList) |
二、依赖文件 & 依赖关系
主二进制依赖
| 文件 | 作用 |
|---|---|
ShellExperienceHost.exe |
主宿主程序入口 |
combase.dll / ole32.dll |
COM/DCOM、LRPC 调用,DcomLaunch 激活 |
rpcrt4.dll |
RPC/LRPC 传输层 |
Microsoft.UI.Xaml.dll |
XAML 渲染引擎(CBS 框架包) |
uxtheme.dll |
Windows 主题、亚克力 / 云母材质 |
d2d1.dll / dwrite.dll |
Direct2D 渲染、字体绘制 |
runtimebroker.exe |
强依赖,UWP 容器管理器,创建 AppContainer、权限代理、资源访问中转 |
explorer.exe |
外壳主进程,接收用户点击事件,通知 ShellExperienceHost 唤起 Flyout |
内核依赖
ntoskrnl.exe:进程创建、AppContainer 安全隔离、内存管理、挂起恢复win32k.sys:窗口消息、GDI / 窗口渲染dxgkrnl.sys:DirectX 图形渲染tcpip.sys:Toast 通知联网(天气、推送通知)
注册表依赖
HKCR\AppID\{ShellExperienceHost AppID}:DCOM 本地激活权限、AppContainer 安全描述符HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel:UWP 包注册信息HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell:沉浸式外壳全局配置HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer:用户外壳个性化(动态壁纸、主题色)
包依赖(UWP Appx 包)
Microsoft.Windows.ShellExperienceHost 系统 Appx 包;依赖 CBS 框架包: MicrosoftWindows.Client.CBS、Microsoft.UI.Xaml.CBS、MicrosoftWindows.Client.Core
三、调用链 & 逻辑链路
场景:点击任务栏时钟,唤起日历弹窗
用户点击任务栏时钟 → explorer.exe捕获鼠标点击
↓
explorer通过LRPC(DCOM)调用 ShellExperienceHost
↓
RuntimeBroker校验AppContainer权限,启动/恢复ShellExperienceHost进程(若挂起)
↓
ShellExperienceHost加载 ClockFlyoutExperience.dll
↓
XAML引擎渲染日历Flyout界面(Direct2D绘制)
↓
用户交互事件回传给ShellExperienceHost
↓
关闭弹窗 → 窗口销毁,进程保持一段时间,超时后被系统挂起Suspend
场景:系统弹出 Toast 通知
系统通知平台 → RuntimeBroker → LRPC调用ShellExperienceHost
↓
Windows.UI.ActionCenter.dll加载,渲染通知弹窗
↓
通知音频请求 → LRPC调用audiodg.exe(此处常触发DCOM 10016警告)
进程启动链路(登录时)
用户登录 → explorer.exe启动
↓
RuntimeBroker(UWP代理)通过DcomLaunch激活ShellExperienceHost AppID
↓
DcomLaunch校验AppID启动ACL
↓
创建进程,挂载AppContainer安全令牌,初始化XAML运行时
↓
进入等待消息循环,空闲后自动挂起
关键边界:ShellExperienceHost 不负责任务栏本身渲染;任务栏主体是 explorer,仅弹出悬浮面板由 ShellExperienceHost 承载。
四、配套链(工具、事件、取证、管理)
管理 / 排错工具
Get-AppxPackage *ShellExperienceHost*:PowerShell 查看 UWP 包状态Add-AppxPackage -Register:重新注册 ShellExperienceHost 包(修复损坏)- 事件查看器:
Microsoft-Windows-ShellExperienceHost事件日志;DCOM 日志(10016) - 任务管理器:查看进程挂起状态、内存 CPU 占用
事件日志
- ShellExperienceHost 事件:进程启动、崩溃、UI 渲染失败
- DCOM 事件 ID 10016:AppContainer 权限不足(经典无害警告)
- 应用程序错误日志:
0xc0000005访问违例(XAML 组件损坏常见)
关联进程生态
- RuntimeBroker.exe:UWP/AppContainer 权限代理(强绑定)
- explorer.exe:Windows 外壳主进程,UI 事件发起方
- DcomLaunch (svchost):DCOM 激活器,负责拉起 ShellExperienceHost
- audiodg.exe:音频引擎,通知提示音调用目标
- StartMenuExperienceHost.exe:独立开始菜单宿主(Win10/11 拆分)
五、边界、限制、安全边界
✅ 功能边界
- 职责仅承载 XAML 悬浮弹出 UI;桌面、任务栏主窗口、文件资源管理器窗口属于 explorer,不归 ShellExperienceHost。
- 进程模型:多实例可存在;空闲自动 Suspend,不是常驻全速运行。
- Win11 24H2 + 演进:快速设置面板迁移到
ShellHost.exe,ShellExperienceHost 逐步裁剪,仅保留通知、Flyout。 - AppContainer 隔离:默认无法直接访问用户完整文件系统、注册表,必须通过 RuntimeBroker 代理访问资源。
- 崩溃自愈:进程异常崩溃,explorer 会自动重新拉起,不需要重启资源管理器。
⚠️ 安全边界(攻防 / 取证重点)
- 低权限 AppContainer 沙箱,默认不能直接提权;攻击面集中在 XAML 渲染引擎、DCOM 接口、RuntimeBroker 代理通道。
- DCOM 本地激活:仅本机 LRPC,不开放远程 DCOM,无 135 远程调用入口。
- 10016 DCOM 警告:仅日志审计,不会造成功能失效,是 AppContainer 尝试访问 COM 对象被 ACL 拒绝,不是漏洞。
- 恶意伪装风险:恶意程序伪装同名 exe,判断依据:路径必须位于
SystemApps\ShellExperienceHost_xxx,带微软数字签名。
❌ 技术局限
- 不能直接终止 / 卸载:属于系统受保护 Appx 包;强行结束进程会丢失通知、Flyout 面板。
- 依赖 XAML CBS 框架包,Windows 更新损坏 CBS 包会直接导致进程反复崩溃、通知 / 时钟面板空白。
- 高 DPI、多显示器场景容易出现 XAML 渲染错位、闪烁。
取证边界
- 进程树:父进程通常为 RuntimeBroker.exe;DcomLaunch 作为激活源头。
- 事件日志:可审计通知弹出、Flyout 打开、进程崩溃记录。
- 内存取证:进程内存中存在 Toast 通知、时钟 / 网络 UI 界面文本。
- 注册表:AppID 记录,审计 DCOM 本地激活权限。
六、横向对比:ShellExperienceHost / StartMenuExperienceHost / Sihost / ShellHost
| 进程 | 核心职责 | 隔离模型 |
|---|---|---|
| ShellExperienceHost | 通知、时钟 / 网络 / 电池 Flyout、JumpList | AppContainer UWP 容器 |
| StartMenuExperienceHost | 新版开始菜单独立宿主 | AppContainer |
| Sihost.exe(Shell Infrastructure Host) | 桌面背景、个性化、启动动画 | 普通用户令牌,非 AppContainer |
| ShellHost.exe(Win11 24H2+) | 快速设置面板 | XAML 宿主,替代部分 ShellExperienceHost 功能 |
ShellExperienceHost AppID DCOM 安全描述符 SD 二进制解析
前置背景:ShellExperienceHost 的 AppID 用于本地 DCOM 激活(LRPC,无远程 DCOM),DCOM AppID 下存储两个独立安全描述符 SD:
LaunchPermission:启动权限 SD(DcomLaunch 校验,能不能拉起该 App 的 COM 服务)AccessPermission:访问权限 SD(进程启动后,调用 COM 接口的访问控制) 注册表路径:HKLM\SOFTWARE\Microsoft\COM3\AppID\{ShellExperienceHost的APPID-GUID}键名:LaunchPermission/AccessPermission,类型REG_BINARY,存储二进制安全描述符 SECURITY_DESCRIPTOR。
ShellExperienceHost AppID GUID:
{44692c78-79ac-4514-8193-0b8e0c45741c}
一、Windows SECURITY_DESCRIPTOR 通用二进制结构(SD 头)
安全描述符自相关二进制格式(绝对 SD,DCOM 注册表存储用自相对 SD Self-Relative SD,所有偏移量相对于 SD 自身起始地址)
| 偏移 | 字节 | 字段 | 含义 |
|---|---|---|---|
| 0x00 | 1 | Revision | 版本号,固定0x01 |
| 0x01 | 1 | Sbz1 | 保留填充,0x00 |
| 0x02 | 2 | Control | SD 控制标志位(SECURITY_DESCRIPTOR_CONTROL) |
| 0x04 | 4 | OffsetOwner | Owner SID 偏移;0 = 无 Owner |
| 0x08 | 4 | OffsetGroup | Group SID 偏移;0 = 无 Group |
| 0x0C | 4 | OffsetSacl | SACL 偏移;0 = 无 SACL |
| 0x10 | 4 | OffsetDacl | DACL 偏移;0 = 无 DACL |
Control 标志位常见掩码:
0x0001SE_OWNER_DEFAULTED0x0002SE_GROUP_DEFAULTED0x0004SE_DACL_PRESENT 存在 DACL(DCOM SD 必设)0x0008SE_DACL_DEFAULTED0x0010SE_SACL_PRESENT 存在 SACL(审计 ACL)0x8000SE_SELF_RELATIVE ✅ 自相对 SD,注册表 DCOM SD 固定开启
DCOM AppID LaunchPermission/AccessPermission 几乎全部是 Self-Relative SD。
DACL 结构(DACL 在 SD 内偏移 OffsetDacl 指向)
| 偏移 (相对于 DACL 起始) | 字节 | 字段 | 说明 |
|---|---|---|---|
| 0x00 | 1 | Revision | ACL 版本,0x02 |
| 0x01 | 1 | Sbz1 | 保留 0 |
| 0x02 | 2 | AclSize | ACL 总字节长度 |
| 0x04 | 2 | AceCount | ACE 条目数量 |
| 0x06 | 2 | Sbz2 | 保留 0 |
| 0x08 | 变长 | ACE 数组 | ACE 访问控制条目列表 |
ACE(Access Control Entry,DCOM 最核心)
DCOM 使用ACCESS_ALLOWED_ACE(允许 ACE)为主:
| 偏移 | 字节 | 字段 | 含义 |
|---|---|---|---|
| 0x00 | 1 | AceType | 0x00 = ACCESS_ALLOWED_ACE;0x01=ACCESS_DENIED_ACE |
| 0x01 | 1 | AceFlags | 继承标志,DCOM AppID ACE 一般 0x00 |
| 0x02 | 2 | AceSize | ACE 整条长度 |
| 0x04 | 4 | Mask | 访问权限掩码(DCOM 专用权限位) |
| 0x08 | 变长 | SID | 主体 SID(用户 / 组 / 虚拟账户) |
二、DCOM 专用权限掩码(LaunchPermission / AccessPermission 区分)
DCOM 定义两套独立权限位集合:启动权限掩码、访问权限掩码
LaunchPermission(启动权限,DcomLaunch 校验)
| 掩码 | 名称 | 说明 |
|---|---|---|
| 0x00000001 | COM_RIGHTS_EXECUTE | 允许激活(核心:启动 DCOM 服务) |
| 0x00000002 | COM_RIGHTS_EXECUTE_LOCAL | 本地激活 |
| 0x00000004 | COM_RIGHTS_EXECUTE_REMOTE | 远程激活 |
| 0x00000008 | COM_RIGHTS_ACTIVATE_LOCAL | 本地激活附加位 |
| 0x00000010 | COM_RIGHTS_ACTIVATE_REMOTE | 远程激活附加位 |
ShellExperienceHost:无远程激活权限,ACE Mask 不会包含
0x00000004 / 0x00000010。仅本地激活。
AccessPermission(访问权限,COM 对象调用)
| 掩码 | 名称 | 说明 |
|---|---|---|
| 0x00000001 | COM_RIGHTS_EXECUTE | 调用 COM 接口方法 |
| 0x00000002 | COM_RIGHTS_EXECUTE_LOCAL | 本地调用 |
| 0x00000004 | COM_RIGHTS_EXECUTE_REMOTE | 远程调用 |
三、ShellExperienceHost AppID SD 预期 ACE 主体 SID 清单
ShellExperienceHost 的 AppID LaunchPermission 默认 DACL ACE 条目:
NT AUTHORITY\SYSTEMS-1-5-18:完全本地启动权限BUILTIN\AdministratorsS-1-5-32-544:本地启动权限- ALL APPLICATION PACKAGES
S-1-15-2-1:AppContainer 包通用 SID(关键!允许 UWP/AppContainer 主体激活) - 交互式登录用户
NT AUTHORITY\INTERACTIVES-1-5-4:当前登录桌面用户可激活
重点:
S-1-15-2-1是所有应用包SID,这是 ShellExperienceHost 允许 RuntimeBroker/AppContainer 环境触发 DCOM 本地激活的核心 ACE。 ❌ 默认没有Everyone(S-1-1-0)ACE,默认不开放匿名 / 所有人。 ❌ 不存在远程激活 ACE(没有 COM_RIGHTS_ACTIVATE_REMOTE)。
四、完整二进制解析样例(示例,不同 Windows 版本字节会略有差异)
示例二进制(REG_BINARY LaunchPermission)
01000000 14000000 18000000 34000000 04000000 02001C00 03000000 ...
- SD Header:
- Revision=0x01,Sbz1=0x00
- Control =
0x8004→SE_SELF_RELATIVE | SE_DACL_PRESENT - OffsetOwner=0,OffsetGroup=0,OffsetSacl=0,OffsetDacl=0x14
- 跳转到 0x14 读取 DACL:
- ACL Revision=0x02,AclSize,AceCount=4(4 条 ACE)
- ACE #1:ACCESS_ALLOWED_ACE,Mask=
0x0000000b(COM 本地激活),SID:S-1-5-18(SYSTEM) - ACE #2:ACCESS_ALLOWED_ACE,Mask=
0x0000000b,SID:S-1-5-32-544(管理员组) - ACE #3:ACCESS_ALLOWED_ACE,Mask=
0x0000000b,SID:S-1-15-2-1(所有应用包) - ACE #4:ACCESS_ALLOWED_ACE,Mask=
0x0000000b,SID:S-1-5-4(INTERACTIVE)
Mask
0x0B=0x01 | 0x02 | 0x08:COM_RIGHTS_EXECUTE + EXECUTE_LOCAL + ACTIVATE_LOCAL,无远程激活位。
五、解析工具链(提取并解析 SD 二进制)
1. 读取注册表原始 REG_BINARY
$appid = "{44692c78-79ac-4514-8193-0b8e0c45741c}"
$regPath = "HKLM:\SOFTWARE\Microsoft\COM3\AppID\$appid"
$launchBin = Get-ItemPropertyValue -Path $regPath -Name LaunchPermission
$accessBin = Get-ItemPropertyValue -Path $regPath -Name AccessPermission
# $launchBin 就是SD原始字节数组
2. 解析工具
- OleViewDotNet(首选 COM/DCOM 分析工具) 打开 → 找到 AppID
{44692c78-79ac-4514-8193-0b8e0c45741c}→ 查看 Security,直接可视化解析 Launch/Access SD,展开 DACL/ACE/SID。 ConvertFrom-SecurityDescriptor第三方 PowerShell 模块(解析原始 SD 字节)- 010 Editor:加载二进制字节,使用 Security Descriptor 模板解析 Self-Relative SD。
sdshow.exe(微软旧工具)输入原始 SD blob,解码 SID 与 ACE。
六、边界、取证与经典 10016 DCOM 错误根源
边界要点
- LaunchPermission SD:DcomLaunch 在激活阶段校验;RuntimeBroker 请求拉起 ShellExperienceHost,DcomLaunch 读取此 SD,检查请求令牌是否匹配 DACL ACE。
- AccessPermission SD:ShellExperienceHost 进程启动后,COM 运行时(combase)校验后续 LRPC 接口调用。
- ShellExperienceHost AppID SD不允许远程激活:DACL 没有 COM_RIGHTS_ACTIVATE_REMOTE 位,外部网络无法通过 DCOM 远程激活这个 AppID。
10016 DCOM 事件来源
事件 10016:调用方主体不在 AccessPermission 的 DACL 允许列表。 场景:ShellExperienceHost (AppContainer SID) 尝试调用其他外部 COM 对象,对方 COM 对象的 AccessPermission SD 不包含该 AppContainer SID,触发拒绝,写入 DCOM 10016 日志。
⚠️ 区分:10016 不是 ShellExperienceHost 自身 AppID 的 SD 拒绝,是 ShellExperienceHost 作为客户端访问别的 COM 服务,对方 SD 拒绝。
取证要点
- 导出
LaunchPermission/AccessPermissionREG_BINARY blob,离线解析 SD,审计是否被篡改(例如恶意添加 Everyone ACE,开启远程激活)。 - 对比基线 SD:系统原版 ShellExperienceHost AppID SD不存在远程激活权限;一旦出现
COM_RIGHTS_ACTIVATE_REMOTE(0x10),属于异常篡改。 - 自相对 SD 是二进制存储,备份镜像中可直接提取注册表 hive 内的 SD blob(含注册表 slack 残留),审计历史 DACL 配置。
RuntimeBroker.exe:AppContainer 令牌创建完整调用链路
前置基础 RuntimeBroker 路径:
C:\Windows\System32\RuntimeBroker.exe服务 / 身份:普通可执行程序,不是 svchost 宿主;UWP / 系统 AppX 包的权限代理与 AppContainer 沙箱创建组件。 核心目标:当启动 AppContainer 应用(ShellExperienceHost、StartMenuExperienceHost 等系统 Appx),RuntimeBroker 负责构建 AppContainer 安全令牌、创建 AppContainer 隔离环境,交给CreateProcessAsUser/CreateProcess启动目标进程。 底层 API 入口:CreateAppContainerProfile/DeriveAppContainerSidFromAppContainerName,内核侧依托ntoskrnl的 AppContainer 对象管理器。
一句话定位:DcomLaunch 负责激活 AppID;RuntimeBroker 负责构建 AppContainer 安全上下文与令牌。
一、底层原理
AppContainer 本质是基于 SID 的强制隔离安全模型(Mandatory Integrity + 容器 SID + 资源隔离)。
- 每个 AppX 包拥有唯一AppContainer 名称(例如
Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy)。 - RuntimeBroker 调用 LSA/lsass,生成 AppContainer SID(S-1-15-2-xxxx)。
- 基于登录用户主令牌,派生新的受限访问令牌,注入 AppContainer SID、设置强制完整性级别(低完整性 Low IL),剥离大部分权限、删除敏感特权。
- 生成 AppContainer 对象(内核对象),注册包的功能声明(capability,如 internetClient、picturesLibrary)。
- 将构建好的 AppContainer 令牌传递给进程创建 API,启动目标 UWP 进程(ShellExperienceHost),进程运行在该受限令牌内。
关键区分:
- 用户主令牌:交互式登录用户的完整访问令牌
- AppContainer 令牌:派生受限令牌,附加 AppContainer SID、低完整性标签,裁剪 SID 与权限,AppContainer 进程只能访问被显式授权资源。
二、依赖文件 & 依赖关系
用户态模块
| 模块 | 作用 |
|---|---|
RuntimeBroker.exe |
主程序,AppContainer 编排入口 |
advapi32.dll |
安全令牌、LSA 调用,CreateProcessAsUser |
sechost.dll |
LSA 客户端接口,和 lsass 通信 |
userenv.dll |
用户配置文件、AppContainer profile 管理 |
combase.dll / ole32.dll |
COM/LRPC,接收来自 explorer/DcomLaunch 的激活请求 |
rpcrt4.dll |
LRPC 传输,跨进程请求 |
ntdll.dll |
Nt * 原生 API,内核调用入口 |
内核 & 系统服务依赖
lsass.exe(本地安全机构):强依赖,SID 生成、令牌构造、权限校验、LSA 策略查询ntoskrnl.exe:AppContainer 内核对象、令牌对象、强制完整性、ACL 检查DcomLaunch(svchost):DCOM 激活,触发 RuntimeBroker 启动流程rpcss.exe:LRPC 端点映射(本地调用)win32k.sys:窗口站 / 桌面安全隔离(AppContainer 窗口站隔离)
注册表依赖
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\StateManager:Appx 包元数据、功能清单HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\PackageRepository:已注册 AppX 包信息HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppContainer:AppContainer 全局策略HKCU\Software\Microsoft\Windows\CurrentVersion\AppContainer:用户侧 AppContainer profile
三、完整调用链路(以 ShellExperienceHost 启动为例)
触发源:用户点击任务栏时钟 → explorer 发起 LRPC → DcomLaunch 激活 ShellExperienceHost AppID DcomLaunch 收到激活请求,发现目标 AppID 属于 AppContainer 类型,调用 RuntimeBroker 的 COM 接口,请求创建 AppContainer 环境并启动进程
【阶段1:激活请求路由到RuntimeBroker】
explorer.exe
↓ LRPC(DCOM)
DcomLaunch (svchost)
↓ 通过COM接口调用 RuntimeBroker 的 IAppxBroker 接口
RuntimeBroker.exe 被启动(如未运行),COM接口接收请求
【阶段2:读取App包元数据,解析AppContainer名称 & Capabilities】
RuntimeBroker
↓ userenv.dll / combase 查询Appx包仓库注册表
读取包信息:
包全名:Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy
AppContainer名称
声明的Capabilities(能力)
↓
调用 `DeriveAppContainerSidFromAppContainerName()` → 生成AppContainer SID(S-1-15-2-xxxx)
【阶段3:向LSASS请求构建AppContainer受限令牌(核心环节)】
RuntimeBroker → advapi32 → LSA RPC调用 lsass.exe
1. 拿到当前交互式登录用户的**主访问令牌**(explorer的用户令牌)
2. LSA执行令牌派生:DuplicateTokenEx
3. 在新令牌中:
✅ 添加AppContainer SID到令牌的TokenGroups
✅ 设置令牌完整性级别为 LOW 低完整性(SECURITY_MANDATORY_LOW_RID)
✅ 移除大部分管理员/高权限SID、删除多余特权(SeSecurityPrivilege等全部移除)
✅ 注入包声明的Capability SID(如internetClient)
4. LSA返回**AppContainer受限令牌句柄**给RuntimeBroker
【阶段4:创建AppContainer内核配置文件对象(AppContainer Profile)】
RuntimeBroker调用 `CreateAppContainerProfile` (userenv.dll)
↓ 内核ntoskrnl创建AppContainer内核对象
内核绑定:
- AppContainer SID
- 包Capability列表
- 隔离的对象命名空间(Object Manager私有命名空间,与桌面进程隔离)
- 隔离注册表 hive(AppContainer私有注册表)
- 隔离文件系统虚拟化(AppData本地容器目录)
【阶段5:使用AppContainer令牌创建目标进程 ShellExperienceHost.exe】
RuntimeBroker
↓ CreateProcessAsUserW( AppContainer令牌, ShellExperienceHost.exe ... )
内核:
1. 分配进程/线程对象
2. 将AppContainer令牌绑定到新进程
3. 挂载AppContainer对象命名空间、私有注册表、容器存储
4. 加载ShellExperienceHost.exe,初始化combase/XAML运行时
【阶段6:返回OBJREF给DcomLaunch,再传回explorer】
ShellExperienceHost启动完成,COM对象注册
↓
RuntimeBroker将激活结果+OBJREF回传给DcomLaunch
↓
DcomLaunch把OBJREF返回给客户端explorer
↓
后续UI交互:explorer ↔ ShellExperienceHost 直接LRPC,不再经过RuntimeBroker
生命周期边界:RuntimeBroker只负责创建令牌与启动进程;进程一旦创建完毕,RuntimeBroker 不再参与 ShellExperienceHost 运行时调用。RuntimeBroker 可同时为多个 AppContainer 进程提供启动代理,一个 RuntimeBroker 实例可以孵化多个 UWP 进程。
四、关键 API 调用栈(user 态到原生 NtAPI)
高层 Win32 API
IAppxBroker::ActivateApplication
└─ CreateAppContainerProfile
├─ DeriveAppContainerSidFromAppContainerName
└─ DuplicateTokenEx (lsass构建受限令牌)
└─ NtDuplicateToken (ntdll)
└─ CreateProcessAsUserW
└─ NtCreateProcessEx / NtCreateThreadEx
内核侧调用链路(ntoskrnl)
NtCreateProcessEx
├─ SeCreateAccessState
├─ PsAssignTokenToProcess (绑定AppContainer令牌)
├─ ObOpenObjectByPointer 打开AppContainer内核对象
└─ CmAttachAppContainerRegistryHive 挂载App容器私有注册表
五、配套链(工具、事件、取证)
排查 / 审计工具
Get-AppxPackage:查看 App 包名称、能力声明Check-CapabilityPowerShell:查看 Capability SID- Process Explorer:查看进程令牌属性,查看 AppContainer SID、完整性级别
accesschk.exe:校验 AppContainer SID 资源访问权限- OleViewDotNet:查看 AppX Broker COM 接口
IAppxBroker
事件日志
Microsoft-Windows-AppModel-Deployment:AppContainer Profile 创建、包激活Microsoft-Windows-Security-Auditing安全事件:- 4656:打开 AppContainer 内核对象
- 4624:AppContainer 进程登录(使用受限令牌登录类型)
- 4670:权限修改、SID 添加到令牌
进程树取证特征
RuntimeBroker.exe
├─ ShellExperienceHost.exe
└─ StartMenuExperienceHost.exe
RuntimeBroker 是 AppContainer 进程的父进程,这个进程树特征是取证上识别 UWP/AppContainer 启动的关键标记。
六、边界、安全边界、限制
✅ 功能边界
- RuntimeBroker仅在 AppX 包激活时构建令牌;普通 Win32 进程(notepad、explorer)不走此链路。
- AppContainer 令牌是用户登录会话派生,不能脱离用户会话独立存在;用户注销,所有该会话 AppContainer 容器销毁。
- AppContainer 有独立对象命名空间:容器进程默认看不到全局内核对象(互斥体、事件),防止跨容器通信。
- 私有虚拟化注册表:每个 AppContainer 拥有独立注册表分支,写操作不会污染 HKCU 真实注册表。
⚠️ 安全边界(攻防重点)
- AppContainer 令牌默认低完整性级别;低 IL 进程无法写入高完整性对象(经典保护机制)。
- Capability 是权限控制点:包清单声明能力,RuntimeBroker 在构建令牌时注入对应的 Capability SID。没有声明的能力,令牌不具备。
- RuntimeBroker 本身运行在当前登录用户的普通令牌,不是 SYSTEM;RuntimeBroker 只是代理构造令牌,不会永久提升权限。
- 逃逸面:攻击面集中在 RuntimeBroker 的 COM 接口、Capability 校验逻辑、AppContainer Profile 解析逻辑;历史存在漏洞可实现 AppContainer 沙箱逃逸。
❌ 技术局限
- AppContainer 仅 Windows 原生;Linux/macOS 没有这套令牌模型。
- AppContainer 隔离不是强安全沙箱,是 Windows 强制访问控制 + SID 隔离;存在部分内核 / COM 接口逃逸路径。
- 资源访问:AppContainer 进程访问文件 / 注册表必须通过 RuntimeBroker 代理(Broker 代理模型),直接访问会被 ACL 拒绝。
取证边界
- 进程父进程 = RuntimeBroker,可判定该进程为 AppContainer UWP 应用。
- 进程令牌属性:存在 S-1-15-2-xxx SID + Low 完整性标签。
- 内存取证:RuntimeBroker 内存中包含 AppContainer 名称、SID、包全名、Capability 列表。
- 注册表 slack:AppContainer profile 历史记录,可提取曾经运行过的 UWP 包。
ShellExperienceHost.exe 是 Windows 10 操作系统中的一个系统进程,它负责管理和运行一些用户界面相关的功能和效果。具体来说,ShellExperienceHost 主要有以下作用:
-
启动菜单和任务栏: ShellExperienceHost 负责启动、管理和渲染开始菜单、任务栏以及相关的用户界面元素。
-
窗口管理: 它负责处理窗口的显示、动画效果以及其他窗口管理方面的功能。
-
通知中心: ShellExperienceHost 还负责管理通知中心(Action Center),包括通知的显示和管理。
-
桌面效果: 它负责处理桌面效果,如任务视图、窗口预览等。
-
平铺式用户界面: 在 Windows 10 的平铺式用户界面(Tiled UI)中,ShellExperienceHost 负责管理和呈现磁贴、Live Tile 等功能。
ShellExperienceHost 是 Windows 10 操作系统中的一个重要组件,它负责管理和呈现用户界面的各种元素,提供良好的用户体验。通常情况下,用户不需要直接与 ShellExperienceHost 交互,它在后台默默地运行并完成其工作。

浙公网安备 33010602011771号