Windows 10静默漏洞缓解机制:NtLoadKey3系统调用的未文档化安全特性

本文深入解析Windows 10 2004引入的未文档化NtLoadKey3系统调用,该机制通过令牌模拟技术修复注册表加载过程中的符号链接攻击漏洞,探讨其技术实现及对第三方开发者的安全影响。

Windows 1%用户的静默漏洞缓解机制

随着Windows 10加速发布周期,微软经常引入新功能来缓解设计不良的API或易被滥用的行为。但许多缓解措施往往缺乏文档记录,甚至未通过常规Win32 API公开。这使得第三方开发者处于安全盲区。

未文档化的缓解案例

典型的静默缓解案例是OBJ_IGNORE_IMPERSONATED_DEVICEMAPOBJ_DONT_REPARSE这两个OBJECT_ATTRIBUTE标志——它们最终被文档化部分是因为我的建议。从修复我报告的漏洞到文档化用了5年时间,这在微软的时间尺度上可能算"迅速"。

NtLoadKey3系统调用

在Windows 10 2004(以及至少1909版本)中,微软引入了仅通过未文档化系统调用可用的新缓解措施。NtLoadKey3是注册表键加载功能的最新迭代:

  • 演进历史
    • 原始版NtLoadKey
    • XP时代NtLoadKey2增加标志位
    • NtLoadKeyEx添加可信配置单元支持
    • 现在NtLoadKey3采用全新设计

漏洞缓解原理

该调用主要修复以下安全问题:

  1. 加载完整注册表配置单元需要调用者的有效令牌具有SeRestorePrivilege权限
  2. API创建文件时(包括主配置单元和恢复日志)存在符号链接攻击风险
  3. 日志文件会继承主配置单元的安全描述符

新版本通过新增参数指定文件创建时模拟的访问令牌,使权限检查与危险操作使用不同令牌,从而有效缓解问题。用户配置文件服务现已采用此机制。

技术实现细节

逆向得到的函数原型:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
enum KEY_LOAD_HANDLE_TYPE {
    KeyLoadTrustKey = 1,
    KeyLoadEvent,
    KeyLoadToken
};

typedef struct _KEY_LOAD_HANDLE {
    KEY_LOAD_ENTRY_TYPE Type;
    HANDLE Handle;
} KEY_LOAD_HANDLE, *PKEY_LOAD_HANDLE;

NTSYSCALLAPI
NTSTATUS
NTAPI
NtLoadKey3(
    _In_ POBJECT_ATTRIBUTES TargetKey,
    _In_ POBJECT_ATTRIBUTES SourceFile,
    _In_ ULONG Flags,
    _In_ PKEY_LOAD_HANDLE LoadEntries,
    _In_ ULONG LoadEntryCount,
    _In_opt_ ACCESS_MASK DesiredAccess,
    _Out_opt_ PHANDLE RootHandle,
    _In_ PVOID Unused
);

新设计将信任密钥和事件句柄整合为句柄列表,提高了系统调用的扩展灵活性。最后一个参数用途尚不明确。

微软的文档化困境

尽管该安全修复已反向移植到所有支持的操作系统,微软仍未公开说明。在当前注重开发体验的微软生态中,此类关键安全特性的文档化仍然滞后,给第三方应用安全带来持续挑战。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计