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

Windows Vista UAC经典误解之三:Linux早就有这个功能了!

大凡苹果或Linux的粉丝,一听到UAC,就会不由地生出些许先前阔的自信:这算什么呀,我们早就有这个功能了,而你们Windows直到Vista才实现!

盆盆评注:在Linux或者Mac机器里,如果以普通用户身份,而非root身份登录系统,这时候如果执行管理任务,就会弹出如附图所示的对话框,要求输入root用户的密码,如果输入密码正确,就可以有权执行相应的管理任务。

看起来Windows Vista的UAC和Unix-Kind OS的这个功能有几分类似。例如在标准用户下登录时,如果执行管理员任务,也会弹出对话框,请用户输入管理员凭据。

然而,如果仔细分析其中的内部原理,发现两者实际差别很大。

1. 安全风险

直接输入管理员(root)凭据是一个非常危险的操作,因为用户无法分辨这是由系统弹出的对话框,还是由恶意代码伪造的。

Windows Vista的凭据输入对话框实际上运行在安全桌面上,这样就可以防止恶意代码伪造鼠标点击。

同时如果需要,还可以设置安全策略,只有用户按下“Ctrl+Alt+Del”组合键,才能出现凭据输入对话框。这是因为,在Windows下,只有Winlogon进程(TCB部分)才可以接受并处理这个键盘事件,其他任何进程都不行。

从这一点来看,Windows Vista的凭据输入的可靠性相当高,其实现和Linux相比,并不一样。

2. 灵活性

在Linux或者Apple,通常只有一些系统内置的管理任务,才会触发凭据输入对话框。而Windows Vista,允许第三方应用程序在manifest里指定应用程序的运行级别。

就算是系统内置的管理任务,根据用户的需求,有时候并不一定必需管理员权限。例如Windows下的系统服务,在标准用户下,可以直接打开,查看服务的运行状态和说明,而不需要管理员权限。

3. 最大的区别

UAC和Linux下的实现,最大的区别在于:Windows Vista就算以管理员帐户登录,默认还是只有标准用户权限,这样的话,可以体现最小特权的原则。

如果需要执行管理任务,则会弹出UAC对话框,这时候无需输入管理员凭据,直接单击继续或者允许即可。因为不需要输入管理员凭据,所以更加安全。

就算用户不懂UAC的含义,在所有的弹出对话框上都单击允许,那也会获得相当的安全。因为至少还有很多应用程序运行在标准用户权限下,减少这些应用程序对系统的破坏。至少可以降低受攻击面。

Linux的root用户,则没有这个特点。

再来说说Selinux

以下的评论摘自盆盆回复在远景上的帖子,稍作部分修改:

盆盆阅读了由RedHat官方提供的有关MAC和SELinux的文档,发现Windows Vista的安全功能,和SELinux确实有一些类似的地方。

但是两者的实现差别比较大。

盆盆评注:这里的MAC(强制访问控制)和苹果的那个MAC没有任何关系。

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

举个例子,拿Apache这个Web服务器来说,如果不想以默认的/var/www/html目录作为根目录,则必须确保新的目录的类型为“httpd_sys_content_t”,才能确保Apache具有正确的访问权限。

Windows安全简述
由于Windows的安全子系统的实现和Unix-kind的OS有一些差异。

Windows的安全有两个方面,验证和授权,也就是进程的访问令牌和资源的访问控制列表。

资源的访问控制列表,等同于Unix-kind的传统权限。而进程的访问令牌则记录了该进程的运行帐户身份,属于哪些用户组,具有哪些全局的特权,然后Windows安全子系统把进程的访问令牌和资源的访问控制列表,进行逐项匹配,以确认是否具有权限。

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

MIC(强制完整性级别控制),则是把进程和资源,都划分不同的等级,低等级的进程,不能访问高等级的资源,哪怕资源的访问控制列表允许这么做。MIC的机制,和Selinux有点类似。

UIPI(用户界面特权隔离),则是不允许低等级的进程,给高等级的进程发送窗口消息,这样就可以阻止诸如粉碎攻击一类的行为。

盆盆认为,UAC、MIC和UIPI的功能,符合MAC的安全定义:

1. UAC可以让进程默认运行在中等级别,只能访问标准用户所能访问的资源,这样就算进程被攻破,也只能影响到该用户本身,而不会对整个系统或者其他用户造成影响。

而IE浏览器的进程,由于级别最低,就算被攻破,也无法造成危害,甚至对登录用户的User Profile都没有影响,因为登录用户的User Profile的资源级别是中等,低等级的IE进程无法写入中等级别的资源对象。

