深入研究Windows内部原理 : 深入理解Windows Vista内核三:服务安全改进

来源:百度文库 编辑:神马文学网 时间:2024/04/29 12:01:30
深入理解Windows Vista内核三:服务安全改进
盆盆译注:去年5月,盆盆写过一篇原创的技术文章,曾经提到过Windows Vista的服务安全改进,读者朋友可以对照着看,希望能够帮助大家更好地理解本文的内容。
以下是Mark的正文翻译:
Windows服务一向是恶意软件的理想攻击目标。许多服务提供网络访问功能,这可能会带来远程访问的相关漏洞,而且大多数服务可以比标准用户拿到更高的特权,这样一旦受到恶意软件的攻击,就可以有机会在本地系统提升权限。所以,在Windows XPSP2版本中,Windows开始引入一些变化,以降低服务的特权和访问权限,只要能够满足其功能即可。例如,Windows XPSP2新增了Local Service和Network Service这两个帐户,它们所包含的特权只是LocalSystem帐户的子集,而以前,服务都是以Local System的帐户身份运行的。这样就算服务存在漏洞,也可以把受攻击的可能性降到最低。
盆盆译注:整篇文章实际上体现了最小特权使用的思想,这和UAC的思想是一致的。我们一定要建立这个安全概念,才能理解Windows Vista安全。对于Dev来说,更是如此,否则无法实现程序安全和兼容。
在前一篇文章里,Mark提到服务运行在自己的会话中,从而和用户的会话隔离开,但是WindowsVista进一步减少服务特权,减少对文件、注册表键值的访问权限,还可以为绝大多数服务分配防火墙端口,更进一步体现了最小特权的原则。WindowsVista引入了一种新的组帐户,叫做服务安全标识符(SID),每个服务都有唯一的SID。服务可以对它的资源设置访问权限,这样只有该服务的SID才有权访问,防止运行在同一用户帐户下的其他服务访问这些资源(如果该服务已经受到攻击)。我们可以用SC ShowSID命令查看指定服务的SID,如附图所示。

盆盆译注:服务SID仅用于控制对服务资源的访问,而并不能用于身份验证,例如不能用于服务的登录。
服务SID可以对特定服务所拥有的资源提供访问保护,但是默认情况下,服务还是可以访问其登录帐户有权访问的所有资源。举个例子,假设以LocalService身份运行的某个服务,用服务SID来对它的资源提供保护,那么同样以LocalService身份、而在另外一个进程中运行的其他服务,就无法访问它所创建的资源。但是,其他服务还是可以访问LocalService帐户得到授权的资源,或者是Local Service帐户所属的组(例如Service组)有权访问的资源。
盆盆译注:还是举个实例看起来比较清晰,例如C:\Windows默认给标准用户提供读取权限,所以,所有服务都可以读取其下的内容。然而只有TrustInstaller帐户才对C:\Windows目录拥有写入权限,所以“Windows ModulesInstaller”服务有权写入该目录(因为该服务拥有TrustInstaller这个服务SID)。
为了解决这个问题,WindowsVista引入了一个新的受限服务类型,叫做“写入限制服务”,这样只有在对象明确地给服务SID、Everyone组或者分配给登录会话的SID(盆盆译注:LogonSID)提供写入权限,服务才能有权限修改该对象。为了达到这个目标,该服务使用Restricted(受限)SID,这种类型的SID最初是在Windows2000中引入的。如果打开对象的某个进程属于“写入限制服务”类型,那么访问检查的算法就会发生变化,只有同时给具有两种形式(受限和不受限)的服务SID提供写入权限,该进程才真正具有写入权限。我们可以用“SC QSIDType ServiceName”命令查看某个服务是否属于“写入限制服务”类型,如附图所示。

盆盆译注:默认情况,BFE、DPS等服务属于“写入限制服务”,其宿主进程svchost的访问令牌中,只有服务SID、Everyone组和登录会话SID打上“Restricted”(受限)的标志,如附图所示。这说明,只有对象明确地给服务SID、Everyone或者登录会话SID赋予写入权限,才能确保服务具有写入该对象的权限。如果对象只给服务的登录帐户(LocalService)或者Service组授予写入权限,服务还是没有写入权限。这是因为在进程的访问令牌中,服务的登录帐户和Service组,并没有“Restricted”标志,所以无法通过第二次的访问检查。

