RegPwn-CVE-2026-24291

漏洞链接:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-24291

作者文章地址:https://www.mdsec.co.uk/2026/03/rip-regpwn/

一.介绍

MDSec 安全研究团队在进行红队演练(Red Team Engagements)时发现了一个 Windows 本地权限提升漏洞。该漏洞自 2025 年 1 月起就被 MDSec 用于内部红队行动,由于其利用方式优雅且缺乏明显检测指标,团队一直将其作为内部武器使用。直到微软在 2026 年 3 月的 Patch Tuesday 修复了该漏洞(CVE-2026-24291),MDSec 才决定公开披露

二.漏洞概述

RegPwn(CVE-2026-24291)是一个 Windows 辅助功能基础设施中的权限分配不当漏洞,影响 Windows 10、Windows 11 以及 Windows Server 2012、2016、2019、2022 和 2025 等多个版本

三.具体分析

3.1 Windows辅助功能

Windows 辅助功能是 Microsoft Windows 内置的一系列功能,旨在使操作系统对残障人士或特定可用性需求者更易于使用。这些功能通过键盘输入、语音、屏幕旁白、视觉调整和辅助技术,提供了与系统交互的替代方式。

已安装的无障碍功能列表定义在以下注册表键中:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATs

其下的这些注册表则对应则Windows辅助功能

注册表项    对应的辅助功能    说明    
animations    动画效果设置    控制 Windows 动画显示    
audiodescription    音频描述    为视频提供音频描述    
caretbrowsing    光标浏览    在页面中使用光标键浏览    
caretwidth    光标宽度    设置文本光标粗细    
colorfiltering    颜色滤镜    色盲辅助滤镜    
CursorIndicator    光标指示器    显示光标位置指示    
cursorscheme    光标方案    鼠标指针样式设置    
filterkeys    筛选键    忽略重复按键或短暂按键    
focusborderheight    焦点边框高度    键盘焦点指示器高度    
focusborderwidth    焦点边框宽度    键盘焦点指示器宽度    
highcontrast    高对比度    高对比度主题    
keyboardcues    键盘提示    显示键盘快捷键下划线    
keyboardpref    键盘首选项    优先使用键盘而非鼠标    
LiveCaptions    实时字幕    实时语音转文字字幕    
magnifierpane    放大镜面板    屏幕放大工具    
minimumhitradius    最小点击半径    触摸目标大小设置    
mousekeys    鼠标键    用数字键盘控制鼠标    
Narrator    讲述人    屏幕阅读器    
Oracle_JavaAccessBridge    Java 访问桥    Java 应用辅助功能支持    
osk    屏幕键盘    On-Screen Keyboard    
overlappedcontent    重叠内容    窗口重叠行为设置    
showsounds    显示声音    用视觉提示代替声音    
soundsentry    声音卫士    系统声音的视觉通知    
SpeechReco    语音识别    语音输入功能    
stickykeys    粘滞键    按顺序而非同时按组合键    
togglekeys    切换键    切换键(如 Caps Lock)的声音提示    
VoiceAccess    语音访问    语音控制电脑    
windowarranging    窗口排列    窗口自动排列设置    
windowtracking    窗口跟踪    焦点跟随设置    
windowtrackingtimeout    窗口跟踪超时    跟踪延迟设置    
windowtrackingzorder    窗口跟踪 Z 顺序    窗口层级跟踪设置    

当使用这些Windows辅助功能(例如:旁白、屏幕键盘等)时,会创建以下注册表键,并赋予低权限用户完全控制:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\<accessibility feature name>

当用户启用某个辅助功能(如屏幕键盘)时,Windows 会在注册表中创建相应的配置项来保存该功能的设置。

可以看到是完全控制权限

这些配置随后被复制到HKLM中的以下注册表密钥,该注册表由winlogon.exe在登录过程中创建,并赋予登录用户写入权限:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session<session id>\ATConfig

3.2 如何获得系统权限?

Windows 的无障碍功能在用户上下文中执行,尽管由于 UIAccess 标志,具有高完整性。显而易见的问题是,如何利用这些资源获得系统权限?

3.2.1 涉及到的Windows机制

这里先做一个简要介绍:

Windows 通过三个机制层层保护窗口安全:
IL(完整性级别) 给每个程序贴上"身份标签"——从低权限的浏览器沙盒,到高权限的管理员程序,再到核心的系统进程。低等级程序默认不能操控高等级程序。
UIPI(界面特权隔离) 基于 IL 实现"防骚扰"——阻止低权限程序向高权限窗口发送消息、读取内容或安装钩子,防止恶意软件伪造点击劫持银行转账等"粉碎攻击"。
UIAccess(特许通行证) 是打破隔离的例外——屏幕阅读器等辅助功能需要操控所有窗口,因此可通过数字签名+安全目录+清单声明获得跨等级操作权限

