利用 Windows 更新堆栈获取系统访问权限(CVE-2025-21204)

CVE-2025-21204 是 Windows 更新堆栈中的一个本地提权漏洞。攻击者通过滥用目录连接点或符号链接,可以劫持由 MoUsoCoreWorker.exe 等以 SYSTEM 级别运行的进程所访问的可信路径,并以提升的权限执行任意代码。该漏洞已于 2025 年 4 月发布补丁。CVE-2025-21204 不需要零日漏洞利用或复杂的内存破坏链,也不需要钓鱼活动或投放恶意软件加载器。它只需要:滥用可信文件系统、一个可写文件夹以及一个按设计运行的 SYSTEM 进程。

在红队行动中,并非所有 CVE 都需要是炫目的远程代码执行漏洞或内核级漏洞。有时,最毁灭性的结果来自于隐藏在众目睽睽之下的提权漏洞。它不需要复杂的利用技术、崩溃进程或触发 EDR 签名。相反,它利用了一个设计缺陷——假设特定文件路径始终是安全的。这个“低级别”的 CVE 允许非管理员用户通过简单地重定向可信文件夹来提升到 SYSTEM 权限。没有代码注入,没有漏洞开发,只是一个连接点和时机问题。

红队成员喜欢这类 CVE,因为它:

  • 能够绕过大多数 EDR 启发式检测(没有利用载荷或注入)
  • 与合法更新行为融为一体
  • 在模拟和真实环境中都可靠
  • 可以与初始访问向量(如钓鱼、配置不当的 LAPS 或令牌盗窃)结合,以建立完整的 SYSTEM 控制

简而言之,低 CVSS 分数 ≠ 低影响,CVE-2025-21204 提醒我们,一个“简单”的漏洞,如果创造性地使用,可以攻陷整个系统。

Windows 更新堆栈提权漏洞

