用户界面特权隔离 - 白皮书

介绍

在早期版本的Windows中,同一个用户帐号下运行的进程共享相同的安全权限。例如,一个线程可以发送窗口信息到另一个线程中的窗口。从Windows Vista开妈这个并不总能正常工作。新特性权限级别被附加到进程上(也可以是其它特性)。进程不可以将消息窗口发送到具有更高权限级别的进程,尽管他们以运行于同一个用户帐号(例如当前登录用户)。

UIPI防止来自其它可能更高权限的线程中创建的windows消息进行恶意代码攻击。

显示UIPI

此问题在UAC(用户帐户控制)启用时最为清晰(默认情况下是启用的)。UAC中,一个管理员登录获取两个令牌对象:第一个是管理员令牌,具有最高权限(类似于Windows Vista以前版本的系统帐号),第二个令牌是过滤后的版本,带有标准用户权限。

默认情况下,进程用完整性级别为normal(UIPI 级别分为low,normal,high,和system)的标准用户启动。作为对比,进程使用管理员权限(例如,当用户右击“Run as Administrator”或用”runas”命令调用SheellExecute)使得进程具有high的权限级别。

如此,系统可以用使单一权限级别运行两种类型的进程(技术上讲用的是同一用户帐号)。UIPI支持低完整性级别(integrity level)的进程和更高级别的进程进行通信。

使用用Windows Sysinternals 的Process Explorer查看权限级别(http://www.microsoft.com/technet/sysinternals ) ,选择“Integrity Level”列

 

      

                   

这里有个基于同一图片的两个进程的例子,其中一个用标准用户权限启动另一个使用管理员权限启动。注意他们是不同的完整性级别(integrity level)。

  

UIPI 施加限制

较低权限的应用程序不能做如下操作:

•              验证更高权限进程创建的窗口。调用 SendMessage 或 PostMessage到更高权限进程创建的窗口

•              使用线程钩子来附加一个更高权限的进程。

•              使用日志钩子(SetWindowsHookEx) 来监视更高权限的进程

•              DLL注入到更高权限的进程。

下列windows消息永远是允许状态:

 

•              0x000 - WM_NULL

•              0x003 - WM_MOVE

•              0x005 - WM_SIZE

•              0x00D - WM_GETTEXT

•              0x00E - WM_GETTEXTLENGTH

•              0x033 - WM_GETHOTKEY

•              0x07F - WM_GETICON

•              0x305 - WM_RENDERFORMAT

•              0x308 - WM_DRAWCLIPBOARD

•              0x30D - WM_CHANGECBCHAIN

•              0x31A - WM_THEMECHANGED

•              0x313, 0x31B (WM_???)

 

UIPI 问题的修复

基于比Windows Vista更早的操作系统的应用程序会需要互相之前能传递消息。Windows Vista 引入了ChangeWindowMessageFilter API,这是已编档方法,用来添加或删除能通过隔离级别的消息。需要允许消息传递到更高权限的进程的窗口时,使用如下方法:

ChangeWindowMessageFilter(message, MSGFLT_ADD);

类似的标记MSGFLT_REMOVE从进程允许列表中删除消息。

Windows 7引入了一个新的函数ChangeWindowMessageFilterEx,相对于控制整个进程它可以在特定窗口控制允许消息:

BOOL ChangeWindowMessageFilterEx(

    HWND hWnd, UINT message, DWORD action,

    PCHANGEFILTERSTRUCT pChangeFilterStruct

);

事件的参数可以是MSGFLT_ALLOW (类似于ChangeWindowMessageFilter中的MSGFLT_ADD ), MSGFLT_DISALLOW (类似于MSGFLT_REMOVE),和 MSGFLT_RESET,将窗口重设成默认筛选器,可选的架构允许操作结果以接收更多的信息。

相关资源

•              Application Compatibility Cookbook: http://msdn.microsoft.com/en-us/library/bb963893.aspx 

•              The Windows Vista and Windows Server 2008 Developer Story: http://msdn.microsoft.com/en-us/library/aa905330.aspx 

•              Edgar Barbosa: Windows Vista UIPI: http://www.coseinc.com/Vista_UIPI.ppt.pdf

显示: