Windows Sudo命令深度解析:技术实现与安全隐忧
背景
Windows Insider预览版26052首次引入了sudo命令。本文将对其实现代码进行初步分析,需要说明该功能仍处于早期阶段。
执行sudo命令的基本方式为:
|
|
技术实现机制
权限提升基础
与Unix系统不同,Windows不存在SUID二进制文件等效机制。提升进程权限的唯一途径是:通过高权限进程启动目标进程,或用户自身具备SeImpersonatePrivilege等特权。自Vista起,UAC成为标准用户执行特权代码的主要方式——sudo正是基于此机制,通过ShellExecute的runas动词生成进程。
运行模式分析
系统设置中提供四种配置模式(注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Sudo):
- 禁用模式(值0):默认状态,仅提示"Sudo在此机器上被禁用"
- 新窗口模式(值1):直接将命令行传递至ShellExecute runas,等效于PowerShell命令:
1
PS> Start-Process -Verb runas powershell.exe
- 禁用输入模式(值2)与行内模式(值3):通过共享标准句柄将命令附加至当前控制台。底层通过提升sudo副本执行:
1
C:\> sudo elevate -p 1234 powershell.exe
RPC通信架构
行内模式依赖RPC通道突破UAC限制(无法将提升的控制台进程附加至低权限控制台)。关键RPC接口定义如下:
|
|
RPC服务器使用ncalrpc协议,端口命名格式为sudo_elevate_PID
。提升后的sudo实例会持续运行并接受新的进程附加请求,存在安全设计缺陷:任何用户均可连接至运行的RPC服务执行特权命令。
安全风险披露
ALPC端口权限配置缺陷
代码审计发现关键安全问题:
|
|
未设置安全描述符的ALPC端口DACL包含Everyone组权限,甚至允许受限令牌(如Chromium GPU进程)访问服务。在终端服务器等共享环境中,任何用户都可能获取管理员权限。
设计逻辑缺陷
- 模式参数可绕过系统设置(传递2启用禁用输入模式,其他值均启用行内模式)
- 命令行参数在提升过程中实际未被使用
- 缺乏调用者PID验证机制
技术实践评价
尽管微软采用Rust编写大部分代码值得肯定,但本案证明:内存安全语言无法防范逻辑漏洞。该功能本质上可通过PowerToy实现,无需深度操作系统集成,其安全风险与现有UAC机制相当。
注:本文基于Build 26052预览版分析,正式版实现可能有所调整。