Windows Vista UAC 和 可信任安全
Smallfrogs[张康宗]
http://www.KZTechs.COM
Level 200
UAC,Windows Vista 里面重要构成部分。对 Windows 安全保护起着绝对重要用途。
但是,UAC 不等于绝对安全,当你碰到UAC提示框的时候,请千万小心后面的陷阱:
众所周知,UAC提示框触发的时候,Windows 会检测新创建进程映象文件的数字签名:
- 如果新创建的进程的数字签名被阻止了,那么会显示一个红色的提示框:
- 如果新创建的进程没有合法的数字签名,那么会显示一个橘黄色的提示框。
- 如果新创建的进程拥有一个受信任的第三方数字签名,那么会显示一个灰色提示框。
- 如果新创建的进程拥有一个受信任的Microsoft数字签名,那么会显示一个绿色的提示框。

随着今后Windows Vista用户量的增多和培训的努力,大多数用户对于UAC的提示框都产生了一种条件反射:对于灰色或者绿色的UAC提示框完全信任,直接点击Continue按钮了。
这种做法产生了一种严重的安全问题点:UAC检查的是新创建的进程的映象文件。如果这个新创建的进程通过了UAC检查,那么他将获得完全的管理员权限,也就是说这个新创建的、通过UAC检查以后的进程,再创建其他的子进程,将不会触发UAC提示。
换句话说,如果利用某种手段,就可以让一个危险程序隐蔽的运行起来,而用户看到的UAC提示框不是直接针对这个危险程序的。
操作步骤:
- 在《如何将自身进程运行为admin模式》文中我说过,利用ShellExecute可以创建一个显式需要完整管理员权限的进程。
- 因此,我创建了一个Demo程序,显示的将命令行解析器 cmd.exe 创建为拥有完整管理员权限的进程。
- 先前说过,当一个进程拥有了完全管理员权限以后,它创建的子进程即使会触发UAC动作,也不会看到了。利用这个特性,我的Demo程序成功的将显示需要完整管理员权限且一定会触发UAC提示的 SREng 主程序创建起来了,且看到的UAC提示不是 SREng 的。
代码片段:
TCHAR szPath[] = _T("c:\\windows\\system32\\cmd.exe");
TCHAR szParam[] = _T("/c start d:\\Smallfrogs\\Codes\\SREng\\Product\\SREngPS.EXE");
ShellExecute(NULL, _T("runas"), szPath, szParam, NULL, SW_SHOW);
编译上述代码,运行以后会看到一个很有意思的现象:我希望运行SREng,但是不想看到SREng 的UAC,因此我用 cmd.exe 的UAC代替了SREng的UAC提示(如下图所示):
大多数用户看到上述的UAC提示框的时候,都会点击Continue按钮,因为UAC提示框是绿色的,很少有用户会点击 Details 按钮,因为这个按钮很不显眼。但是当我们点击Details按钮以后,我们会看到别有一番天地:

Details里显示:程序利用 cmd.exe 的 /c 参数创建SREng进程,而 cmd.exe 又被显示的被赋予完整管理员权限,因此 cmd.exe 创建的 SREng 进程也继承了 cmd.exe 的管理员权限,且不会出现 UAC 询问对话框。
利用上述方法,UAC 提示框被成功替换了。
解决方法
既然我今天公布了这个方法,那自然会公布相应的解决方法:碰到UAC提示的时候,切记一定要点击 Details 按钮,看看命令行参数。如上图那样,如果看到 cmd.exe 后面跟了一些不属于预期内容的参数,请不要点击 Continue 按钮,否则UAC这层脆弱的防护措施就失效了。
强烈建议每次看到UAC提示框,无论什么情况,都点击Details按钮看看,以免恶意程序神不知鬼不觉的被运行了。
Smallfrogs
http://www.KZTechs.COM