Windows Vista的UAC功能浅析(4)
接下来的步骤不说也知道,切换到“Security”标签页,不出所料,dllhost进程的访问令牌里果然有SeSystemTimePrivilege特权,如下图所示。
现在真相大白了,原来Windows Vista表面上让rundll32进程“明修栈道”,背地里却让dllhost进程“暗渡陈仓”,真正让我们可以修改系统时间的是dllhost进程!
4.比较前后访问令牌的SID列表
仔细观察前后两个进程(rundll32进程和dllhost进程)访问令牌中的SID列表,会发现有以下两个显著的不同:
(1) rundll32进程:Administrators组SID被标记为Deny only,其含义类似于Windows XP/2003中Restricted Token。这表明Administrators组可以访问的资源,和我们无关,而Administrators拒绝访问的资源,我们也不能访问。
访问令牌里包含一个名为“Medium Mandatory Level”的古怪帐户(SID为S-1-16-8192)。
(2)dllhost进程:包含一个名为“High Mandatory Level”的“古怪”帐户(SID为S-1-16-12288)。
实验结论
1.UAP的实质
非Administrator的管理员登录时,Explorer进程会获得一个“缩水”的访问令牌,也叫标准用户(Standard User)访问令牌。由于其他进程大多数都是由Explorer启动,所以这些进程会自动拷贝这份“缩水”的访问令牌(如本例的rundll32进程)。凭借这份“缩水”的访问令牌,用户可以完成绝大多数工作,如果需要执行管理任务,系统会提醒用户进行确认,一旦认可,将会获得完全版本的访问令牌(如本例的dllhost进程)。
进一步验证发现,本例的rundll32进程由explorer进程启动,所以默认会获得一份“缩水”令牌;而dllhost进程则由某个svchost进程启动。
2.古怪帐户的作用猜测
至于前后两个进程的访问令牌中新出现的“古怪”帐户(一个是“Medium Mandatory Level”,另一个是“High Mandatory Level”)。这两个帐户,既不能用来登录,似乎也不能用来对资源的ACL赋值,到底用来做什么?
个人的猜测是用来标记访问令牌,这样系统看到访问令牌中包含SID为S-1-16-8192的帐户(Medium Mandatory Level),马上就可以知道该令牌属于标准用户令牌;同样如果令牌中包含SID为S-1-16-12288的帐户(High Mandatory Level),马上就知道其属于完全权限的令牌。
那么为什么不在访问令牌中新增一个标志位,例如等于0时就是标准用户令牌,等于1时就是完全权限令牌?个人猜测是为了兼容性,毕竟增加一个标志位,就等于要修改访问令牌的数据结构,这可不是一个好主意,而添加几个SID,则相对简单得多。
3.有趣的任务管理器
在实验中,还发现,如果右键单击任务栏空白区域,打开任务管理器(其父进程是Explorer),则任务管理器运行在标准用户的访问令牌下;而按下Ctrl+Shift+Esc组合键打开的任务管理器(其父进程是Winlogon),则运行在完全权限的访问令牌下。
最后小结
UAP好比给Windows Vista穿上一件铁布衫,有了它的庇护,像IE这样的进程不再奉行“不抵抗”政策,恶意网页胆敢再来“骚扰”,将被毫不犹豫地阻止。同时最终用户不再需要接受额外的培训,一切都由系统自动完成,只需要做出选择即可,你就没事偷着乐吧!
提示
1.有关UAC的官方资料,请参考Windows Vista开发组工程师Chen Yu先生的帖子:
http://blogs.itecn.net/blogs/yuchen/archive/2005/10/19/994.aspx
2. 有关SeSystemTimePrivilege特权的相关内容,参考了微软知识库文章编号KB 300022和《Windows Internals 4Edition》(Chapter 8 Security)中的相关内容。有兴趣的朋友可以阅读这些资料了解相关背景知识。
3. 有关帐户特权的更详细信息,可以参考以下微软官方网页(Windows XP Resource Kit):
http://www.microsoft.com/resources/documentation/Windows/XP/all/reskit/en-us/Default.asp?url=/resources/documentation/Windows/XP/all/reskit/en-us/prnd_urs_mhnn.asp
网友评论