还有一个改进,Windows服务现在更容易防止同一帐户下运行的其他服务访问它所创建的对象。在旧版本的Windows中,对象的创建者同时也是对象的所有者,所有者可以读取并且修改对象的权限,以获取对象的完全控制权限。Windows Vista引入了全新的OwnerRights这个SID,如果对象的访问控制列表中有Owner Rights这个SID,就可以限制所有者的访问权限,甚至没有权利去设置和查询权限。
盆盆译注:总算知道Owner Rights这个SID的作用了,在Beta 2的中文内测版Windows Vista中,这个SID居然被翻译成“所有者全县”(“全县”显系“权限”之误)。要了解更多有关Owner Rights的意义,可以参考以下的微软官方网站:
http://technet2.microsoft.com/WindowsVista/en/library/ea557e82-e51c-484f-be3a-b9ab45c0ea871033.mspx?mfr=true
在Windows Vista的服务安全模型中,更进一步的改进是服务的开发人员可以明确指定服务可以拥有的特权。例如,如果服务需要产生审核事件日志,则可以给服务指定审核特权。
当服务控制管理器(SCM)启动包含一个或者多个服务的进程时,会为该进程创建一个访问令牌(访问令牌是内核对象,列出进程的用户帐户身份、组成员,还有特权), 访问令牌里仅仅包含(进程里的)服务所必须拥有的特权。如果服务指定了某个特权,而其启动帐户却不包含该特权,服务启动就会失败。如果以LocalService身份运行的进程,其中包含的所有服务,都不需要“调试程序”特权,服务控制管理器(SCM)就会把该特权从进程的访问令牌中剔除。因此,如果服务进程遭受攻击,恶意代码无法利用这些危险的特权,因为进程里的服务并没有明确声明需要这些高危险的特权。可以用“SCQPrives”命令查看服务所需的特权。
查看“写入限制服务”
盆盆译注:这部分内容和前面的译注有些重叠,这是因为盆盆并没有注意到Mark把这部分补充内容放在全文的最后,所以盆盆有点画蛇添足,自己添加了相关背景介绍。不过盆盆不准备删除这部分译注,读者朋友可以参考一下。
在Windows Vista中,只有一个服务宿主进程(svchost)包含受限服务,我们可以借助Process Explorer这样的进程查看工具,查看具有以下“Command Line”(命令行)的进程:
svchost -k LocalServiceNoNetwork
盆盆译注:需要事先在Process Explorer里单击View、Select Columns,在打开的对话框里勾选“Command Line”复选框。
该进程包含Base Filtering Engine、Diagnostic Policy Service、Windows Firewall、Performance Logs and Alerts和Windows Media Center Service Starter这几个服务。
附图所示的是“Base Filtering Engine”服务的服务SID(显示为文本格式),叫做NTService\BFE,一共有两个,其中一个带有Restricted的标志,另一个则没有(标记为Owner),所以如果对象给该服务SID赋予访问权限,则进程就有权限访问该对象。然而,如果某些对象通常只有LocalService帐户可以访问,则服务进程并没有什么必要对这些对象进行访问。例如,在进程的访问令牌中,“NTAUTHORITY\SERVICE”帐户并没有Restricted的标志,如果某个对象仅给“NTAUTHORITY\SERVICE”帐户授予访问权限,而没有给其他带Restricted标志的帐户分配权限(例如服务SID、登录会话SID或者Everyone),则服务进程无法对该对象进行写入操作。
该进程中的服务只拥有受限的特权,因为图片底部所列出的特权只是Local Service帐户特权的一个子集。

盆盆译注:在Mark的文章里,提到会话(Session)隔离和登录会话SID(Logon Session)。一个是会话,还一个是登录会话,应该属于不同的概念。但是盆盆目前还不能很好地理解这两个概念各自的使用场景。
用Process Explorer很容易看出,在用户登录后,系统中存在两个会话,服务和一些系统级的进程运行在会话0,而用户进程运行在会话1。
同样用ProcessExplorer很容易看出,系统中同时存在多个登录会话,多个用户进程共享一个登录会话(runas启动的进程也一样),但是每个服务进程都有独立的登录会话。每个登录会话都有一个相应的SID,可以在进程的访问令牌里看到Logon Session SID。
盆盆最近在看Keith Brown所著的《Programming Windows Security》,觉得这本书很好,可以帮助理解很多原来不知道的底层安全原理,虽然是为Dev所写,但是不懂开发的盆盆照样觉得这书很好。
已发表2007年3月25日 23:42作者ahpeng归档在:Windows安全,Mark Russinovich技术文章翻译