欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

Windows Vista服务隔离深度剖析

作者:彭爱华

难度:Level 300

提示 如需测试本文所描述的实验,请务必下载安装最新版本的Process Explorer(本文撰写时的最新版本是V10.11)

http://www.sysinternals.com/Utilities/ProcessExplorer.html

 

Windows 2000/XP下,我们经常把应用程序安装为服务,这样的好处是由于应用程序运行在Local System帐户权限下,所以即使注销后,该应用程序(服务)还能继续运行。例如为了对登录问题进行排错,我们可以把regmonfilemon安装为服务,这样它们就可以对登录、注销过程记录日志。关于Windows 2000/XP下把应用程序安装为服务的方法,可以参考笔者的文章《将Virtual PC虚拟机安装为服务》

 

然而Windows Vista,却不再提供这种免费午餐!原因是Windows Vista中的所有服务,都运行在Session 0环境下,而且Session 0现在默认不能交互(non-interactive),这称为Session 0隔离(可以参考笔者的《您必须知道的Windows Vista安全功能())

 

Windows Vista的所有服务都运行在Session 0下,而第一个交互登录的帐户则是运行在Session 1环境下(后续通过快速用户切换登录的用户就位于Session 23)。所以就算设置服务类型为Interactive,但是由于其窗口(对话框)是在Session 0打开,所以位于Session 1的我们永远无法看到!这就好比在黑暗中向美女眨眼睛……

 

不过Windows Vista还是提供了一种兼容的方法,让我们可以通过切换Session的办法,来访问服务的UI。这样我们就可以勉强把应用程序安装为服务,下面以Process Explorer应用程序为例,介绍如何在Windows Vista下把应用程序安装为服务。

 

(1)  首先确保已经安装了Windows Server 2003 Resource Kit Tools(可以到微软网站上下载),假设安装在默认路径下。

(2)  以提升权限打开命令提示符窗口,并运行以下命令:

sc create Procexp type= interact type= own start= auto binpath= "C:\Program Files\Windows Resource Kits\Tools\srvany.exe" obj= LocalSystem displayname= "Process Explorer"

(3)  然后打开注册表编辑器,可以看到在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下新增了一个Procexp子项,进入其下的Parameters子项,在右侧的详细窗格里新建一个字符串键值Application,并将其数值数据设置为以下内容:

C:\Program Files\Process Explorer\procexp.exe

(4)  打开services.msc服务管理单元窗口,确保“Interactive Services Detection”服务没有被禁用。

(5)  启动新建的“Process Explorer”服务,这时候“Interactive Services Detection”服务会自动启动,并检测到Process Explorer试图在Session 0打开自己的程序窗口,就会弹出一个“Interactive Services Dialog detection”对话框,如下图所示。

 

(6)  单击其上的“Check request”按钮,系统就会切换到Session 0状态下,这样我们就可以看到Process Explorer的窗口了,如下图所示。操作完毕,单击“Interactive Services Dialog detection”对话框上的“My desktop”按钮,即可回到原来的桌面。

 

 

Session 0里,可以看到系统启动了两个UI0Detect.exe进程,这就是“Interactive Services Detection”服务的Host进程。这两个进程(服务)分别工作在Session 01下,负责发送切换Session的消息。

超级另类的“UAC

利用这个实验居然还能构造出一个非常“另类”的UAC进程,这个进程是以LocalSystem帐户身份启动的,但是却能够获得一个UAC访问令牌!

 

(1)  启动先前创建好的Process Explorer服务,并根据提示切换到Session 0下,以便显示其图形界面。

(2)  单击Process ExplorerFileRun as Limited User,在打开的对话框里输入某个进程的名字,例如cmd,并回车,如下图所示。

 

(3)  接下来就可以打开一个命令提示符窗口,由于其父进程是Process Explorer(运行在LocalSystem帐户下),所以cmd默认也以LocalSystem身份运行。然而cmd进程居然获得的是一个UAC访问令牌(),同时怪异的是其Mandatory Label SID居然还是显示为“System Mandatory Level”!如下图所示。

 

 

接下来就对这个怪异的cmd窗口进行测试,发现其“特异功能”还不少,以下仅举两例:

 

(1) 首先尽管它获得的是一个UAC Token,但是由于其帐户身份是LocalSystem,所以还是可以运行一些普通UAC进程所无法运行的管理任务,例如在该cmd窗口里,可以顺利运行bcdedit命令显示当前系统的启动设置。

原因是因为LocalSystem帐户的特殊性,系统中绝大多数的目录和注册表键值都对LocalSystem“显式”地赋予完全控制权限,所以尽管cmd的访问令牌过滤了administrators帐户组的SID,但是照样可以访问BCD数据库,而这是普通UAC进程办不到的(除非系统提示提升权限)

(2) 不过也有它办不了的事情,从上图中可以看出,该cmd窗口的访问令牌里没有SeTimePrivilege,所以该命令提示符下无法修改系统时间,例如无法用time命令修改当前的系统时间,系统会“哭诉”没有SeTimePrivilege特权,如下图所示。

 

 

