分类:
2008-09-08 18:13:43
大约一年半以前,我给PsExec命令新设计了一个“-l”参数,这样我们就可以方便地在 XP的管理员帐户下,以标准用户的权限启动某个进程。在《Running as Limited User – The Easy Way》这篇文章里,我介绍了PsExec如何调用CreateRestrictedToken的API函数来创建上下文,该安全上下文来自于当前的登录帐户,但是排除了本地管理员组的成员关系,同时还排除了仅分配给管理员的特权(例如“调试程序”特权)。运行在该安全上下文中的进程,拥有标准用户的特权和访问权限,防止该进程修改系统文件和注册表键值,同时防止该进程使用只有管理员才能拥有的特权,例如“加载和卸载设备驱动程序”特权。
盆盆评注 在 Vista下,不仅可以用PsExec命令以标准用户权限运行进程。还可以用软件限制策略、“运行方式”、以及DropMyRights命令等方法,以更低权限运行进程,具体可见盆盆的文章《IE浏览器的最佳安全保护》。
在受限令牌所形成的隔离沙盒中,唯一的缺陷是:在隔离沙盒中的进程是以当前用户的身份运行的,所以只要当前用户有权读写的文件、注册表键值、甚至别的进程,该进程都能访问。这样就能打穿隔离沙盒的墙壁,如果恶意代码是专门为这种受限环境而编写的,那么它就可以利用这种手段,绕过隔离沙盒的限制,从而窃取完全的管理员权限。对于恶意程序来说,很有一个很简单的方法,只需使用OpenProcess函数,就可以读写隔离沙盒外的某个进程,并用自己的代码感染该进程,再插入一个线程,就可以执行代码。因为其他进程是以当前用户身份运行的,而Windows安全机制默认允许当前用户可以完全访问所有用户进程,因此沙盒里的进程也可以打开沙盒外的用户进程。还有一个方法,受限进程可以给正常进程(例如Explorer)发送窗口消息,用定制的鼠标和键盘输入来控制该正常进程,这样就能按照恶意程序的意图执行代码。
盆盆评注 粉碎攻击等就是利用这种代码注入的方法提升权限。
既然有那么多漏洞,为什么还要推荐大家使用这个PsExec参数?这是因为使用这种隔离沙盒的用户并不多,所以恶意程序的作者一般不愿意花费精力编写代码,绕开这种隔离沙盒的限制。
然而在Windows Vista下,情况发生了变化,这是因为采用了用户帐户控制和IE保护模式,隔离沙盒的安全得到了很大的增强。接下来我们一起探讨一下Windows Vista里的隔离沙盒,如何借助PsExec的最新版本,让进程运行在Windows Vista的最新隔离沙盒中,同时还将描述其安全内在意义。
在用户帐户控制下,所有用户(包括管理员),都运行在标准用户权限下。如果某个程序需要管理员权限,可以在程序清单(代码中内嵌的XML)的requestedExecutionLevel参数中赋值“requireAdministrator”。如果当前帐户是管理员,默认会弹出一个“用户帐户控制”对话框,询问是否允许该程序以管理员权限运行。如果当前用户是标准用户,则需要在“用户帐户控制”对话框上输入某个管理员帐户的凭据,以便提供管理员权限。
盆盆评注 要了解更多有关用户帐户控制的信息,包括应用程序如何通过程序清单的定义来通知Windows它所需的权限等等,可以参考盆盆的文章《Windows Vista用户帐户控制深入剖析》。
在用户帐户控制中,给程序提供管理员权限的过程称作“提升权限”。无论是在标准用户环境里提升权限(OTS:即时提升),还是在管理员环境里提升权限(AAM:管理员批准模式),不管是以提升权限运行的进程(高级进程),还是以标准权限运行的进程(标准进程),它们都位于同一个桌面上。在标准用户环境里,高级进程和标准进程,它们以不同的帐户身份运行,所以Windows安全机制可以在高级进程周围竖立隔离墙,以防标准进程在高级进程中写入代码。但是以前的Windows安全机制并不阻止标准进程向高级进程发送欺骗性质的鼠标和键盘输入消息,同时也不会把标准进程放入隔离沙盒(以防它们攻击高级进程)。因此Windows Vista引入了Windows完整性机制,在标准进程的隔离沙盒的外围再添加一圈篱笆。
在Windows Vista的完整性机制下,每个进程都在某个完整性级别(IL)下运行,同时每个资源对象也具有完整性级别。主要的完整性级别(IL)有四个:低级、中级(默认,标准进程)、高级(高级进程)和系统。Windows的窗口系统采用完整性机制,以防止较低完整性级别的进程向较高完整性级别进程的窗口发送大多数窗口消息,这种保护机制叫做用户界面特权隔离(UIPI)。Windows Vista的最新安全机制还有一个改变,只有进程的完整性级别等于或者高于某个资源对象的完整性级别时,该进程才能打开该资源对象进行写入操作。而且,为了防止访问存放在内存中的机密信息,进程不能打开拥有更高完整性级别的其他进程进行读取操作。
盆盆评注 Mark的原文举例介绍进程和资源对象的隔离(低级别进程不能写入高级别的资源对象),参见下方的正文部分。这里补充一个实例,介绍进程之间的隔离(均以管理员帐户登录系统)。
[1]