文章总结: 本文分析了CVE-2026-20817,这是Windows错误报告服务(WER)中的一个本地权限提升漏洞(CWE-280)。由于SvcElevatedLaunch函数未验证ALPC请求者的权限,普通用户可通过发送特定消息创建具有SYSTEM级令牌(仅移除SeTcbPrivilege)的进程,并完全控制命令行参数,导致系统可被完全接管。微软通过功能标志直接禁用该功能而非添加权限校验来修复。建议立即安装2026年1月安全更新并加强端点监控,可通过PurpleHound等BAS方案验证防护有效性。 综合评分: 72 文章分类: 漏洞分析,漏洞预警,二进制安全,漏洞POC
CVE-2026-20817 – Windows错误报告中缺失授权检查的分析 POC
Ots安全
2026年3月27日 13:27 广东
威胁简报
恶意软件
漏洞攻击
- 漏洞概述
CVE-2026-20817 是 Windows 错误报告服务 (WER) 中发现的一个本地权限提升漏洞。该漏洞的原因是,该服务在处理进程创建请求时未验证请求者的权限。
WER 服务以 NT AUTHORITY\SYSTEM 权限运行,并通过 ALPC 端口监听客户端请求。攻击者可以通过发送具有普通用户权限的特定消息来创建一个具有SYSTEM 级令牌(不包括 SeTcbPrivilege)的进程,并获得对该进程命令行参数的完全控制权。
1.1 漏洞信息
1.2 CWE-280 概述
CWE-280 是指软件在访问某个函数时,未能处理或未能正确处理权限不足的情况。
- 详细的漏洞分析
2.1 函数调用流程
CWerService::SvcElevatedLaunch ← [1] 缺少权限验证
│
▼
ElevatedProcessStart ← [2] 从共享内存中提取命令行
│
▼
CreateElevatedProcessAsUser
│
├──► UserTokenUtility::GetProcessToken ← [3] 基于 SYSTEM 令牌创建
│
└──► CreateProcessAsUserW ← [4] 使用攻击者命令行创建进程
[图 1] 导致 CVE-2026-20817 漏洞的函数调用流程图。
2.2 漏洞补丁对比分析
2.2.1 漏洞补丁前(存在漏洞)
__int64 __fastcall CWerService :: SvcElevatedLaunch (
struct _RTL_CRITICAL_SECTION * this ,
struct _WERSVC_MSG * a2 ,
struct _WERSVC_MSG * a3 )
{
// ... // 권한 검증
없이 바로 처리 진행
v6 = CWerService :: OpenSenderProcessThread ( this , ... ) ; if ( v6 > = 0 ) { // ...
v6 = ElevatedProcessStart ( ... ) ; } // ... }
[代码 1] 在补丁之前,SvcElevatedLaunch – 进程创建请求未经授权立即处理。
2.2.2 漏洞补丁(缓解措施)之后
__int64 __fastcall CWerService :: SvcElevatedLaunch (
LPCRITICAL_SECTION lpCriticalSection ,
struct _WERSVC_MSG * a2 ,
struct _WERSVC_MSG * a3 )
{
// ...
// 检查功能标志 - 激活后立即
if ( ( unsigned __int8 ) wil :: details :: FeatureImpl <__WilFeatureTraits_Feature_2607502650> :: __ private_IsEnabled ( ... ) ) { * ( ( _ DWORD * ) a3 + 10 ) = 1 ; * ( ( _ DWORD *
) a3 + 11 ) = -1073741823 ; // STATUS_NOT_IMPLEMENTED return 2147500037LL ; // E_NOTIMPL } // 以下为现有代码(启用功能标志时无法访问)// ... }
[代码 2] 补丁之后,通过使用 SvcElevatedLaunch – 功能标志禁用该功能本身,缓解了该漏洞。
微软并没有添加权限验证逻辑,而是通过功能标志完全禁用了该功能。鉴于该功能已被完全禁用,很可能它最初是为内部使用而设计的,不应对外公开。
2.3 SvcElevatedLaunch – 无需权限验证
该函数是进程创建请求的入口点,也是CWE-280 漏洞发生的地方。
__int64 __fastcall CWerService :: SvcElevatedLaunch (
struct _RTL_CRITICAL_SECTION * this ,
struct _WERSVC_MSG * a2 ,
struct _WERSVC_MSG * a3 )
{
void * v5 = 0 ;
hObject = 0 ;
v14 = 0 ;
// 获取 ALPC 客户端进程句柄
// 不验证客户端是否为受信任的调用者
v6 = CWerService :: OpenSenderProcessThread (
this ,
( int ) a2 ,
* (( _ DWORD * ) a2 + 48 ) != 0 ? 1216 : 1088 ,
( int ) & hObject ,
0 , 0 , 0 ) ;
if ( v6 >= 0 )
{
memset_0 ( v16 , 0 , sizeof ( v16 ) ) ;
v7 = 0 ;
v8 = 0 ;
v9 = * ( (_ DWORD * ) a2 + 48 ) ;
if ( v9 )
{
v10 = ( _QWORD * ) ( ( char * ) a2 + 64 ) ;
do
{
if ( v8 >= 0x10 )
break ;
if ( * v10 )
v16 [ v7 ++ ] = * v10 ;
++ v8 ;
++ v10 ;
}
while ( v8 < v9 ) ;
}
// 调用 ElevatedProcessStart 而不进行验证
v6= ElevatedProcessStart (
* ( ( _DWORD * ) a2 + 12 ) , // 进程类型hObject
, // 客户端进程句柄
* ( ( void * ) a2 + 7 ) , // 共享内存句柄(命令行)
v16 ,
v7 , & v14 ) ; } // ... }
[代码 3] SvcElevatedLaunch 的完整实现 – 无需客户端授权验证即可处理 ALPC 请求。
OpenSenderProcessThread仅获取 ALPC 客户端的进程句柄,而不验证进程的权限级别。因此,普通用户的请求不会被拒绝,而是传递给ElevatedProcessStart 。
2.4 ElevatedProcessStart – 提取命令行
该函数从共享内存中读取攻击者控制的命令行。
__int64 __fastcall ElevatedProcessStart(
int a1 ,
void * a2 , // 客户端进程句柄
void * a3 , // 共享内存句柄
void * a4 ,
unsigned int a5 ,
void ** a6 ){ // ... // 将客户端创建的共享内存句柄复制到当前进程(WER 服务)
v15 = ( HANDLE * ) tlx :: replace < tlx :: file_handle_traits > ( hFileMappingObject ) ;
CurrentProcess = GetCurrentProcess ( ) ; if ( ! DuplicateHandle ( a2 , a3 , CurrentProcess , v15 , 0x80000000 , 0 , 0 ) ) { // ... } // 共享内存映射 (0x208 = 520 字节)
v20 = MapViewOfFile ( hFileMappingObject [ 0 ] , 4u , 0 , 0 , 0x208u ) ; // ... // 命令行复制 - 客户端控制的数据
ElevatedProcessAsUser = memcpySEH ( v32 , v20 , 0x208u ) ; // ... // 传递给 CreateElevatedProcessAsUser 时未进行内容验证
ElevatedProcessAsUser = CreateElevatedProcessAsUser ( ( _DWORD ) a2 , ( unsignedint ) v32 , // 客户端提供的命令行
a4 ,
a5 , 0 , ( __int64 ) & hSourceHandle ,
v24 ) ; // ... }
[代码 4] ElevatedProcessStart 实现 – 从共享内存中提取攻击者控制的命令行而不进行验证。
发送ALPC消息之前,客户端会创建共享内存并记录所需的命令行参数。该函数会直接使用此内容,而不进行验证。
2.5 UserTokenUtility::GetProcessToken – 获取令牌
该函数是权限提升的关键。它分析普通用户的请求如何最终获得系统级令牌。
__int64 __fastcall UserTokenUtility :: GetProcessToken (
HANDLE ProcessHandle , // 客户端进程句柄
int a2 ,
void ** a3 ) // 输出:Token
{
// ...
// 为客户端进程打开一个令牌
v7 = ( void ** ) tlx :: replace < tlx :: file_handle_traits > ( & TokenHandle ) ; if ( ! OpenProcessToken ( ProcessHandle , 0x4Fu , v7 ) ) { // ... } if ( ! a2 ) goto ReturnToken ; // 尝试获取提升权限的令牌
v10 = ( void ** ) tlx :: replace < tlx :: file_handle_traits > ( & hObject ) ;
v11 = LUAGetElevatedToken ( TokenHandle , v10 ) ; // ... // 检查 SeTcbPrivilege - 如果普通用户的令牌不符合此条件,则执行以下操作:if ( ( unsigned __int64 ) hObject + 1 > 1 && ! ( unsigned int ) UtilTokenHasPrivilege ( hObject , L "SeTcbPrivilege" ) ) {
v15 = hObject ;
hObject = 0 ; if ( ( unsigned __int64 ) v15 + 1 > 1 ) CloseHandle ( v15 ) ; // 销毁令牌} // 如果没有合适的令牌 - 普通用户进入此处if ( ( unsigned __int64 ) hObject + 1 > 1 ) goto ReturnToken ; // ========== 核心漏洞路径 ========== // 通过仅从 WER 服务 (SYSTEM) 的令牌中移除 SeTcbPrivilege 来创建令牌
if ( LookupPrivilegeValueW ( 0 , L " SeTcbPrivilege" , & Luid . Luid ) )
{
Luid . Attributes = 0 ;
// 打开 WER 服务自身的令牌 (NT AUTHORITY\SYSTEM)
v17 = ( void ** ) tlx :: replace < tlx :: file_handle_traits > ( & ExistingTokenHandle ) ;
CurrentProcess = GetCurrentProcess ( ) ; if ( ! OpenProcessToken ( CurrentProcess , 0xF01FFu , v17 ) ) { // ... } //仅从 SYSTEM 令牌中移除 SeTcbPrivilege
NewTokenHandle = ( void ** ) tlx :: replace < tlx :: file_handle_traits > ( & hObject ) ; if ( ! CreateRestrictedToken (
ExistingTokenHandle , // WER 服务的系统令牌0 , 0 , 0 , 1u , // DeletePrivilegeCount = 1 & Luid , // SeTcbPrivilege 0 , 0 ,
NewTokenHandle ) ) { // ... } }
ReturnToken : * a3 = hObject ? hObject : TokenHandle ; // ... }
[代码 5] 实现 GetProcessToken – 创建一个令牌,仅从 WER 服务的 SYSTEM 令牌中删除 SeTcbPrivilege。
令牌获取流程:
1 .尝试获取已升级为客户端(普通用户)令牌的令牌。
2 .普通用户失败是因为他们没有合适的升序令牌。
3 .另一种方法:使用GetCurrentProcess()获取WER 服务自身的进程句柄
4 .打开WER 服务的SYSTEM 令牌,并使用CreateRestrictedToken仅移除 SeTcbPrivilege。
5 .此令牌用于创建流程
关键在于,即使客户端是普通用户,也会基于 WER 服务的 SYSTEM 令牌生成新的令牌。
2.6 CreateElevatedProcessAsUser – 创建最终流程
__int64 __fastcall CreateElevatedProcessAsUser(
void * a1 ,
__int64 a2 , // 命令行(客户端控制)
// ...
{
// ...
// 可执行文件(固定)
v17 = L "WerMgr.exe" ;
if ( ( v12 & 2 ) == 0 )
v17 = L "WerFault.exe" ;
// 路径配置:C:\Windows\System32\WerFault.exe
CreateProcessToken = tlx :: assign_sprintf < wchar_t , . . . > (
lpApplicationName ,
L "%s\\%s" ,
lpCurrentDirectory ,
v51 ) ;
// 命令行配置:"...\WerFault.exe" <客户端提供的参数>
CreateProcessToken = tlx :: assign_sprintf < wchar_t , . . . > (
lpCommandLine ,
L "\"%s\\%s\" %s" ,
lpCurrentDirectory ,
v22 ,
v57 ) ; // ← 客户端控制
// ...
// 创建最终进程
v36 = CreateProcessAsUserW (
v10 , // Token: SYSTEM - SeTcbPrivilege
lpApplicationName [ 0 ] , // WerFault.exe (已修复)
lpCommandLine [ 0 ] , // 客户端提供的命令行
0 , 0 ,
1 , // bInheritHandles = TRUE
v32 ,
lpEnvironment ,
lpCurrentDirectory ,
& StartupInfo ,
& hObject ) ;
// ...
}
[代码 6] 实现 CreateElevatedProcessAsUser – 创建一个具有 SYSTEM 令牌和攻击者命令行的进程。
2.7 最终结果
- PoC演示
此概念验证通过链接一个单独的文件替换漏洞来触发 CVE-2026-20817 漏洞。以下视频演示了如何利用 WER 服务,以普通用户的权限创建一个高权限进程。
已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏退出全屏
Ots安全已关注
分享视频
,时长00:18
0/0
00:00/00:18
切换到横屏模式
继续播放
[ ]
进度条,百分之0
播放
00:00
/
00:18
00:18
倍速
全屏
倍速播放中
0.5倍 0.75倍 1.0倍 1.5倍 2.0倍
超清 流畅
继续观看
CVE-2026-20817 – Windows错误报告中缺失授权检查的分析 POC
观看更多
转载
,
CVE-2026-20817 – Windows错误报告中缺失授权检查的分析 POC
Ots安全已关注
分享点赞在看
已同步到看一看写下你的评论
视频详情
[视频 1] CVE-2026-20817 演示视频
演示环境:Windows 11 23H2(未打补丁)
演示内容:
1 .检查当前用户权限(普通用户)
2 .WER 服务 ALPC 端口连接
3 .发送消息和创建流程
4 .检查已创建进程的令牌权限(系统级别)
如演示所示,攻击者仅凭标准用户权限即可获取 SYSTEM 令牌。该令牌包含包括 SeDebugPrivilege、SeImpersonatePrivilege 和 SeBackupPrivilege 在内的高级权限,可能导致凭证窃取和系统完全接管。
- 检测与验证
4.1 基于行为的检测
监控满足以下条件的进程创建事件:
- 进程:WerFault.exe 或 WerMgr.exe
- 令牌特征:未持有 SeDebugPrivilege + SeTcbPrivilege(异常组合)
- 命令行:不符合正常 WER 行为的参数
4.2 通过 PurpleHound 解决方案进行验证
事先验证组织的安全基础设施是否能够有效应对此类漏洞导致的权限提升攻击非常重要。
PurpleHound是由78ResearchLab开发的入侵和攻击模拟(BAS)解决方案。它能够重现真实世界的攻击场景,帮助企业验证其安全设备和系统在应对真实攻击时的有效性。该方案反映了包括朝鲜在内的真实威胁组织所使用的最新攻击技术,并且所有攻击场景均经过验证和实施。
CVE-2026-20817 漏洞也被纳入 PurpleHound 的攻击场景中,使组织能够验证其端点安全解决方案和 EDR 是否能够检测和阻止该攻击。
- 建议措施
- 请立即安装适用于 2026 年 1 月的 Microsoft 安全更新。
- 当补丁程序不可用时:加强端点监控
- 结论
CVE-2026-20817 是一个 CWE-280 漏洞,该漏洞是由于 WER 服务在请求创建进程时未验证请求者的权限而导致的。
由于CWerService::SvcElevatedLaunch中没有请求者权限检查,因此也会处理普通用户的请求。如果在UserTokenUtility::GetProcessToken中找不到合适的提升令牌,则会基于WER 服务的 SYSTEM 令牌生成一个令牌,仅移除 SeTcbPrivilege 权限。
攻击者可以完全控制使用该令牌运行的进程的命令行,从而对系统构成潜在威胁。
POC:
- https://github.com/itm4n/CVEs/tree/master/CVE-2026-20817
END
公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址
排版 编辑 | Ots 小安
采集 翻译 | Ots Ai牛马
公众号 | AnQuan7 (Ots安全)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《CVE-2026-20817 – Windows错误报告中缺失授权检查的分析 POC》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论