获得 UIAccess 的严格条件:
数字签名: 程序必须经过受信任机构的数字签名。
安装目录: 程序必须位于安全目录中(如 C:\Program Files 或 C:\Windows\System32)。
清单声明: 在 .manifest 文件中明确申请该权限,需要注意 .manifest 是嵌入在 exe 文件中的。

那么现在我们如何获得system权限呢??

3.2.2 安全桌面

答案就在安全桌面。安全桌面和用户桌面的主要区别在于,只有作为 SYSTEM 运行的受信任进程才被允许在此执行。换句话说,安全桌面上不存在任何以用户权限运行的进程

为什么这么设计呢?

是为了防止恶意软件(即使是高权限的)通过模拟点击来绕过安全确认,Windows 将界面划分成了不同的物理隔离区域,当你在用户桌面(Session 1)运行一个需要管理员权限的安装包时,系统发出提权请求,Winlogon 立即切换当前的活动桌面,将显示输出切换到安全桌面,你在安全桌面上点击“确定”后,Winlogon 再将控制权切回用户桌面。

当用户通过选项锁定工作站(WIN+L)或“以管理员身份运行” 运行进程创建安全桌面会话(弹出 UAC确认窗口)时,将会启动两个atbroker.exe进程,一个在当前用户上下文运行,另一个作为系统账户运行。

作为低权限用户运行的ATbroker.exe进程将再次复制所有配置HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk

到HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session\ATConfig\osk

作为SYSTEM账户运行的ATbroker.exe进程将继续复制HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk

到HKU.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk

最后,启动一个以 SYSTEM 名义运行的 osk.exe 进程实例,并复制 以下值HKU\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk

到HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session\ATConfig\osk

四.攻击流程

第一步:准备攻击环境

# 1. 获取当前会话 ID
从访问令牌获取 Session ID

# 2. 启动隐藏的 osk.exe 并等待 5 秒
创建隐藏的屏幕键盘进程,确保系统后续会触发 oplock

第二步:创建注册表项

创建一个注册表HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk
并添加一个想覆盖高权限注册表项的值,比如:HKLM\SYSTEM\ControlSet001\Services\msiserver

第三步:设置机会锁

# 在 oskmenu.xml 文件上设置 oplock!
C:\Program Files\Common Files\microsoft shared\ink\fsdefinitions\oskmenu.xml
    ↑
这是屏幕键盘的 UI 定义文件,osk.exe 启动时会读取它

第四步:触发机会锁

通过 API 创建安全桌面来触发这个机会锁

一旦触发了 oplock,将注册表密钥替换为指向任意注册表密钥的注册表链接。 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session<session id>\ATConfig\osk

第五步:system的流程

atbroker.exe (SYSTEM) 尝试复制配置
    ↓
读取 HKCU\...\ATConfig\osk(包含恶意 ImagePath)
    ↓
写入 HKLM\...\Session<ID>\ATConfig\osk
    ↓
实际通过符号链接写到 HKLM\...\Services\msiserver
    ↓
服务配置被篡改,ImagePath 指向恶意程序

第六步:清理与执行

等待 5 秒后删除注册表符号链接(清理痕迹)

实际上这里就能看出来,这个权限提升漏洞的核心就是低权限用户任意注册表写入。而这个漏洞的作者给了最实质的一个攻击链条

1. 创建恶意配置  ──►  HKCU\...\ATConfig\osk
                           ↓
2. oplock 触发,符号链接替换目标
                           ↓
3. SYSTEM 进程复制配置 ──► 实际写入 HKLM\...\Services\msiserver
                           ↓
4. 服务配置被篡改:ImagePath = "恶意的服务程序
                           ↓
5. 创建 MSI COM 对象 ──►  启动 msiserver 服务
                           ↓
6. 服务以 SYSTEM 执行服务

实现手法

1.
RegPwn_yawataa.exe --regKey HKLM\SYSTEM\ControlSet001\Services\msiserver --regValueName ImagePath --regValueData "C:\Windows\System32\cmd.exe /c Kharon.x64.exe" --regValueType REG_EXPAND_SZ

注意这里的kharon.x64.exe最好改成绝对路径
# 2. 启动服务()
sc start msiserver

五.后言

我的c语言代码,原作者的代码是c#实现的,但是我个人用c实现了一次,有点画蛇添足,因为这个c#写的就可以用CRL机制内存执行了。后期可能我会写一个bof版本吧。

参考文章:

https://www.mdsec.co.uk/2026/03/rip-regpwnc/

https://mp.weixin.qq.com/s/rULYChYHUKd8TZJW8nBFfQ