2. Windows Vista中的安全特性,相比SELinux来说,优点在于:

无须针对每个进程、文件和目录设置类型以及访问策略,而预设的策略又不可能满足所有的定制化要求,例如很多Linux用户抱怨SELinux对Apache等造成影响。

而Windows Vista默认让所有进程运行在标准用户的级别,而需要管理权限的任务,会自动弹出确认框,确认即可提升进程的级别。这样就减少了用户手动配置的需要,这对于end-user来说,是个好消息。

3. 然而,目前的Windows Vista主要缺陷有以下两点:
(1)可配置性比较差,无法对管理任务配置策略,以便下次运行时不要弹出UAC提示。当然微软这样做是有原因的,防止恶意程序调用合法程序干坏事。
(2)对于进程的级别,目前只能把IE进程设置为最低级别(实际上就是IE保护模式),其他进程默认是中级。
当然目前来说,也只有IE的安全威胁最大,但是今后,应该需要把其他的高危险进程设置为最低级别。

盆盆评注:使用Mark Russinovich制作的Psexec工具,可以让其他进程运行在IE保护模式的级别,但是这样做的意义很小,因为几乎90%的应用程序都无法很好地运行在Low的级别。因为IE保护模式绝非仅仅是一个安全特性,它更加值得称道的是兼容性(它能够做到现在的这个状态,盆盆认为很不容易),而非仅仅是安全级别。

综合评判

看到这里,相信大家已经明白,Windows Vista的UAC和Selinux并非一码事,两者的实现差别很大,然而殊途同归,最终目的是一样的。

还有一点很重要,本文并没有说两者的实现,孰优孰劣。因为使用场合不一样。Selinux的使用场景主要是针对Linux的服务器,而UAC主要是针对桌面OS。

1. Selinux需要手动配置,这很麻烦,但是一旦配置以后,就可以一劳永逸,这是Linux的一贯优点。但是如果使用环境有变化,就得需要手动进行重新配置,所以这更加适合用在服务器环境中,而也许不是桌面环境。
2. UAC适合桌面OS,因为用户无需进行手动配置,只需用鼠标点击,而且使用场景发生变化,对用户没有影响。但是很显然,UAC不适合服务器OS,因为服务器OS大多数是无人值守的,谁会帮你点击弹出对话框?所以UAC在Windows Server Longhorn上是默认禁用的。

最后还得补充一句,很多朋友嫌UAC麻烦,为什么不能设置策略,下次不要再发出提醒?其实因为Windows无法区分启动进程的需求是用户发起的,还是其他进程所调用的,所以没有办法进行区分。今后随着ISV都按照UAC规范进行开发,麻烦会越来越小,相信大家平时应该不会每天都要执行N个管理任务。

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

已发表 2007年3月31日 12:34 作者 ahpeng

评论通知

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

订阅帖子评论使用 RSS

评论

2007年3月31日 15:21 by shixinyu

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

这个就不同意盆盆的观点啦。

Ubuntu和Vista同样有安全桌面,Ubuntu默认的管理员帐户同样是标准权限,当需要管理页同意的操作都会变成安全桌面并显示帐户密码对话框。

想象一下,如果我的Vista我已经用管理页帐户登录到桌面了,某个朋友的孩子要来玩,然后如果他安装了什么程序弹出UAC,他就能很轻松的同意和放行。不像Ubuntu,他还得需要输入密码才可以。

所以安全不是靠程序的什么功能,根本上还是用的人的安全意识。

2007年3月31日 20:21 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

To Shixinyu:

你好,石头兄弟,欢迎过来踩帖,呵呵。

要求输入凭据的话,Windows Vista也能通过安全策略进行设置。

但是盆盆觉得这样并不好,因为一方面用户体验比较差,每次需要输入密码,还有恶意代码容易伪造。

Ubuntu还没有玩过,找机会玩玩。最近在测试RHEL 5。

2007年3月31日 23:25 by Lee

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

如果说还要输密码的话,不如说Windows 2000就可以实现;用User登录,然后Runas..........

2007年4月1日 10:11 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

呵呵,是啊,Windows XP也支持“运行方式”的UI界面。如果用runas,更方便了,Pro版本还支持/SaveCred,连密码都不用输入,标准用户直接以某个管理员帐户身份运行程序。

2007年4月1日 10:14 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

另外,石头兄弟能否说说Ubuntu的安全桌面,是怎样的一种机制?我想了解一下它和Windows安全桌面的区别。

