Windows Vista 下 Session 0 隔离的故事
作者:张康宗 (http://www.KZTechs.com)
难度:Level 300
这是一篇讲述Windows Vista 新增特性之一:Session 0 隔离的文章。通过这篇文章,可以让您对Windows Vista Session 0 隔离的特性有更清楚地了解。
由于我的文章有很多的图片,但是在这里编辑排版实在困难,在blog里面,我只得把文章中的全部图片删除,只保留了文字,完整版本的文章我已经放到我的网站上了,地址是http://www.KZTechs.com, 本文涉及到两个资源:
在 Windows XP、Windows Server 2003以及更早的Windows操作系统里面,所有的服务运行在一个叫做Session 0的会话里面。由于应用程序和服务都处于Session 0会话里面,这样就造成了服务可能成为恶意软件攻击的目标,这是因为服务的运行权限往往比一般的应用程序高,不少服务甚至运行在SYSTEM权限下,一旦应用程序获得了SYSTEM权限,则意味着他基本上可以做任何事情。
同时,如果一个恶意软件成功的在一个计算机里面创建了一个交互式服务,那么他可以做甚至包括向Windows应用程序窗口发送消息来达到控制应用程序的目的在内的任何事情。
l Windows XP/Server 2003 下的Session 使用的解释:
1) 当第一个用户登录进console以后,Session 0会被激活。在Session 0 里面,会有以下一些内容:
注解:在 Windows XP/Server 2003里面,Session 0里面是允许同时存在服务应用程序和一般应用程序的,也就是这一点给系统带来了潜在的危害,正如上面提到的,如果一个恶意软件成功的在一个计算机里面创建了一个交互式服务,那么他可以做甚至包括向Windows应用程序窗口发送消息来达到控制应用程序的目的在内的任何事情。
2) 由于Windows XP/Server 2003是支持多用户登录的,因此当第二个用户登录以后,会创建另外一个Session,Session ID为1。Session 1里面包括的内容为:
注解:在Windows XP/Server 2003 里面,Session 1只会存在普遍的应用程序,Session 1没有服务应用程序的。
3) 当第三个用户登录以后,Session 2会被激活,Session 2和Session 1类似,只有一般的应用程序。
上述说的是在Windows XP/Server 2003里面的情况,从上述描述可以得知,当有2个用户同时登录以后,只会存在Session 0和Session 1这两个Session ID。Session 2只有在第3个用户登录以后才会被激活。这个情况在Windows Vista 里面发生了一些变化。
l Windows Vista 下的Session 使用解释:
1) Session 0只会存在服务应用程序,而且交互式服务已经被取消了。在Windows Vista里面,Session 0的布局是这样的:
2) 当第一个用户登录以后,所有的应用程序运行在Session 1里面。这一点和Windows XP/Server 2003 是完全不同的。Session 1的布局是这样的:
3) 当第二个用户登录以后,Session 2被激活,在Session 2里面,只会存在普通的应用程序,其布局如下:
由于上述的变化,Session 0运行的服务应用程序再也不能和用户桌面直接的联系了。Session 0被隔离了。
如果一个服务应用程序想和一个运行在当前桌面上的Window应用程序进行通信,难度会大大地增加。这样的变化无疑增加了Windows的安全性,但是却造成了Windows Vista里面的一个兼容性问题:一些原本为Windows XP/Server 2003设计的需要服务的应用程序,在服务的设计上可能选择使用了交互式服务方式,如果这些应用程序在Windows Vista里面运行,必然会导致一个兼容性问题:服务和桌面的交互上会由于Session 0的隔离导致出现问题,桌面应用程序无法很好的和服务进行通信联系。
交互式服务在Windows Server 2003/XP里面,是能够经常看到的。也许因为交互式服务的选项在Services.msc里面仅仅是一个不起眼的复选框,很难让人引起重视,但是对于计算机安全来说,交互式服务的存在却有一些隐患。
如果一个服务被标注为交互式服务,那么意味着他可以和用户桌面进行通信,在Windows XP/Server 2003里面,如果一个服务没有被标注为交互式服务,如果它启动了一个窗口应用程序(例如:Windows画图工具),那么用户是没法看到他的,用户只能在进城里面发现该进程的出现,但是当这个服务被标注为交互式服务以后,就可以在用户桌面上出现画图的窗口,而且工作正常。
三、 Windows XP和Windows Vista Session 0对比实战
这里使用由 Smallfrogs 编写的Windows Vista Session 0 Isolate Test Service服务应用程序来解释Session 0在Windows XP和Windows Vista 里面的区别。Windows Vista Session 0 Isolate Test Service服务应用程序可以在 http://www.KZTechs.com/windowsvista/ 站点免费获取到。
l Windows XP SP2 环境:
i. 首先安装该服务:解压缩下载到的Windows Vista Session 0 Isolate Test Service服务应用程序,然后使用参数 WinVistaSession0IsolateSrv.exe /install 来安装该服务。
ii. 服务安装成功以后,使用 WinVistaSession0IsolateSrv.exe /start 来启动该服务。
iii. 上述两个步骤出现以后,会弹出一个询问对话框:
iv. 在回答这个对话框之前,我们使用 Microsoft Visual Studio 2005 来确认一下Windows XP 里面Session 0的布局情况:
上图说明了消息框是由CSRSS.EXE发出的。同时可以观察到Windows Vista Session 0 Isolate Test Service服务应用程序的确是运行在Session 0下的,同时运行在Session 0下的还有很多普通的应用程序,如下图所示的TIMPlatform.exe进程:
如果在上面提到的消息框里面点击“是”按钮,则会启动画图程序,使用Microsoft Visual Studio 2005观察可以知道画图程序也是运行在Session 0里面的,而且是以SYSTEM权限运行的。
v. 观察完以后,可以使用 WinVistaSession0IsolateSrv.exe /stop 命令停止服务。
vi. 使用 WinVistaSession0IsolateSrv.exe /uninstall 命令可以删除创建的 Windows Vista Session 0 Isolate Test Service服务。
l Windows Vista 环境
i. 首先还是需要安装Windows Vista Session 0 Isolate Test Service服务。在Windows Vista 里面,默认的命令行窗口是没有足够的权限进行服务安装操作的,首先需要使用 Run as administrator 对cmd.exe窗口进行权限提升。具体的权限提升操作是:
1. 进入%SystemRoot%\System32目录;
2. 找到cmd.exe,在他上面点击右键,选择Run as administrator
3. 在出现的UAC提示对话框里面,选择允许按钮即可完成cmd.exe的权限提升。
ii. 接下来需要完成服务的安装,服务的安装命令是: WinVistaSession0IsolateSrv.exe /install,安装完成以后使用WinVistaSession0IsolateSrv.exe /start 命令启动服务。
iii. 服务启动以后,会出现第一个需要关注的点:
在Windows XP里面,一旦启动服务,会立即弹出消息框,询问是否启动画图工具。但是在Windows Vista里面,默认情况下你不能看到这个消息框。这是因为在Windows Vista里面,服务应用程序是运行在Session 0上的,而您的桌面是处于Session 1上的,Session 0被隔离了。
为了缓解由于Session 0被隔离造成的兼容性问题,在Windows Vista里面,Microsoft 设计了一个新的服务“Interactive Service Detection Service”。该服务用于缓解应用程序的交互式服务在Windows Vista 里面的兼容性问题。
iv. 继续刚才的试验,我们手工启动“Interactive Service Detection Service”服务,这个时候,会出现一个新的由系统发出的询问对话框:
这个对话框的意思是说Windows Vista 检测到了一个交互式服务,询问是否需要响应这个交互式服务的请求。当点击Check request按钮以后,Windows Vista 将自动的切换到Session 0环境下,在Session 0环境下,是没有用户桌面环境的。但是可以看到由Windows Vista Session 0 Isolate Test Service服务应用程序发起的消息对话框:
在Windows Vista里面,由于Session 0的隔离,只有当切换到Session 0以后才能看到由交互式服务发起的消息对话框,而这个切换过程是需要另外一个系统自带的服务“Interactive Service Detection Service”来完成的。
如果需要从Session 0切换到Session 1,只需要点击 My desktop 按钮就可以切换回先前的Session环境了。
v. 最后,还是使用 Microsoft Visual Studio 2005 来验证一下在Windows Vista 下Session 0、Session 1的布局情况,从下图可以得知,在Windows Vista 里面,应用程序和服务是运行在不同的Session上的。普通应用程序运行的Session 1和服务运行的Session 0是两个不同的Session,这样就能缓解针对服务的恶意程序的破坏能力了。
在Windows Vista 里面,Microsoft 引入了Session 0隔离机制,由于这个机制的引入,一般的应用程序和服务是运行在不同的Session里面的,不同的Session由于拥有不同的消息循环,因此在Windows Vista里面,服务是无法使用像SendMessage或PostMessage等函数和应用程序通信的。操作系统的得到了一定程序上的安全性增强。