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

Windows Vista有趣的标签SID

Label SID,盆盆将其翻译为标签SID,诸君别嫌土啊。这个东东是Windows Vista新引入的一个安全主体。在Mark Russinovich的博客文章《Windows Vista用户帐户控制、PsExec和安全边界》中,我们知道在Windows Vista,进程和资源对象都划分等级的(完整性级别)。等级低的进程不够资格写入等级高的资源对象,哪怕访问控制列表(ACL)允许也不行。

盆盆评述 在拙作《Windows Vista IE保护模式深入剖析》中做过一个形象的比喻。在Windows Vista中,安全机制有了很大的改进,不仅仅看ACL。这就好比男女双方求爱,除了看对方的经济收入等条件(相当于ACL),还要看是否门当户对(相当于完整性级别)。

看了Mark Russinovich的文章,想必您已经知道如何查看和设置资源对象的完整性级别(可以用icacls或者AccessChk命令)。

那么进程呢?Mark的文章里没提到,相信您已经知道,就是所谓的标签SID,呵呵,太有才了:)

标签SID的实质

标签SID位于进程的访问令牌里,用来标识进程的完整性级别。进程要访问资源对象(例如某个文件夹)时,就亮出它的访问令牌。文件夹就会检查令牌里的标签SID,看看级别是否足够。如果级别比自己还低,对不起,您只能读取,不能写入。

可以用Process Explorer查看进程的访问令牌,从而查看某个进程的标签SID。附图就是一个进程的访问令牌。其中红色部分显示其标签SID是“Mandatory Label\Medium Mandatory Level”,表明该进程的完整性级别为“中级”。蓝色部分显示该进程并不拥有管理员的运行身份(Administrators标记为Deny),同时只有五个特权。

完全可以想像,如果进程的完整性级别是高级(标签SID为Mandatory Label\High Mandatory Level),该进程应该拥有管理员的运行身份(Administrators标记为Owner),同时拥有约24个特权。

和Linux的对比

利用完整性级别这样的安全机制,Windows Vista就可以获得更高的安全。这样的机制类似于开源的MAC机制,例如Red Hat的SELinux。两者总体上各有千秋,但是窃以为比SELinux更加灵活,对用户的干扰也要小的多。在MAC下,用户有时候必须自己定义进程和资源的“类型”,否则进程工作可能会不正常。

SELinux简述
SELinux实际上既是把进程和文件、目录、设备等都划分不同的类型,然后借助事先定义好的策略,再配合传统的DAC权限,来达到最小程序特权的目的。这样的话,就算某个进程被攻破,拿到了root权限,也没有用,因为它只拿到该进程所对应类型的root权限,而非整个系统的权限。

Windows简述
由于Windows的安全子系统的实现和Unix-kind的OS有一些差异,Windows的安全有两个方面,进程的访问令牌+资源的访问控制列表。资源的访问控制列表,等同于Unix-kind的DAC权限。而进程的访问令牌则记录了该进程的运行帐户身份,属于哪些用户组,具有哪些全局的特权,然后Windows安全子系统把进程的访问令牌和资源的访问控制列表,进行逐项匹配,以确认是否具有权限。

到了Windows Vista,系统新增了三个安全特性,UAC、MIC和UIPI。

其中UAC相信不少用户比较熟悉,其特点是让进程默认运行在标准用户的访问令牌下,这样的话,即使进程被攻破,也能把危害降到最低。

而MIC,则是把进程和资源,都划分不同的等级,低等级的进程,不能访问高等级的资源,哪怕资源的访问控制列表允许这么做。

UIPI,则是不允许低等级的进程,给高等级的进程发送Windows消息,这样就可以阻止诸如粉碎攻击一类的行为。

窃以为,UAC、MIC和UIPI的功能,符合MAC的效果:
UAC可以让进程默认运行在中等级别,只能访问标准用户所能访问的资源,这样就算进程被攻破,也只能影响到该用户本身,而不会对全局造成影响。
而IE浏览器的进程,由于级别最低,就算被攻破,也无法造成危害,甚至对登录用户本身都没有影响,因为登录用户本身的资源级别是中等。