2007年4月1日 10:37 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

本文已经经过修改,增加了“综合评判”一节内容。欢迎大家阅读指正。

2007年4月1日 11:19 by shixinyu

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

Ubuntu的密码输入并非每次都需要输入,和网页上的密码输入一样,如果有一段时间不进行管理员的操作,那么再次进行管理员操作的时候才需要再输入,所谓“超时”操作吧。

Ubuntu不光有类似UAC的“安全桌面”,通过终端执行管理员操作时也是需要加一个 sudo (superuser do)这个命令在前,回车后输入密码才能执行。

呵呵,石头才疏学浅,无法解释Ubuntu的安全机制,只能理解到“权限限制”这一步罢了。

而且我觉得UAC的安全桌面会不会也被恶意程序仿制呢?我也可以编写一个程序模仿UAC的对话框以及安全桌面啊。有人肯定会说不要忘了,真正的安全桌面是无法进行其它操作的,什么Alt+Table什么的都是不行的。但是在我的使用中,曾经碰到UAC对话框未在激活状态,可能是因为操作太快,UAC对话框在我操作的程序背后,还奇怪为啥无法进行别的操作了,直到按下Alt+Table组合键切换到UAC对话框,才看到安全桌面。这是否意味着一定程度上这个UAC对话框是能被仿制的?

2007年4月1日 12:46 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

To Shixinyu:

sudo或者su命令,实际上等效于Windows下的runas命令,不过runas命令还能够以普通用户身份运行。

关于安全桌面,这是Windows中的一个安全技术术语,一两句话说不清楚,要了解安全桌面的一些内部机理,推荐仔细阅读《Windows Internals》的Security一章。只有TCB的可信进程才可以访问安全桌面。安全桌面就是用户登录时进入的Winlogon桌面。

在Windows Vista管理员状态下,因为不需要输入凭据,恶意代码模拟UAC对话框没有意义,而要给安全桌面上的UAC对话框发送窗口消息进行鼠标欺骗,也没有可能。

但是Linux会存在风险,因为需要输入凭据,这可能会被恶意代码利用。就算存在cache,也不安全,因为恶意代码存在crack这个cache的可能。

Windows Vista的标准用户同样存在这个风险,所以微软提供一个可选的安全策略,必须按Ctrl+Alt+Del才能触发凭据输入对话框,并且在安全桌面上运行。

据我所知,Red Hat没有sudo/su界面上实现类似安全桌面这样的机制,Ubuntu就不清楚了,但是Linux的版本大同小异。

“曾经碰到UAC对话框未在激活状态”,正确!

这是RC1以后提供的一个新的UAC特性,目的是改善用户体验。否则如果后台进程在运行过程中,突然弹出一个UAC对话框,就会干扰前台的应用。但是恶意代码无法利用这个特性进行破坏,因为这个UAC对话框是运行在安全桌面上的。这时候之所以还能进行其他用户操作,是因为我们还没有切换到安全桌面。

最后需要注意一点,安全桌面一直都存在,只是没有被激活,只有弹出UAC对话框,或者按Ctrl+Alt+Del,才会激活安全桌面。

2007年4月1日 18:26 by Lee

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

这个问题,就类似GINA会不会被仿制一样,微软的进程去保护这个界面,必须系统调用才能在某些情况下使用。

你说在登录的时候,你能做一个假的密码验证界面放在Windows的登录界面前面来截取用户密码吗?!

2007年4月1日 19:29 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

只有Winlogon进程可以接受Ctrl+Alt+Del这个SAS消息,Winlogon然后会调用GINA来显示凭据录入屏幕,这个屏幕运行在安全桌面上,所以任何用户进程都无法控制这个屏幕。

这是因为任何用户进程都运行在另外一个桌面上,叫做应用程序桌面,而桌面是Windows的安全边界。

同样UAC也运行在安全桌面上,所以可以实现安全,这就是UAC安全的简单的解释。

GINA是一个Dll,本身可以被替换,主要是为了方便企业显示自己定义的登陆屏幕。当然病毒也可能替换GINA Dll来收集凭据。不过这并不能说是Windows不够安全,只能是兼容性和安全之间的平衡,我们完全可以强制系统使用默认的GINA Dll。

2007年4月3日 9:39 by luser

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

不错微软是树大,什么东西都是借鉴和拿来,linux 什么尽管往前冲吧,技术成熟了再拿来

2007年4月5日 18:37 by yinjie

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