CVE 详细信息

  • CVE 编号:CVE-2025-21204

  • 发布时间:2025 年 4 月补丁星期二

  • CVSS 分数:7.8(高)

  • 影响:提权

  • 攻击向量:本地

  • 可利用性:低复杂度,无需用户交互

  • 受影响组件:Windows 更新堆栈(MoUsoCoreWorker.exeUsoClient.exe

  • 已修复版本:2025 年 4 月通过 Windows 更新发布的累积更新

包含内容

该漏洞存在于负责检查、下载和安装更新的 Windows 更新堆栈中,相关进程包括:

  • MoUsoCoreWorker.exe

  • UsoClient.exe

这些进程以 SYSTEM 权限运行,并访问路径:C:\ProgramData\Microsoft\UpdateStack\Tasks

在存在漏洞的情况下,它们可能会信任并执行该位置的文件,而不会验证文件的来源、完整性或访问控制列表(ACL)。

潜在影响

如果攻击者没有管理员权限,但可以控制该目录的内容(直接或间接),他们可以:

  • 在该路径中放置脚本、DLL 或二进制文件
  • 等待或触发更新扫描
  • SYSTEM 进程可能会加载或执行攻击者的文件,从而赋予他们 SYSTEM 权限

这是一种经典的可信路径滥用场景,常见于提权链中。微软通过以下方式解决了该漏洞:

  • 验证 UpdateStack\Tasks 路径中文件的所有权和 ACL
  • 确保 SYSTEM 进程仅信任由 SYSTEM 或可信安装程序拥有的文件
  • 可能加强或移除更新堆栈中的外部基于文件的任务定义

一个吊毛文件夹

2025 年 4 月更新后的“inetpub”文件夹

随着 2025 年 4 月 Windows 10 及更高版本的累积更新(KB5055523)发布,系统驱动器根目录下出现了一个新文件夹:C:\inetpub。传统上与 IIS 相关联。这个文件夹的意外出现引发了问题,尤其是在未安装或启用 IIS 的系统上。

最初在官方发布说明中未被记录,这个空的且看似不活跃的 inetpub 文件夹引发了用户猜测它是否是开发中的遗留产物或是一个错误。微软随后澄清,该文件夹是故意创建的,是关键安全改进的一部分。

该更改解决了 CVE-2025-21204,这是一个允许本地攻击者通过 Windows 更新利用符号链接(symlink)攻击的漏洞,可能会未经授权访问受保护的系统文件或目录。作为修复的一部分,系统预先创建了某些目录——包括 C:\inetpub——以加强更新过程并缓解此类攻击。

关键要点如下:

  • 存在是故意的:该文件夹并不表示 IIS 已被安装或激活。其创建是通用补丁的一部分,与任何 Web 服务器配置无关。
  • 不要删除:尽管该文件夹为空且技术上可以删除,但不建议这样做。它的缺失可能会危及应用的安全修复的完整性。
  • 无需采取行动:该文件夹对系统没有性能或功能影响。IT 管理员和最终用户如果发现它存在,则无需采取任何额外步骤。
  • 已经删除怎么办? 如果你已经删除了它,微软建议重新安装 2025 年 4 月的累积更新以确保完全保护。或者,该文件夹将在下一个累积更新中恢复。

简而言之,C:\inetpub 现在是 Windows 更广泛安全态势中一个安静但必不可少的部分——不是令人担忧的原因,而是增强对不断演变的威胁防护的一个标志。

攻击剖析

CVE-2025-21204 是 Windows 更新堆栈中的一个本地提权漏洞。当 SYSTEM 级别的更新进程信任并执行来自可被 NTFS 连接点重定向的路径的脚本时,且不验证所有权或完整性时,就会出现该漏洞。

利用流程——仅使用 PowerShell 实现 SYSTEM 提权

我编写了一个 PowerShell 脚本,执行以下操作:

  • C:\inetpub\wwwroot 中创建一个名为 updatehelper.ps1 的有效载荷,用于添加一个新的本地管理员(redteam)。

  • 删除 C:\ProgramData\Microsoft\UpdateStack\Tasks(如果存在),并用一个指向 inetpub 的连接点替换它。

  • 监控更新进程,如 UsoClient.exeMoUsoCoreWorker.exeTiWorker.exe

  • 当检测到这些进程时,部署连接点,将更新堆栈的信任代码执行重定向到攻击者的有效载荷。

当 SYSTEM 级别的进程运行被劫持的脚本时,无需触发 AMSI、Defender 或 WDAC 即可实现提权。

该利用不仅仅与 CVE-2025-21204 有关。它还展示了当可信进程不验证文件来源时,以及如何利用原生工具来颠覆文件系统信任边界。

这个基于 PowerShell 的概念验证:

  • 展示了 CVE-2025-21204 的核心逻辑
  • 仅使用原生 Windows 机制(无需编译或工具)
  • 利用更新堆栈的信任边界来提升权限
  • 完全符合微软安全公告所警告的利用路径

该脚本的攻击链假设 Windows 更新进程错误地遵循目录连接点(也称为 NTFS 挂载点或符号链接),并且在不强制执行权限边界或验证所有权的情况下,从用户控制的路径执行脚本或文件。

该脚本通过在受信任但配置不当的目录(C:\inetpub\wwwroot)中植入 PowerShell 有效载荷,并用一个指向有效载荷位置的连接点替换合法的更新相关目录(C:\ProgramData\Microsoft\UpdateStack\Tasks)。然后它等待更新进程(如 UsoClient.exeTiWorker.exe)激活,有效地允许非特权攻击者以 NT AUTHORITY\SYSTEM 身份执行代码。

CVE-2025-21204 利用模拟

附件脚本演示了利用 CVE-2025-21204 的本地提权技术。该技术利用 Windows 更新堆栈未能正确验证可信路径的逻辑缺陷,通过可写文件夹和 NTFS 连接点的重定向技巧,模拟出一个以 SYSTEM 级别执行的 DLL 载荷。

p2

p3

初始条件

  • 攻击者以标准用户(非管理员)身份运行。

  • 目标系统尚未创建以下文件夹:

    C:\ProgramData\Microsoft\UpdateStack\Tasks

  • 预期 Windows 更新进程将运行(手动触发或按计划执行)。

载荷准备

  • C:\Users\<用户>\AppData\Roaming\Microsoft\UpdateStack\Tasks\UpdateStackAgent.dll 写入一个伪造的 .dll 载荷。

  • C:\Users\Public\ 中创建第二个文件(cve2025-proof.log),用作执行证明标记。

  • 该载荷仅在证明文件中写入带时间戳的消息。

记录结果

  • 如果载荷被 SYSTEM 进程触发:

    • 证明文件的所有者将是 SYSTEM。

    • 脚本记录“易受攻击”的结论。

    • 法医日志写入:

      • evidence.txt — 时间戳和文件所有者。

      • simulation.log — 设置信息和路径。

      • vulnerable.txt — 根据结果记录 truefalse

  • 如果未发生执行,则记录“失败”的结果。

CVE-2025-21204 检测

检测试图劫持 UpdateStack 的连接点创建。

1
2
3
4
5
6
DeviceProcessEvents
| where FileName =~ “cmd.exe”
| where ProcessCommandLine has_all(“mklink”, “/J”)
| where ProcessCommandLine has “Microsoft\\\UpdateStack”
| where ProcessCommandLine has_any(“AppData”, “Users”)
| project Timestamp, DeviceName, InitiatingProcessAccountName, InitiatingProcessParentFileName, ProcessCommandLine, FileName

检测命令行中引用 UpdateStack 路径的异常情况。

1
2
3
4
DeviceProcessEvents
| where ProcessCommandLine has “Microsoft\\\UpdateStack”
| where ProcessCommandLine has_any(“AppData”, “Users”)
| project Timestamp, DeviceName, InitiatingProcessAccountName, InitiatingProcessParentFileName, ProcessCommandLine, FileName

p1

通过 Microsoft Defender XDR 茶点,关联连接点创建、恶意载荷投放、SYSTEM 级别更新进程执行以及执行后证据,检测 CVE-2025-21204 的完整利用链。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
let junction_creation = DeviceProcessEvents
| where FileName =~ “cmd.exe”
| where ProcessCommandLine has_all(“mklink”, “/J”)
| where ProcessCommandLine has “Microsoft\\\UpdateStack”
| extend EventType = “JunctionCreation”
| project Timestamp, DeviceName, Account=InitiatingProcessAccountName, FileName, ProcessCommandLine, EventType;

let bait_payload_drop = DeviceFileEvents
| where FolderPath has “AppData\\\Microsoft\\\UpdateStack”
| where FileName endswith “.dll” or FileName endswith “.ps1” or FileName endswith “.log”
| extend EventType = “PayloadDrop”
| project Timestamp, DeviceName, Account=InitiatingProcessAccountName, FileName, FolderPath, EventType;

let update_stack_execution = DeviceProcessEvents
| where FileName in~ (“MoUsoCoreWorker.exe”, “UsoClient.exe”, “TiWorker.exe”)
| where InitiatingProcessAccountName == “SYSTEM”
| extend EventType = “UpdateProcessExecution”
| project Timestamp, DeviceName, Account=InitiatingProcessAccountName, FileName, ProcessCommandLine, EventType;

let system_writes_to_user = DeviceFileEvents
| where InitiatingProcessAccountName == “SYSTEM”
| where FolderPath startswith “C:\\\Users\\\”
| where FileName endswith “.dll” or FileName endswith “.log”
| extend EventType = “SYSTEMWriteToUserSpace”
| project Timestamp, DeviceName, Account=InitiatingProcessAccountName, FileName, FolderPath, EventType;

let registry_artifacts = DeviceRegistryEvents
| where RegistryKey has “Microsoft\\\UpdateStack” and ActionType in (“CreateKey”, “SetValue”)
| extend EventType = “RegistryModification”
| project Timestamp, DeviceName, Account=InitiatingProcessAccountName, RegistryKey, RegistryValueName, EventType;

union junction_creation, bait_payload_drop, update_stack_execution, system_writes_to_user, registry_artifacts
| sort by Timestamp desc

通过 DeviceEvents 检测 C:\inetpub 上的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DeviceEvents
| where FolderPath startswith “C:\\\inetpub”
or FileName has “inetpub”
or AdditionalFields has “inetpub”
| project
Timestamp,
DeviceName,
ActionType,
InitiatingProcessAccountName,
InitiatingProcessFileName,
FolderPath,
FileName,
AdditionalFields
| sort by Timestamp desc

p4

加固建议

  • 立即使用 2025 年 4 月的更新进行修补。

  • 限制 C:\ProgramData\Microsoft\UpdateStack 的 ACL。

  • 使用 AppLocker 或 WDAC 防止创建符号链接。

  • 即使未安装 IIS,也要监控 inetpub 中的文件创建。

总结

CVE-2025-21204 是一个典型的案例,展示了当特权执行上下文中的隐式信任遇到路径重定向时会发生什么。它不依赖于内存破坏、内核漏洞或用户交互,而是利用 Windows 更新堆栈进程从磁盘加载任务定义时的一个逻辑缺陷。

通过利用可写且过度信任的目录(C:\ProgramData\Microsoft\UpdateStack\Tasks),本地攻击者可以:

  • 使用 NTFS 连接点将文件夹重定向到自己的载荷存储位置,

  • 投入恶意脚本或二进制文件,并

  • 劫持像 MoUsoCoreWorker.exeUsoClient.exe 这样的 SYSTEM 级别进程。

最后,微软在非 IIS 系统上部署一个意外的 C:\inetpub 文件夹是一个巧妙的策略,用于在符号链接攻击发生之前进行预防,这是在文件系统层面进行主动安全加固的一个罕见例子。

这个 CVE 不仅仅揭示了一个漏洞,它还突显了现代 Windows 环境中可信执行路径的复杂性和脆弱性。对于攻击者来说,这是一个低噪音的 SYSTEM shell。对于防御者来说,这是一个关于现实世界中基于文件的本地提权漏洞的蓝图。

CVE-2025-21204 是一个有力的提醒,文件系统信任和内存破坏一样危险。该利用方法优雅、简单且强大,再次证明:低 CVSS 分数 ≠ 低影响。

后台回复CVE-2025-21204获取exploit。


利用 Windows 更新堆栈获取系统访问权限(CVE-2025-21204)
http://example.com/2025/04/24/利用Windows更新堆栈获取系统访问权限(CVE-2025-21204)/
Author
Jentle
Posted on
April 24, 2025
Licensed under