Thursday, April 14, 2011

什么是window station

Window station 是一个不为人所熟知但是却是非常重要的安全特性,它被设计成为一个限制操作系统中窗口环境的“沙箱”。为了避免将访问控制列表(ACL)放置到每个窗口中和对每个窗口消息进行权限检查而导致的性能下降,我们简单地让窗口互相通知而不执行任何安全检查。然而,我们是在一个私有环境中这么做的,这就是 Window station。

Window station 是一个安全核心对象,它包括了剪贴板,一个私有的原子表格,一套桌面以及一套窗口。每一个进程都依赖于一个window station,而且这个关联通常平行于登录会话的分配。也就是说,对于每一个登录会话来说,都有一个相应的window station,就像下图所描述的那样。实际上,window station的名称得自登录会话标识符。例如,用于网络服务的window station 名称是Service-0x0-0x3e4$。偶尔一个internet后台服务程序(例如IIS)会自己管理window station,但这只是一个例外。还有一个“交互式”的window station, 它会一直存在,甚至没有交互式用户存在时也如此。这个特殊的交互式window station 的名字硬编码为WinSta0, 需要我们对它更对关注。

WinSta0是唯一的一个实际绑定到硬件上的window station.也就是说,你可以在这里看到窗口,并且它们可以接收到鼠标和键盘的输入。WinSta0也是高度安全的,它通过一个能够限制登录会话运行权限的ACL来达到此目的,尽管在上图中你也可以看到一些运行在SYSTEM登录会话中的高度受信的服务程序可能运行在这里,比如说使 winlogon.exe。WinSta0上的ACL在一个非常详细的等级上控制你的GUI可以做些什么,但是实际说来,这个一个要么全有,要么全无的授权,并且只有在限制哪个进程允许关联到window station时才真正需要。(也可以调用函数SetProcessWindowStation来改变进程所属的window station,或通过在调用CreatProcess时设置STARTUPINFO参数将新启动的程序附着到特定的window station).使用这种方法,windos station上的ACL就可以阻止其他登录会话中的程序入侵到你的窗口中。

拥有window station的一个实际用处就是避免来自相对于交互式用户的internet后台服务程序的攻击。如果进程运行在一个低特权账号中同时台帐号可以发送窗口消息到一个高特权级别的程序,那么它就控制了这个程序(这称为lurring attact)。因为window station边界通常是与登录会话边界是平行的,这就有助于阻止这类的攻击。

当一个进程又创建了另外一个,那么新的进程就被放置到与旧进程相同的window station中,除非你指明不这么做(但这种情况很少)。所以,就像是令牌和登录会话一样,一个新的进程很自然的继承了它的父进程的窗口环境。注意启动一个服务不同于简单的创建一个新的进程。当一个服务启动时,它就会由操作系统分配一个合适的登录会话何window station.

No comments:

Post a Comment