所以说,尽管LocalSystem身居“宰相首辅”的“要职”,一时风光无限,但是居然也有皱眉头的时候!

为什么Vista有两个CSRSS进程?

这篇文章还捎带着解释了一个我困惑已久的问题,那就是为什么Windows Vista默认状态下就拥有两个csrss进程,读者朋友可以自己打开任务管理器进行验证。

 

大家知道csrssWindows子系统(Windows Subsystem)的用户模式部分,在Windows 2000/XP/2003下,通常我们只能看到一个csrss进程。

 

但是为什么Windows Vista会拥有两个进程?这个现象让笔者百思不得其解。通过今天的实验,突然有了醍醐灌顶的感觉,心里透亮─问题就出在Windows Vista服务上!就是因为服务的session 0隔离,导致Interactive用户登录以后,系统将会同时打开两个session(01),所以Windows Vista才需要两个csrss进程,分别为这两个session服务!

 

其实对于我们的Windows XP/2003,也会有类似的情况发现:

1Windows Server 2003

Windows Server 2003下,假设当前的登录帐户是Admin,位于Session 0。这时候如果用另外一个帐户Peter通过远程桌面登录到服务器上,这时候Peter位于Session 1。然后打开Process Explorer,这时候也会发现有两个csrss进程,分别位于Session 0Session 1

2Windows XP

Windows XP下,假设有两个管理员帐户AdminPeter,当前登录帐户是Admin,位于Session 0,这时候利用快速用户切换功能(FUS)登录到Peter,现在Peter用户位于Session 1。然后打开Process Explorer,这时候也会发现有两个csrss进程,分别位于Session 0Session 1。这个道理类似于远程桌面─FUS本来就可以看成是远程桌面的特殊形式。

 

如果仔细观察的话,就会发现采用以上方法的Windows XP/2003除了拥有两个csrss进程外,还同时拥有两个explorer等进程。这在Windows Vista下是看不到的,这是因为Session 0Vista下被标识为Noninteractive,所以没有必要拥有另外一套Shell进程。

已发表 2006年6月9日 11:44 作者 ahpeng

评论通知

如果您想在帖子更新时接到邮件通知,请先登录。这里

订阅帖子评论使用 RSS

评论

2006年9月29日 10:00 by wuzhen0000

# re: Windows Vista服务隔离深度剖析

把服务隔离了 OS安全多了 可是还有不安全的 如果病毒、木马或者其他恶意软件把自己安装成服务怎么办?一样和服务在一个会话里啊。
2006年10月1日 0:08 by ahpeng

# re: Windows Vista服务隔离深度剖析

To EvilAngel:
您这个问题其实是一个悖论,因为这需要事先假设病毒木马已经拿到管理员权限。
如果恶意程序已经拿到管理员权限,那么它们已经可以做任何事情。
2007年4月14日 12:30 by 盆盆的博客

# Windows Vista的UAC对话框果真是在会话0吗?

小青蛙s老大新发表的 雄文 ,可以让读者朋友对UAC安全桌面的切换机理又加深了印象。例如读者朋友们可以知道,为了防止用户进程干扰UAC的对话框,可以让它运行在安全桌面上。而大家知道,安全桌面(Winlogon桌面)默认是蓝绿色背景的,为了改善用户体验,微软特地对当前用户桌面截图,并以截图作为安全桌面的背景,这样看上去稍微舒服一些。这个原理,在盆盆的拙作

2007年4月14日 12:36 by 盆盆的博客

# Windows Vista的UAC对话框果真是在会话0吗?

小青蛙s新发表的文章,可以帮助读者朋友进一步了解UAC安全桌面的机理。本文要讨论的是,默认启用安全桌面后,UAC对话框真的运行在会话0上面吗?本文用实验来查看,并试图给出原理解释。

2008年4月27日 22:48 by haiwai

# re: Windows Vista服务隔离深度剖析

非常感谢:盆盆!你的文章解答了我很多困惑。

我是一名开发人员,在最近把老的程序,升级到VISTA下的时候,就遇到服务程序不能和系统产生交互界面,研究了2昼夜了,还是不行,郁闷极了。而这些程序在2000/XP/2003下运行的好好。

看到您的这篇文章才理解是VISTA的隔离造成的,虽然我的服务能顺利创建和启动,但是界面在秀出来的时候出现了一个提示“交互式服务对话框检测”,点击才显示出来。而我的程序是在2000\XP\2003下是隐藏运行的,通过热键呼叫出操作界面,只有老板才知道热键的设置普通员工是不知道热键和界面的密码,而注册全局热键在VISTA下也注册不上。后来只好不隐藏直接显示了。

想问问盆盆,难道VISTA下服务就不能像2000/xp下那样流畅的运行吗?想秀就能秀出来,不想秀就让他在后台待着,随时响应键盘热键的呼唤。

能否和您EMAIL交流一下。

再次感谢!

2008年4月27日 22:49 by haiwai

# re: Windows Vista服务隔离深度剖析

忘记我的写我的EMAIL了,haiwaimeng$163.com

其中$是@,怕EMAIL机器人给提取了。

说说您的看法?

(必填) 
必填 
(必填)