flawopen.com/安全事件/Windows Update 符号链接劫持提权 0-day

Windows Update 符号链接劫持提权 0-day

高危 · CVSS 7.8 CWE-59: 不当符号链接解析 (Link Following) 在野 0-day 复盘 · 2026年9月
ELI5 (通俗解释)

想象一座办公大楼的收发室在公共大厅设有一个普通信箱,任何人都可以往里投递信件。一名实习生在信箱内部贴了一张纸条,上面写着:'请将本信箱内所有物品直接转交送入总裁的私人绝密保险库'。夜幕降临,拥有全大楼最高权限的夜间保安(以 SYSTEM 身份运行的 Windows Update 服务)前来收件。保安没有核实纸条的真实来源,盲目遵从指示,直接用总万能钥匙打开了总裁的私人保险库,将实习生的包裹送入并重设了门禁权限,导致实习生兵不血刃获得了整栋大楼的最高主宰权限。

核心技术概念
NTFS 目录连接点 (Junction / Reparse Point)
Windows NTFS 文件系统的一项高级特性,能够将一个目录透明重定向到系统中的另一个目标目录,调用者通常难以察觉。
符号链接跟随缺陷 (CWE-59: Link Following)
高权限系统服务在访问指定路径时,未核实该路径是否包含低权限普通用户创建的软链接或重定向点,盲目跟随导致越权操作。
Windows 更新编排服务 (UsoSvc / MoUsoCoreWorker)
以 NT AUTHORITY\SYSTEM 最高系统权限在后台运行的核心服务,负责扫描、分发和应用操作系统更新文件。
任意文件覆写与 DACL 篡改
利用高特权系统服务的写文件或赋权逻辑,强行覆盖关键系统二进制文件或将受限目录的控制权赋予普通用户。

事件全景复盘

On September 8, 2026 (September 2026 Patch Tuesday), Microsoft released patches for an actively exploited zero-day vulnerability tracked as CVE-2026-81963. The vulnerability was discovered in the wild being utilized by sophisticated threat actors to elevate from low-privileged user accounts (and sandboxed AppContainers) to full NT AUTHORITY\SYSTEM control on Windows 11 and Windows Server 2025.

Classified under CWE-59 (Improper Link Resolution Before File Access), the flaw resided in the Windows Update Stack—specifically the Update Orchestrator worker (MoUsoCoreWorker.exe). The service relied on a staging directory inside C:\ProgramData\USOPrivate\UpdateStore\ to cache download manifests, metadata, and temporary update CAB files.

Because standard unprivileged users have permission to create folders and manipulate files within ProgramData, attackers replaced the staging directory with an NTFS directory junction point pointing to protected operating system directories (such as C:\Windows\System32). When the Update Orchestrator initiated a background scan or update check, it executed file creation and DACL permission resets as SYSTEM without verifying whether the directory had been redirected, granting attackers full control over critical system binaries.

技术根本原因深度剖析

1. Permissive Staging Directory in a Shared Public Namespace

The Windows Update Stack used C:\ProgramData\USOPrivate\UpdateStore as its scratchpad. Under default Windows NTFS security descriptors, the C:\ProgramData root allows standard authenticated users to create subdirectories and files, creating a shared boundary between unprivileged users and a privileged system service.

2. Absence of FILE_FLAG_OPEN_REPARSE_POINT Validation

When MoUsoCoreWorker.exe accessed files and created folders in its staging directory, it invoked standard Win32 APIs (CreateFileW, CreateDirectoryW) without passing FILE_FLAG_OPEN_REPARSE_POINT. Windows transparently resolved the NTFS junction, redirecting the high-privilege write operations to the attacker's chosen target.

3. Unchecked Ownership and DACL Inheritance

The update worker failed to verify the filesystem security descriptor and owner SID of the staging path. If a path was owned by standard unprivileged users (e.g., BUILTIN\Users), the service should have rejected it immediately rather than trusting it for administrative operations.

漏洞机制 vs 生产加固对比

VULNERABLE: BLIND REPARSE POINT RESOLUTION (MoUsoCoreWorker)
// Conceptual flaw in Windows Update Stack worker
BOOL StageUpdateManifest(LPCWSTR manifestName, PBYTE data, DWORD size) {
  WCHAR targetPath[MAX_PATH];
  // Path under user-writable ProgramData!
  StringCchPrintfW(targetPath, MAX_PATH, L"C:\\ProgramData\\USOPrivate\\UpdateStore\\%s", manifestName);

  // VULNERABILITY (CWE-59):
  // CreateFileW does NOT specify FILE_FLAG_OPEN_REPARSE_POINT!
  // If 'UpdateStore' is an NTFS junction to C:\Windows\System32,
  // this creates/overwrites files in System32 as NT AUTHORITY\SYSTEM!
  HANDLE hFile = CreateFileW(
      targetPath,
      GENERIC_WRITE,
      0,
      NULL,
      CREATE_ALWAYS,
      FILE_ATTRIBUTE_NORMAL, // Missing FILE_FLAG_OPEN_REPARSE_POINT
      NULL
  );

  WriteFile(hFile, data, size, &written, NULL);
  CloseHandle(hFile);
  return TRUE;
}
HARDENED: REPARSE POINT CHECK & TOKEN IMPERSONATION
// Fixed Windows Update Stack implementation
BOOL StageUpdateManifest(LPCWSTR manifestName, PBYTE data, DWORD size) {
  WCHAR targetPath[MAX_PATH];
  StringCchPrintfW(targetPath, MAX_PATH, L"C:\\ProgramData\\USOPrivate\\UpdateStore\\%s", manifestName);

  // FIX 1: Open directory with FILE_FLAG_OPEN_REPARSE_POINT to detect junctions
  HANDLE hDir = CreateFileW(
      L"C:\\ProgramData\\USOPrivate\\UpdateStore",
      GENERIC_READ,
      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
      NULL,
      OPEN_EXISTING,
      FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
      NULL
  );

  // Abort if target directory is a reparse point / junction
  BY_HANDLE_FILE_INFORMATION fileInfo;
  GetFileInformationByHandle(hDir, &fileInfo);
  if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
    CloseHandle(hDir);
    return FALSE; // Access Denied: Junction detected!
  }

  // FIX 2: Validate owner SID must be SYSTEM or Administrators
  if (!IsOwnerSystemOrAdmin(hDir)) {
    CloseHandle(hDir);
    return FALSE;
  }

  // Safe write strictly constrained to verified non-reparse path
  return SafeWriteVerifiedFile(targetPath, data, size);
}

端点监控与遥测检测规则

# Sysmon Event ID 11: Detect junction point or symlink creation in USOPrivate EventID=11 AND TargetFilename="*\ProgramData\USOPrivate\*" # PowerShell: Audit reparse points under ProgramData Get-ChildItem -Path "C:\ProgramData" -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -ne $null } # Sysmon Event ID 1: Detect unprivileged usoclient triggers EventID=1 AND CommandLine="*usoclient*StartInteractiveScan*"
Monitor EDR telemetry for any standard user creating symbolic links or reparse points under system directories, or triggering update orchestration scans outside of scheduled maintenance windows.

系统架构师防范指南与清单

参考来源与官方公告