📄 深入研究windows内部原理.htm
字号:
<H3>存档</H3>
<UL>
<LI><A href="http://blogs.itecn.net/blogs/winternals/archive/2007/04.aspx">四月
2007 (1)</A>
<LI><A href="http://blogs.itecn.net/blogs/winternals/archive/2007/03.aspx">三月
2007 (5)</A>
</LI></UL><!-- End: CommunityServer.Blogs.Controls.ArchiveList --></DIV>
<DIV id=LinkSideBar><!-- Start: CommunityServer.Blogs.Controls.LinkCategoryList --><!-- Skin Path: ~/Themes/default/Skins/Skins/Skin-LinkCategoryList.ascx --><!-- End: CommunityServer.Blogs.Controls.LinkCategoryList --></DIV><!-- End: CommunityServer.Blogs.Controls.BlogSideBar --></DIV>
<DIV id=content>
<DIV id=content2><!-- Start: CommunityServer.Blogs.Controls.EntryListContainer --><!-- Skin Path: ~/Themes/default/Skins/Skins/Skin-EntryListContainer.ascx --><!-- Start: CommunityServer.Blogs.Controls.EntryList --><!-- Skin Path: ~/Themes/default/Skins/Skins/Skin-EntryList.ascx -->
<DIV class=post>
<DIV class=postsubhead><A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl00_PermaLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/04/14/13086.aspx">2007年4月14日
0:11</A></DIV>
<DIV class=postsub>
<H2><A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl00_PostTitle
href="http://blogs.itecn.net/blogs/winternals/archive/2007/04/14/13086.aspx">内存优化的神话是如何炼成的</A></H2>
<P>4月12日的Webcast ,盆盆介绍了Windows Vista最新的内存管理技术SuperFetch。在Webcast的最后,盆盆推荐了Mark
Russinovich的一篇揭穿内存优化工具骗局的文章,并承诺会将它翻译成中文,并且加上盆盆自己做的注释,在ITECN博客上分享给大家。推荐大家一定要阅读一下,不但可以很好地了解这些所谓的内存优化工具是如何欺骗大家的,更重要可以学到很多重要的内存管理机制。</P>
<P>可以访问以下地址,阅读本文:</P>
<P><A
title=http://blogs.itecn.net/blogs/ahpeng/archive/2007/04/13/WinMemMgmt.aspx
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/04/13/WinMemMgmt.aspx">http://blogs.itecn.net/blogs/ahpeng/archive/2007/04/13/WinMemMgmt.aspx</A></P>
<DIV class=postfoot>发表于 作者 <A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl00_AuthorLink
href="http://blogs.itecn.net/user/Profile.aspx?UserID=2131">ahpeng</A> | <A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl00_CommentsLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/04/14/13086.aspx#comments">0
评论</A>
<DIV><SPAN
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl00_InlineTagEditorPanel>归档在:<A
href="http://blogs.itecn.net/blogs/winternals/archive/tags/Mark+Russinovich_80622F678765E07AFB7FD18B_/default.aspx"
rel=tag>Mark Russinovich技术文章翻译</A></SPAN><INPUT
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl00_InlineTagEditorPanel_State
type=hidden value=nochange
name=bp$_$ctl00$_$RecentPosts$_$postlist$_$EntryItems$ctl00$InlineTagEditorPanel></DIV></DIV></DIV></DIV>
<DIV class=post>
<DIV class=postsubhead><A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl01_PermaLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/25/windows-vista.aspx">2007年3月25日
23:42</A></DIV>
<DIV class=postsub>
<H2><A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl01_PostTitle
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/25/windows-vista.aspx">深入理解Windows
Vista内核三:服务安全改进</A></H2>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U><FONT
color=#0080ff>盆盆</FONT></U></A><FONT color=#0080ff>译注:去年5月,盆盆写过一篇原创的</FONT><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2006/05/11/Vista_5F00_Sec_5F00_Overview.aspx"><U><FONT
color=#0080ff>技术文章</FONT></U></A><FONT color=#0080ff>,曾经提到过Windows
Vista的服务安全改进,读者朋友可以对照着看,希望能够帮助大家更好地理解本文的内容。</FONT></P>
<P>以下是Mark的正文翻译:</P>
<P>Windows服务一向是恶意软件的理想攻击目标。许多服务提供网络访问功能,这可能会带来远程访问的相关漏洞,而且大多数服务可以比标准用户拿到更高的特权,这样一旦受到恶意软件的攻击,就可以有机会在本地系统提升权限。所以,在Windows
XP SP2版本中,Windows开始引入一些变化,以降低服务的特权和访问权限,只要能够满足其功能即可。例如,Windows XP SP2新增了Local
Service和Network Service这两个帐户,它们所包含的特权只是Local System帐户的子集,而以前,服务都是以Local
System的帐户身份运行的。这样就算服务存在漏洞,也可以把受攻击的可能性降到最低。</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:整篇文章实际上体现了最小特权使用的思想,这和UAC的思想是一致的。我们一定要建立这个安全概念,才能理解Windows
Vista安全。对于Dev来说,更是如此,否则无法实现程序安全和兼容。</FONT></P>
<P>在<A
href="http://www.microsoft.com/technet/technetmag/issues/2007/03/VistaKernel/"><U>前一篇文章</U></A>里,Mark提到服务运行在自己的会话中,从而和用户的会话隔离开,但是Windows
Vista进一步减少服务特权,减少对文件、注册表键值的访问权限,还可以为绝大多数服务分配防火墙端口,更进一步体现了最小特权的原则。Windows
Vista引入了一种新的组帐户,叫做服务安全标识符(SID),每个服务都有唯一的SID。服务可以对它的资源设置访问权限,这样只有该服务的SID才有权访问,防止运行在同一用户帐户下的其他<STRONG>服务</STRONG>访问这些资源(如果该<STRONG>服务</STRONG>已经受到攻击)。我们可以用SC
ShowSID命令查看指定服务的SID,如附图所示。<BR><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_122E0/18.png"><IMG
height=204 src="深入研究Windows内部原理_files/1_thumb6.png" width=640></A><BR><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:服务SID仅用于控制对服务资源的访问,而并不能用于身份验证,例如不能用于服务的登录。</FONT></P>
<P>服务SID可以对特定服务所拥有的资源提供访问保护,但是默认情况下,服务还是可以访问其登录帐户有权访问的所有资源。举个例子,假设以Local
Service身份运行的某个服务,用服务SID来对它的资源提供保护,那么同样以Local
Service身份、而在另外一个进程中运行的其他服务,就无法访问它所创建的资源。但是,其他服务还是可以访问Local
Service帐户得到授权的资源,或者是Local Service帐户所属的组(例如Service组)有权访问的资源。</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:还是举个实例看起来比较清晰,例如C:\Windows默认给标准用户提供读取权限,所以,所有服务都可以读取其下的内容。然而只有TrustInstaller帐户才对C:\Windows目录拥有写入权限,所以“Windows
Modules Installer”服务有权写入该目录(因为该服务拥有TrustInstaller这个服务SID)。</FONT></P>
<P>为了解决这个问题,Windows
Vista引入了一个新的受限服务类型,叫做“写入限制服务”,这样只有在对象明确地给服务SID、Everyone组或者分配给登录会话的SID(盆盆译注:Logon
SID)提供写入权限,服务才能有权限修改该对象。为了达到这个目标,该服务使用Restricted(受限)SID,这种类型的SID最初是在Windows
2000中引入的。如果打开对象的某个进程属于“写入限制服务”类型,那么访问检查的算法就会发生变化,只有同时给具有两种形式(受限和不受限)的服务SID提供写入权限,该进程才真正具有写入权限。我们可以用“SC
QSIDType <EM>ServiceName</EM>”命令查看某个服务是否属于“写入限制服务”类型,如附图所示。<BR><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_122E0/2[7].png"><IMG
height=201 src="深入研究Windows内部原理_files/2_thumb%5B5%5D.png" width=501></A><BR><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:默认情况,BFE、DPS等服务属于“写入限制服务”,其宿主进程svchost的访问令牌中,只有服务SID、Everyone组和登录会话SID打上“Restricted”(受限)的标志,如附图所示。这说明,只有对象明确地给服务SID、Everyone或者登录会话SID赋予写入权限,才能确保服务具有写入该对象的权限。如果对象只给服务的登录帐户(Local
Service)或者Service组授予写入权限,服务还是没有写入权限。这是因为在进程的访问令牌中,服务的登录帐户和Service组,并没有“Restricted”标志,所以无法通过第二次的访问检查。<BR></FONT><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_122E0/2[11].png"><IMG
height=355 src="深入研究Windows内部原理_files/2_thumb%5B7%5D.png" width=515></A> </P>
<P> 还有一个改进,Windows服务现在更容易防止同一帐户下运行的其他服务访问它所创建的对象。在旧版本的Windows中,对象的创建者同时也是对象的所有者,所有者可以读取并且修改对象的权限,以获取对象的完全控制权限。Windows
Vista引入了全新的Owner Rights这个SID,如果对象的访问控制列表中有Owner
Rights这个SID,就可以限制所有者的访问权限,甚至没有权利去设置和查询权限。</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:总算知道Owner Rights这个SID的作用了,在Beta 2的中文内测版Windows
Vista中,这个SID居然被翻译成“所有者全县”(“全县”显系“权限”之误)。要了解更多有关Owner
Rights的意义,可以参考以下的微软官方网站:</FONT></P>
<P><A
title=http://technet2.microsoft.com/WindowsVista/en/library/ea557e82-e51c-484f-be3a-b9ab45c0ea871033.mspx?mfr=true
href="http://technet2.microsoft.com/WindowsVista/en/library/ea557e82-e51c-484f-be3a-b9ab45c0ea871033.mspx?mfr=true"><U>http://technet2.microsoft.com/WindowsVista/en/library/ea557e82-e51c-484f-be3a-b9ab45c0ea871033.mspx?mfr=true</U></A></P>
<P>在Windows
Vista的服务安全模型中,更进一步的改进是服务的开发人员可以明确指定服务可以拥有的特权。例如,如果服务需要产生审核事件日志,则可以给服务指定审核特权。 </P>
<P>当服务控制管理器(SCM)启动包含一个或者多个服务的进程时,会为该进程创建一个访问令牌(访问令牌是内核对象,列出进程的用户帐户身份、组成员,还有特权), 访问令牌里仅仅包含(进程里的)服务所必须拥有的特权。如果服务指定了某个特权,而其启动帐户却不包含该特权,服务启动就会失败。如果以Local
Service身份运行的进程,其中包含的所有服务,都不需要“调试程序”特权,服务控制管理器(SCM)就会把该特权从进程的访问令牌中剔除。因此,如果服务进程遭受攻击,恶意代码无法利用这些危险的特权,因为进程里的服务并没有明确声明需要这些高危险的特权。可以用“SC
QPrives”命令查看服务所需的特权。</P>
<P><STRONG>查看“写入限制服务”</STRONG></P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:这部分内容和前面的译注有些重叠,这是因为盆盆并没有注意到Mark把这部分补充内容放在全文的最后,所以盆盆有点画蛇添足,自己添加了相关背景介绍。不过盆盆不准备删除这部分译注,读者朋友可以参考一下。</FONT></P>
<P>在Windows Vista中,只有一个服务宿主进程(svchost)包含受限服务,我们可以借助Process
Explorer这样的进程查看工具,查看具有以下“Command Line”(命令行)的进程:</P>
<P>svchost -k LocalServiceNoNetwork</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT
color=#0080ff>译注:需要事先在Process Explorer里单击View、Select Columns,在打开的对话框里勾选“Command
Line”复选框。</FONT> </P>
<P>该进程包含Base Filtering Engine、Diagnostic Policy Service、Windows
Firewall、Performance Logs and Alerts和Windows Media<SUP> </SUP>Center Service
Starter这几个服务。</P>
<P>附图所示的是“Base Filtering Engine”服务的服务SID(显示为文本格式),叫做NT
Service\BFE,一共有两个,其中一个带有Restricted的标志,另一个则没有(标记为Owner),所以如果对象给该服务SID赋予访问权限,则进程就有权限访问该对象。然而,如果某些对象通常只有Local
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -