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 通信。

一、底层原理

核心架构

  1. AppContainer 沙箱模型:进程启动时由 RuntimeBroker 创建 AppContainer 隔离环境,强制资源隔离、文件 / 注册表 / COM 对象访问受限;所有 UI 组件运行在这个低权限容器内。
  2. XAML UI 渲染引擎:基于Microsoft.UI.Xaml,负责绘制现代 Win10/11 的非 Win32 原生弹出 UI。
  3. 组件 DLL 插件化:功能拆分为独立 DLL,按需加载,每个 Flyout 对应单独模块,单个模块崩溃不会直接全盘干掉整个进程(进程会自动重启)Microsoft ...。
  4. COM/DCOM+LRPC 跨进程通信:和explorer.exe、RuntimeBroker.exe、DcomLaunch、audiodg.exe使用本地 ORPC (LRPC)调用;经典 10016 DCOM 警告就来自 ShellExperienceHost AppContainer 尝试调用其他 COM 组件权限不足(仅日志警告,功能不中断)。
  5. 进程挂起机制:空闲时 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

内核依赖

  1. ntoskrnl.exe:进程创建、AppContainer 安全隔离、内存管理、挂起恢复
  2. win32k.sys:窗口消息、GDI / 窗口渲染
  3. dxgkrnl.sys:DirectX 图形渲染
  4. tcpip.sys:Toast 通知联网(天气、推送通知)

注册表依赖

  1. HKCR\AppID\{ShellExperienceHost AppID}:DCOM 本地激活权限、AppContainer 安全描述符
  2. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel:UWP 包注册信息
  3. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell:沉浸式外壳全局配置
  4. 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 承载。

四、配套链(工具、事件、取证、管理)

管理 / 排错工具

  1. Get-AppxPackage *ShellExperienceHost*:PowerShell 查看 UWP 包状态
  2. Add-AppxPackage -Register:重新注册 ShellExperienceHost 包(修复损坏)
  3. 事件查看器:Microsoft-Windows-ShellExperienceHost 事件日志;DCOM 日志(10016)
  4. 任务管理器:查看进程挂起状态、内存 CPU 占用

事件日志

  1. ShellExperienceHost 事件:进程启动、崩溃、UI 渲染失败
  2. DCOM 事件 ID 10016:AppContainer 权限不足(经典无害警告)
  3. 应用程序错误日志:0xc0000005访问违例(XAML 组件损坏常见)

关联进程生态

  • RuntimeBroker.exe:UWP/AppContainer 权限代理(强绑定)
  • explorer.exe:Windows 外壳主进程,UI 事件发起方
  • DcomLaunch (svchost):DCOM 激活器,负责拉起 ShellExperienceHost
  • audiodg.exe:音频引擎,通知提示音调用目标
  • StartMenuExperienceHost.exe:独立开始菜单宿主(Win10/11 拆分)

五、边界、限制、安全边界

✅ 功能边界

  1. 职责仅承载 XAML 悬浮弹出 UI;桌面、任务栏主窗口、文件资源管理器窗口属于 explorer,不归 ShellExperienceHost。
  2. 进程模型:多实例可存在;空闲自动 Suspend,不是常驻全速运行。
  3. Win11 24H2 + 演进:快速设置面板迁移到ShellHost.exe,ShellExperienceHost 逐步裁剪,仅保留通知、Flyout。
  4. AppContainer 隔离:默认无法直接访问用户完整文件系统、注册表,必须通过 RuntimeBroker 代理访问资源。
  5. 崩溃自愈:进程异常崩溃,explorer 会自动重新拉起,不需要重启资源管理器。

⚠️ 安全边界(攻防 / 取证重点)

  1. 低权限 AppContainer 沙箱,默认不能直接提权;攻击面集中在 XAML 渲染引擎、DCOM 接口、RuntimeBroker 代理通道。
  2. DCOM 本地激活:仅本机 LRPC,不开放远程 DCOM,无 135 远程调用入口。
  3. 10016 DCOM 警告:仅日志审计,不会造成功能失效,是 AppContainer 尝试访问 COM 对象被 ACL 拒绝,不是漏洞。
  4. 恶意伪装风险:恶意程序伪装同名 exe,判断依据:路径必须位于SystemApps\ShellExperienceHost_xxx,带微软数字签名。

❌ 技术局限

  1. 不能直接终止 / 卸载:属于系统受保护 Appx 包;强行结束进程会丢失通知、Flyout 面板。
  2. 依赖 XAML CBS 框架包,Windows 更新损坏 CBS 包会直接导致进程反复崩溃、通知 / 时钟面板空白。
  3. 高 DPI、多显示器场景容易出现 XAML 渲染错位、闪烁。