盆盆的解释太经典了,一定支持..

2007年4月5日 20:51 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

多谢老大支持!

2007年4月9日 16:20 by vflashbirdv

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

其实因为Windows无法区分启动进程的需求是用户发起的,还是其他进程所调用的,所以没有办法进行区分。

-----------------

我一直很疑惑为何Windows做到这一点那么难?呵呵也许是我想太简单了~~

2007年4月9日 17:42 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

To vflashbirdv:

Windows是一个基于窗口消息的系统,用户可以点击鼠标启动进程,进程也可以模拟鼠标事件,启动进程。

由于Windows下,所有进程实际上都是代表用户在进行操作。包括用户自己的鼠标点击,都可以理解为实际上是Explorer的鼠标事件。

理解了这一点,就知道为什么UAC必须弹出对话框,因为Windows必须判断这个操作是用户发起的。

2007年4月29日 16:19 by flyhigher

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

"Windows Vista的凭据输入对话框实际上运行在安全桌面上,这样就可以防止恶意代码伪造鼠标点击。"

难道恶意代码不能伪造一个界面同凭据输入对话框一模一样的对话框来吗?

2007年4月29日 16:32 by nmrj

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

弱弱地问一句:

 您说“直接输入管理员(root)凭据是一个非常危险的操作,因为用户无法分辨这是由系统弹出的对话框,还是由恶意代码伪造的。”确实是这样的,可是我一直在疑惑,恶意程序不经过root的安装,怎么获得执行的权限?连执行的权限都没有,如何去伪造一个对话框让用户选择下一步的操作...?

是不是我对linux的理解本身就有问题?

谢谢...

2007年4月29日 17:11 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

欢迎以上两位朋友来ITECN博客做客,并感谢两位的指点!

To Flyhigher朋友:Windows中一共有三种Desktop,其中用户启动的进程运行在Application Desktop上,而只有系统可信的SYSTEM运行的进程才能运行在Secure Desktop(安全桌面)上。

所有用户进程,都无法直接把UI显示在安全桌面上,也无法直接发送鼠标、键盘事件。

To nmrj朋友:不管是Linux,还是Windows,恶意代码很大一个目的就是为了提升权限,不管通过什么方法,例如堆栈溢出等。而直接获得管理员凭据,则是最容易的方法,一旦获得管理员凭据,那么这个系统就不属于我们了。

恶意代码弹出一个钓鱼性质的凭据输入对话框,这并不需要管理员(root)权限,很容易做到。

所以应该对凭据输入的机制进行严格的安全保护,确保在易用的同时,也要杜绝安全隐患。

Windows在这方面主要是通过安全桌面的机制进行控制。

2007年4月29日 22:49 by nmrj

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

he,he,首先先3X一下!

您说的堆栈溢出,是不是可以这样理解: 要么是主动安装的程序,要么是利用系统的漏洞,或者是利用系统中某个软件的漏洞,造成堆栈溢出,从而让系统执行所构造的内存中的代码,以实现获得root权限?

如果是这样的话,似乎就几乎没有办法防止恶意破坏系统的安全行为了. 因为内存中的代码可以构造成绕过操作系统而直接使用BIOS中断调用等等的低级方式来实现写硬盘的操作,如果能够写硬盘了,那么这个系统同样也不属于root或者administrator了.

但这是个说起来容易,做起来难的事情.是不是这样?

一切都是初学,不好意思,别嫌弃小白的话.

2007年4月30日 8:37 by ahpeng

# re: Windows Vista UAC经典误解之三:Linux早就有这个功能了!

To nmrj兄弟:感谢回复!

你的观点是很有道理的。确实,安全不是操作系统一家的事情,还要确保应用程序,更重要的是用户本身的安全意识。

其实Linux的用户,普遍安全意识比较高,技术也相对比较好,所以他们不会拒绝UAC之类的安全特性,这一点Windows用户可能更加看重易用性。

至于堆栈溢出,这种漏洞似乎很常见,Windows和Linux都有很多被发现的漏洞。Windows这次爆发的ANI漏洞也属于堆栈溢出。

应对的方法,Windows XP SP2和Vista内置了DEP,实际上就是把内存里的数据页面标记为“不能运行”(NX),这样病毒就无法利用堆栈溢出执行它们自己的恶意代码。

UAC和杀毒软件,都必不可少。UAC可以确保尽可能用更低权限运行代码,杀毒软件可以对付已经进入系统的恶意代码。

说说您的看法?

(必填) 
必填 
(必填)