而Windows Vista中的UAC、MIC和UIPI,相比SELinux来说,优点在于,无须针对每个进程、文件和目录设置类型以及访问策略,而预设的策略又不见得可以满足所有的定制化要求,例如很多Linux用户抱怨SELinux对Apache等造成影响。而Windows Vista默认让所有进程运行在标准用户的级别,这样就减少了用户配置的需要,而需要管理权限的任务,会自动弹出确认框,确认即可提升权限级别。但是目前的Windows Vista主要缺陷有以下两点:
1. 可配置性比较差,无法对管理任务配置策略,以便下次运行时不要弹出UAC提示。当然微软这样做是有原因的,防止恶意程序调用合法程序干坏事。
2. 对于进程的级别,目前只能把IE进程设置为最低级别(实际上就是IE保护模式),其他进程默认是中级。当然目前来说,也只有IE的安全威胁最大,但是今后,应该需要把其他的高危险进程设置为最低级别。

最后还得补充一句,尽管UAC确实麻烦些,但是我们平时一般不可能经常执行管理任务。UAC不仅可以阻止恶意程序,还能防止一些合法的软件有意无意破坏系统(有些合法软件,由于开发的缺陷,可能无意中破坏系统)。所以应该开启UAC,小小的麻烦,可以换来安全,何乐不为?

更具体的对比,可以参考盆盆回复在远景上的帖子(该贴已经有2万6千个访问量,寒一个~)

标签SID的其他作用

标签SID除了可以判断进程的访问权限外。还可以用来帮助决策UAC是否弹出权限提升对话框,这点在Mark的文章里没有提到。

默认情况下,如果某个进程需要管理员特权,则系统会查看其父进程的标签SID,如果是“中级”,则会弹出权限提升对话框。如果是“高级”,则不会弹出对话框(直接继承父进程的安全上下文)。

盆盆评述 有关这一点,盆盆在06年3月份的文章《Windows Vista的UAC功能浅析(二)》曾经做过这样的猜测,现在得到实验的证实。

由于绝大多数用户进程的父进程是Explorer,其标签SID为“中级”,所以会弹出权限提升对话框。

以管理员身份打开“命令提示符”窗口,然后再在其下运行需要管理员特权的进程,这时候不会弹出权限提升对话框。因为父进程cmd.exe的标签SID是“高级”。

有趣的特例

我们可以做一个实验,来欺骗Windows Vista的安全机制。在Process Explorer里单击File→Run as Limited User,然后在打开的对话框里输入“CMD”并回车,如附图所示。

这时候会弹出一个很“另类”的命令提示符窗口。该命令提示符进程的标签SID是“高级”,但是实际上却是标准用户权限。不信?且看其访问令牌:

在红色部分我们可以看到,其标签SID是“Mandatory Label\High Mandatory Level”(完整性级别为“高级”),但是却并不拥有管理员的运行身份(Administrators标记为Deny),同时只有五个特权(查看蓝色部分)。

在这个“另类”的命令提示符下运行某个需要管理员特权的任务,例如“服务”管理单元,会发生什么情况?

系统根本不会弹出提升权限对话框,直接启动“服务”管理单元。这是因为UAC系统会根据父进程的标签SID来判定是否需要弹出权限提升对话框。

但是打开的这个“服务”管理单元也一样“另类”,Windows显然已经认为这是一个管理员进程(因为其标签SID为高级),但是实际上只有标准用户权限,我们什么操作几乎都不能做。

安全影响

Windows Vista的UAC只根据父进程的标签SID来判断是否应该提升权限,看上去似乎有点弱智。但是实际上由于这种操作的可能性很低,所以影响很小。

还有一个需要有趣的地方是,这种“另类”的进程虽然只有标准用户权限,但是完整性级别却是“高级”,所以这些进程可以通过代码注入等手段获取管理员权限,这和Windows 2000/XP的情况是一致的。

不过攻击者想要利用这种方法绕开UAC的限制,几乎是不可能的,因为构建这样的访问令牌,本身需要管理员特权。所以用户大可不必担心。

盆盆评述 05年11月,当时盆盆刚接触Windows Vista不久,写过一篇文章《Windows Vista的UAC功能浅析(一)》,就猜测“古怪帐户”的作用,应该是用来标识进程的等级。这里的“古怪帐户”,实际上就是本文所说的标签SID。

已发表 2007年2月27日 16:13 作者 ahpeng

评论通知

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

订阅帖子评论使用 RSS

评论

# re: Windows Vista有趣的标签SID

很棒的文章,看了之后基本就能理解UAC的完整性级别这个概念了.

不过关于label sid,好像官方并没有确切给出命名?不如干脆叫做完整性级别SID?

关于最后那个另类进程,其实就可以看作在没有引入完整性级别前用普通用户试图实现管理任务这种情景.弄得太复杂反而让人不太容易理解.

2007年8月31日 10:32 by dawnh

说说您的看法?

(必填) 
必填 
(必填)