取证边界

  1. 进程树:父进程通常为 RuntimeBroker.exe;DcomLaunch 作为激活源头。
  2. 事件日志:可审计通知弹出、Flyout 打开、进程崩溃记录。
  3. 内存取证:进程内存中存在 Toast 通知、时钟 / 网络 UI 界面文本。
  4. 注册表: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:

  1. LaunchPermission:启动权限 SD(DcomLaunch 校验,能不能拉起该 App 的 COM 服务)
  2. 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 标志位常见掩码:

  • 0x0001 SE_OWNER_DEFAULTED
  • 0x0002 SE_GROUP_DEFAULTED
  • 0x0004 SE_DACL_PRESENT 存在 DACL(DCOM SD 必设)
  • 0x0008 SE_DACL_DEFAULTED
  • 0x0010 SE_SACL_PRESENT 存在 SACL(审计 ACL)
  • 0x8000 SE_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 条目:

  1. NT AUTHORITY\SYSTEM S-1-5-18:完全本地启动权限
  2. BUILTIN\Administrators S-1-5-32-544:本地启动权限
  3. ALL APPLICATION PACKAGES S-1-15-2-1:AppContainer 包通用 SID(关键!允许 UWP/AppContainer 主体激活)
  4. 交互式登录用户 NT AUTHORITY\INTERACTIVE S-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 ...

  1. SD Header:
    • Revision=0x01,Sbz1=0x00
    • Control = 0x8004 → SE_SELF_RELATIVE | SE_DACL_PRESENT
    • OffsetOwner=0,OffsetGroup=0,OffsetSacl=0,OffsetDacl=0x14
  2. 跳转到 0x14 读取 DACL:
    • ACL Revision=0x02,AclSize,AceCount=4(4 条 ACE)
  3. ACE #1:ACCESS_ALLOWED_ACE,Mask=0x0000000b(COM 本地激活),SID:S-1-5-18(SYSTEM)
  4. ACE #2:ACCESS_ALLOWED_ACE,Mask=0x0000000b,SID:S-1-5-32-544(管理员组)
  5. ACE #3:ACCESS_ALLOWED_ACE,Mask=0x0000000b,SID:S-1-15-2-1(所有应用包)
  6. 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. 解析工具

  1. OleViewDotNet(首选 COM/DCOM 分析工具) 打开 → 找到 AppID {44692c78-79ac-4514-8193-0b8e0c45741c} → 查看 Security,直接可视化解析 Launch/Access SD,展开 DACL/ACE/SID。
  2. ConvertFrom-SecurityDescriptor 第三方 PowerShell 模块(解析原始 SD 字节)
  3. 010 Editor:加载二进制字节,使用 Security Descriptor 模板解析 Self-Relative SD。
  4. sdshow.exe(微软旧工具)输入原始 SD blob,解码 SID 与 ACE。

六、边界、取证与经典 10016 DCOM 错误根源

边界要点

  1. LaunchPermission SD:DcomLaunch 在激活阶段校验;RuntimeBroker 请求拉起 ShellExperienceHost,DcomLaunch 读取此 SD,检查请求令牌是否匹配 DACL ACE。
  2. AccessPermission SD:ShellExperienceHost 进程启动后,COM 运行时(combase)校验后续 LRPC 接口调用。
  3. 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 拒绝。

取证要点

  1. 导出LaunchPermission/AccessPermission REG_BINARY blob,离线解析 SD,审计是否被篡改(例如恶意添加 Everyone ACE,开启远程激活)。
  2. 对比基线 SD:系统原版 ShellExperienceHost AppID SD不存在远程激活权限;一旦出现COM_RIGHTS_ACTIVATE_REMOTE(0x10),属于异常篡改。
  3. 自相对 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 + 资源隔离)。

  1. 每个 AppX 包拥有唯一AppContainer 名称(例如 Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy)。
  2. RuntimeBroker 调用 LSA/lsass,生成 AppContainer SID(S-1-15-2-xxxx)。
  3. 基于登录用户主令牌,派生新的受限访问令牌,注入 AppContainer SID、设置强制完整性级别(低完整性 Low IL),剥离大部分权限、删除敏感特权。
  4. 生成 AppContainer 对象(内核对象),注册包的功能声明(capability,如 internetClient、picturesLibrary)。
  5. 将构建好的 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,内核调用入口

内核 & 系统服务依赖

  1. lsass.exe(本地安全机构):强依赖,SID 生成、令牌构造、权限校验、LSA 策略查询
  2. ntoskrnl.exe:AppContainer 内核对象、令牌对象、强制完整性、ACL 检查
  3. DcomLaunch(svchost):DCOM 激活,触发 RuntimeBroker 启动流程
  4. rpcss.exe:LRPC 端点映射(本地调用)
  5. win32k.sys:窗口站 / 桌面安全隔离(AppContainer 窗口站隔离)

注册表依赖

  1. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\StateManager:Appx 包元数据、功能清单
  2. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\PackageRepository:已注册 AppX 包信息
  3. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppContainer:AppContainer 全局策略
  4. 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容器私有注册表

五、配套链(工具、事件、取证)

排查 / 审计工具

  1. Get-AppxPackage:查看 App 包名称、能力声明
  2. Check-Capability PowerShell:查看 Capability SID
  3. Process Explorer:查看进程令牌属性,查看 AppContainer SID、完整性级别
  4. accesschk.exe:校验 AppContainer SID 资源访问权限
  5. 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 启动的关键标记。

六、边界、安全边界、限制

✅ 功能边界

  1. RuntimeBroker仅在 AppX 包激活时构建令牌;普通 Win32 进程(notepad、explorer)不走此链路。
  2. AppContainer 令牌是用户登录会话派生,不能脱离用户会话独立存在;用户注销,所有该会话 AppContainer 容器销毁。
  3. AppContainer 有独立对象命名空间:容器进程默认看不到全局内核对象(互斥体、事件),防止跨容器通信。
  4. 私有虚拟化注册表:每个 AppContainer 拥有独立注册表分支,写操作不会污染 HKCU 真实注册表。

⚠️ 安全边界(攻防重点)

  1. AppContainer 令牌默认低完整性级别;低 IL 进程无法写入高完整性对象(经典保护机制)。
  2. Capability 是权限控制点:包清单声明能力,RuntimeBroker 在构建令牌时注入对应的 Capability SID。没有声明的能力,令牌不具备。
  3. RuntimeBroker 本身运行在当前登录用户的普通令牌,不是 SYSTEM;RuntimeBroker 只是代理构造令牌,不会永久提升权限。
  4. 逃逸面:攻击面集中在 RuntimeBroker 的 COM 接口、Capability 校验逻辑、AppContainer Profile 解析逻辑;历史存在漏洞可实现 AppContainer 沙箱逃逸。

❌ 技术局限

  1. AppContainer 仅 Windows 原生;Linux/macOS 没有这套令牌模型。
  2. AppContainer 隔离不是强安全沙箱,是 Windows 强制访问控制 + SID 隔离;存在部分内核 / COM 接口逃逸路径。
  3. 资源访问:AppContainer 进程访问文件 / 注册表必须通过 RuntimeBroker 代理(Broker 代理模型),直接访问会被 ACL 拒绝。

取证边界

  1. 进程父进程 = RuntimeBroker,可判定该进程为 AppContainer UWP 应用。
  2. 进程令牌属性:存在 S-1-15-2-xxx SID + Low 完整性标签。
  3. 内存取证:RuntimeBroker 内存中包含 AppContainer 名称、SID、包全名、Capability 列表。
  4. 注册表 slack:AppContainer profile 历史记录,可提取曾经运行过的 UWP 包。

ShellExperienceHost.exe 是 Windows 10 操作系统中的一个系统进程,它负责管理和运行一些用户界面相关的功能和效果。具体来说,ShellExperienceHost 主要有以下作用:

  1. 启动菜单和任务栏: ShellExperienceHost 负责启动、管理和渲染开始菜单、任务栏以及相关的用户界面元素。

  2. 窗口管理: 它负责处理窗口的显示、动画效果以及其他窗口管理方面的功能。

  3. 通知中心: ShellExperienceHost 还负责管理通知中心(Action Center),包括通知的显示和管理。

  4. 桌面效果: 它负责处理桌面效果,如任务视图、窗口预览等。

  5. 平铺式用户界面: 在 Windows 10 的平铺式用户界面(Tiled UI)中,ShellExperienceHost 负责管理和呈现磁贴、Live Tile 等功能。

ShellExperienceHost 是 Windows 10 操作系统中的一个重要组件,它负责管理和呈现用户界面的各种元素,提供良好的用户体验。通常情况下,用户不需要直接与 ShellExperienceHost 交互,它在后台默默地运行并完成其工作。

 

posted @ 2024-04-24 20:25  suv789  阅读(4481)  评论(0)    收藏  举报