Windows Vista 安全特性深度解析(上)
1. 堆管理器的革新
Windows Vista 的堆管理器经历了重大改进。之前的元数据显示一个子段包含 15 个大小为 0x208 字节的块,随后是该子段中的堆块列表,每个块都标记有 LFH,表明是低碎片堆块。新的低碎片前端分配器极大地改善了与安全和性能相关的问题,并且
!heap
扩展命令也已更新,能与新的堆结构无缝配合,便于深入研究堆。随着越来越多的应用程序在 Vista 系统上运行,理解新堆的工作原理对于有效调试这些应用程序至关重要。
2. 安全选项的变革
Windows Vista 在安全选项方面带来了前所未有的变化。它继承并增强了 Windows NT 定义的安全模型,同时保持完全向后兼容,新的安全选项可按需开启或关闭。默认设置经过了大量的应用程序兼容性测试,能满足大多数应用程序的需求。但在极少数情况下,应用程序可能无法按预期运行,开发兼容 Vista 的应用程序的工程师需要了解这些显著变化,以及如何识别它们对应用程序的影响。
2.1 用户账户控制(UAC)特性
用户账户控制(UAC)是新安全选项中最显著的特性。要理解 UAC,需要先了解其背后的完整性级别概念。
每个运行的进程都在以下完整性级别之一运行,具体由多种因素决定,完整性级别由 SID 标识:
| 完整性级别名称 | 完整性级别标识符 | 在此级别运行的应用程序示例 |
| — | — | — |
| System | S-1-16-16384 | Svchost.exe、Winlogon.exe、Windows Kernel |
| High | S-1-16-12288 | mmc.exe、setup.exe |
| Medium | S-1-16-8196 | explorer.exe、ieuser.exe |
| Low | S-1-16-4096 | iexplore.exe |
系统确定每个进程完整性级别的因素如下:
- Windows Vista 始终以系统完整性级别运行 Windows 服务进程和内核代码。
- 操作系统会根据应用程序清单特别识别请求管理员权限的工具,例如清单中请求高完整性级别的示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Application" type="win32"/>
<description>Application descriptions</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
此外,系统还会使用其他启发式方法来确定所需的完整性级别,例如任何名为 setup.exe 的应用程序总是以高完整性级别启动。
- 用于执行日常任务的应用程序,如文字处理器、电子表格应用程序或电子邮件软件,以中等完整性级别运行,可以将这些进程视为普通用户(无管理员权限)启动的进程。
- 为防止 Internet 恶意软件传播,Internet Explorer 以低完整性级别运行,目前它是唯一使用最低完整性级别的应用程序。
进程按完整性级别分组,操作系统会控制不同完整性级别进程之间的交互。默认情况下,较低完整性级别进程无法访问较高完整性级别进程创建的内核对象。此外,用户界面特权隔离(UIPI)特性控制不同完整性级别进程之间的 Windows 消息流,默认情况下,一个进程只能向相同或更低完整性级别进程发送 Windows 消息。不过,这两个限制都可以通过不同技术绕过。对象创建者可以调整保护内核对象的安全描述符,使较低完整性级别进程能够访问;应用程序可以通过在应用程序清单中将 uiAccess 标志设置为 true 来绕过 UIPI,但此类应用程序必须经过 Microsoft Authenticode 签名,并位于受保护的位置(如 %systemdrive%\Program Files 和 %systemdrive%\Windows\System32 )才能正常启动。
2.2 用户访问控制(UAC)机制
用户访问控制(UAC)改变了本地管理员组用户运行应用程序的方式。可以使用本地安全策略管理单元启用 UAC。在 Windows XP 中,本地管理员成员以其完整的管理员权限上下文运行所有应用程序,这使得应用程序中的任何漏洞都可能被利用,对整个系统造成严重影响,例如可能导致其他组件的静默安装、注册表和文件权限的静默更改或执行管理任务。
在 Windows Vista 中,当 UAC 策略设置为以管理员审批模式运行所有管理员时,本地管理员成员以中等完整性级别运行 shell 进程;当策略禁用时,以高完整性级别运行。除非管理员以管理模式启动应用程序,否则从 shell 启动的每个新应用程序都会继承 shell 的完整性级别。如果系统检测到应用程序需要额外权限(如应用程序清单中定义或本地安全策略中的系统启发式方法确定),会在类似对话框中提示管理员进行确认。选择“继续”按钮后,系统会以完全管理员权限启动应用程序,确认行为由启用 UAC 的同一管理单元控制。
2.3 调试器中的 UAC
在调查与 UAC 相关的安全故障时,首先要了解故障中所有参与者的角色。UAC 故障与其他安全故障类似,一个实体请求访问由看门人保护的对象,看门人使用对象安全描述符拒绝访问该对象。以下是一个示例,展示了运行系统进程的安全令牌和保护进程对象的安全描述符,说明了强制完整性级别如何应用于内核对象:
kd> * Use !process extension command to get the process token
kd> !process 0 1 wininit.exe
PROCESS 82e59888 SessionId: 0 Cid: 01cc Peb: 7ffd5000 ParentCid: 0198
DirBase: 11d85000 ObjectTable: 8c65ff38 HandleCount: 93.
Image: wininit.exe
VadRoot 82efb180 Vads 53 Clone 0 Private 227. Modified 156. Locked 2.
DeviceMap 84403128
Token 8c6651d8
...
CommitCharge 294
kd> * Use !token extension command to dump token information.
kd> * Integrity level is the last group in the token
kd> !token 8c6651d8
_TOKEN 8c6651d8
TS Session ID: 0
User: S-1-5-18
Groups:
00 S-1-5-32-544
Attributes - Default Enabled Owner
01 S-1-1-0
Attributes - Mandatory Default Enabled
02 S-1-5-11
Attributes - Mandatory Default Enabled
03 S-1-16-16384
Attributes - GroupIntegrity GroupIntegrityEnabled
Primary Group: S-1-5-18
Privs:
03 0x000000003 SeAssignPrimaryTokenPrivilege Attributes -
...
35 0x000000023 SeCreateSymbolicLinkPrivilege Attributes - Enabled Default
Authentication ID: (0,3e7)
Impersonation Level: Anonymous
TokenType: Primary
Source: *SYSTEM* TokenFlags: 0x800 ( Token in use )
Token ID: 6c01 ParentToken ID: 0
Modified ID: (0, 6a7a)
RestrictedSidCount: 0 RestrictedSids: 00000000
OriginatingLogonSession: 0
kd> * What is the security of system-integrity level objects?
kd> * The process object is a perfect example to illustrate it
kd> !sd poi(82e59888-4)&FFFFFFF8
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8814
SE_DACL_PRESENT
SE_SACL_PRESENT
SE_SACL_AUTO_INHERITED
SE_SELF_RELATIVE
->Owner : S-1-5-32-544
->Group : S-1-5-18
->Dacl :
->Dacl : ->AclRevision: 0x2
->Dacl : ->Sbz1 : 0x0
->Dacl : ->AclSize : 0x3c
->Dacl : ->AceCount : 0x2
->Dacl : ->Sbz2 : 0x0
->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[0]: ->AceFlags: 0x0
->Dacl : ->Ace[0]: ->AceSize: 0x14
->Dacl : ->Ace[0]: ->Mask : 0x001fffff
->Dacl : ->Ace[0]: ->SID: S-1-5-18
...
->Sacl :
->Sacl : ->AclRevision: 0x2
->Sacl : ->Sbz1 : 0x0
->Sacl : ->AclSize : 0x1c
->Sacl : ->AceCount : 0x1
->Sacl : ->Sbz2 : 0x0
->Sacl : ->Ace[0]: ->AceType: SYSTEM_MANDATORY_LABEL_ACE_TYPE
->Sacl
: ->Ace[0]: ->AceFlags: 0x0
->Sacl : ->Ace[0]: ->AceSize: 0x14
->Sacl : ->Ace[0]: ->Mask : 0x00000003
->Sacl : ->Ace[0]: ->SID: S-1-16-16384
完整性级别作为一个特殊组存在于进程令牌中,在上述示例中,第三个组具有系统完整性级别 SID 值 S-1-16-16384。每个只能由特定完整性级别用户访问的对象,其访问权限都编码在对象安全描述符的 SACL 部分的 ACE 条目中。与基于组成员身份的访问检查不同,强制系统完整性级别会考虑强制完整性级别的相对顺序进行测试。系统完整性级别最高,其次是高、中、低。当用于访问资源的令牌的完整性级别低于对象的完整性级别时,
SYSTEM_MANDATORY_LABEL_ACE_TYPE
标志会控制进一步的访问,例如在上述示例中,标志
0x03
表示
SYSTEM_MANDATORY_LABEL_NO_WRITE_UP | SYSTEM_MANDATORY_LABEL_NO_READ_UP
,这意味着除 LocalSystem 主体外,系统上的任何用户都无法访问该对象。
以下是对以本地管理员组账户运行且启用 UAC 策略的进程的分析:
kd> !process 0 1 explorer.exe
PROCESS 901674f0
SessionId: 1 Cid: 0c04 Peb: 7ffd7000 ParentCid: 09cc
DirBase: 0a53e000 ObjectTable: 8f55b850 HandleCount: 599.
Image: explorer.exe
VadRoot 82ec6428 Vads 337 Clone 0 Private 3112. Modified 27217. Locked 0.
DeviceMap 927fb4f8
Token 9256d890
...
kd> !token 9256d890
_TOKEN 9256d890
TS Session ID: 0x1
User: S-1-5-21-2084298851-3655559499-3523964647-1000
Groups:
00 S-1-5-21-2084298851-3655559499-3523964647-513
Attributes - Mandatory Default Enabled
01 S-1-1-0
Attributes - Mandatory Default Enabled
02 S-1-5-32-544
Attributes - DenyOnly
...
10 S-1-16-8192
Attributes - GroupIntegrity GroupIntegrityEnabled
Primary Group: S-1-5-21-2084298851-3655559499-3523964647-513
Privs:
19 0x000000013 SeShutdownPrivilege Attributes -
23 0x000000017 SeChangeNotifyPrivilege Attributes - Enabled Default
25 0x000000019 SeUndockPrivilege Attributes -
33 0x000000021 SeIncreaseWorkingSetPrivilege Attributes -
34 0x000000022 SeTimeZonePrivilege Attributes -
Authentication ID: (0,9ec99)
Impersonation Level: Anonymous
TokenType: Primary
Source: User32 TokenFlags: 0xa00 ( Token in use )
Token ID: a2c7b ParentToken ID: 9ec9c
Modified ID: (0, 173021)
RestrictedSidCount: 0 RestrictedSids: 00000000
OriginatingLogonSession: 3e7
kd> !sd poi(901674f0-4) & 0xFFFFFFF8
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8814
SE_DACL_PRESENT
SE_SACL_PRESENT
SE_SACL_AUTO_INHERITED
SE_SELF_RELATIVE
->Owner : S-1-5-21-2084298851-3655559499-3523964647-1000
->Group : S-1-5-21-2084298851-3655559499-3523964647-513
...
->Sacl :
->Sacl : ->AclRevision: 0x2
->Sacl : ->Sbz1 : 0x0
->Sacl : ->AclSize : 0x1c
->Sacl : ->AceCount : 0x1
->Sacl : ->Sbz2 : 0x0
->Sacl : ->Ace[0]: ->AceType: SYSTEM_MANDATORY_LABEL_ACE_TYPE
->Sacl : ->Ace[0]: ->AceFlags: 0x0
->Sacl : ->Ace[0]: ->AceSize: 0x14
->Sacl : ->Ace[0]: ->Mask : 0x00000003
->Sacl : ->Ace[0]: ->SID: S-1-16-8192
在这个例子中,explorer 进程令牌具有中等完整性级别,并且进程令牌被限制为等于或高于中等的完整性级别。此外,进程令牌中的第三个 SID 是一个受限 SID,其作用是拒绝访问仅该受限 SID 可访问的资源,在这种情况下,由 S-1-5-32-544 表示的本地管理员组。需要注意的是,受限 SID 概念并非新事物,在早期平台中,使用受限令牌的应用程序就已经使用了受限 SID。
3. 完整性级别在资源管理中的应用
完整性级别可以应用于其他实体管理的资源,如文件系统或注册表项。操作系统安装了一个新的感知完整性级别的工具
icacls.exe
,它取代了
cacls.exe
。
icacls.exe
可以使用
setintegritylevel
选项显示或更改任何文件的完整性级别,但该工具不允许对低完整性用户的访问进行微调,并且始终使用
SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
标志。以下是一个示例,检查一个示例文件的安全性,更改其完整性级别,并重新检查其安全描述符:
C:\>icacls c:\AWDBIN\WinXP.x86.chk\01sample.exe
c:\AWDBIN\WinXP.x86.chk\01sample.exe BUILTIN\Administrators:(I)(F)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Users:(I)(RX)
C:\>icacls c:\AWDBIN\WinXP.x86.chk\01sample.exe /setintegritylevel M
processed file: c:\AWDBIN\WinXP.x86.chk\01sample.exe
Successfully processed 1 files; Failed processing 0 files
C:\>icacls c:\AWDBIN\WinXP.x86.chk\01sample.exe
c:\AWDBIN\WinXP.x86.chk\01sample.exe BUILTIN\Administrators:(I)(F)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Users:(I)(RX)
Mandatory Label\Medium Mandatory Level:(NW)
Successfully processed 1 files; Failed processing 0 files
通过以上操作,将文件的强制完整性级别设置为中等,且不允许向上写入。
Windows Vista 安全特性深度解析(下)
4. 注册表和文件虚拟化
在 Windows Vista 中运行非平凡应用程序时,会遇到注册表和文件虚拟化的问题。以下通过示例来展示这一特性的影响。
有一个示例应用程序,它有两个功能选项:一是将数据保存到受保护的位置,即
HKEY_LOCAL_MACHINE\Software
注册表项和
C:\Program Files
文件夹;二是读取这些数据。这在使用全局设置且可通过 MMC 管理单元配置的应用程序中很常见。
下面是两个不同运行情况的示例:
-
在 UAC 上下文中正常运行
:
c:\>c:\AWDBIN\WinXP.x86.chk\07sample.exe
Press:
0 To use Security Descriptor APIs
1 To run Impersonation test
2 To run Default SD test
3 To run MAXIMUM_ALLOWED test
4 To set application configuration information
5 To read application configuration information
x To exit
> Creating application settings ...
Registry key HKEY_LOCAL_MACHINE\Software\Advanced Windows Debugging created
Create file C:\Program Files\sample4.test
Creating application done.
> Retrieving application settings ...
Registry key HKEY_LOCAL_MACHINE\Software\Advanced Windows Debugging found
Create file C:\Program Files\sample4.test found
Retrieving application done.
在这个示例中,应用程序在 UAC 上下文中能够正常创建和检索配置信息。
- 在提升权限的提示下运行失败 :
c:\>c:\AWDBIN\WinXP.x86.chk\07sample.exe
Press:
0 To use Security Descriptor APIs
1 To run Impersonation test
2 To run Default SD test
3 To run MAXIMUM_ALLOWED test
4 To set application configuration information
5 To read application configuration information
x To exit
> Retrieving application settings ...
RegOpenKeyW failed.Last error = 2
CreateFile failed with:Last error = 2
Retrieving application done.
在这个示例中,尽管应用程序是从提升的提示下启动的,但却无法从全局存储中检索任何信息。
这是因为 Windows Vista 为了临时修复需要管理员权限的应用程序而添加了注册表和文件虚拟化功能。该功能默认启用,但可以使用本地安全策略管理单元来禁用。不过,不建议禁用此功能,因为禁用后所有现有的虚拟文件或注册表项都会丢失。
虚拟文件存储在用户配置文件中的
%USERPROFILE%\AppData\Local\VirtualStore
文件夹中,其文件夹树结构如下:
C:\>tree %USERPROFILE%\AppData\Local\VirtualStore /a
Folder PATH listing for volume New Volume
Volume serial number is 5C50-0187
C:\USERS\DANIEL\APPDATA\LOCAL\VIRTUALSTORE
+--Program Files
| +--Common Files
| \--SmartFTP Client 2.0
| \--Minidump
\--Windows
\--Debug
\--UserMode
虚拟注册表存储在当前用户配置文件中的
HKEY_CURRENT_USER\Software\Classes\VirtualStore
键下。可以使用命令行工具
reg.exe
来搜索键的位置,示例如下:
C:\>reg query HKCU /s /k /f “Advanced Debugging”
HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Advanced Debugging
End of search: 1 match(es) found.
由于以提升模式运行的应用程序不受虚拟化影响,它们对系统的视图与在 UAC 下运行的应用程序不同。Windows Vista 虚拟化会影响所有使用 Windows 注册表作为配置存储的工具。工具需要根据需要以提升模式运行或不以提升模式运行。例如,要在 MMC 管理单元上启用应用程序验证器,需要以提升模式运行应用程序验证器,因为
MMC.EXE
总是以提升模式运行。否则,配置工具会更新虚拟注册表项,而应用程序以提升模式启动时不会使用该虚拟注册表项。虚拟化状态可以在 Windows 任务管理器的“进程”选项卡的“可视化”列中查看,可以通过“视图” -> “选择列”菜单命令来启用该列。
以下是一个简单的流程图,展示了应用程序在不同模式下的虚拟化情况:
graph TD;
A[应用程序启动] --> B{是否以提升模式运行};
B -- 是 --> C[不受虚拟化影响];
B -- 否 --> D{是否有指定请求执行级别};
D -- 是 --> E[不受虚拟化影响];
D -- 否 --> F[受虚拟化影响];
5. 应用程序在标准用户账户下的问题及解决方法
5.1 应用程序无法在标准用户账户下工作的原因
一些应用程序在操作系统默认安全设置保护的位置进行写入操作,要写入这些位置,应用程序必须在本地管理员账户下运行。将可配置设置保存在安装文件夹或全局注册表项(如
HKEY_LOCAL_MACHINE
)中的应用程序,是常见的失败案例。
5.2 查找问题的方法
- 使用应用程序验证器测试 :按照第 1 章介绍的方法,使用应用程序验证器对应用程序进行测试。
- 使用 Microsoft 标准用户分析器工具 :该工具可以从 Microsoft 网站免费下载,用于评估应用程序在标准用户账户下的行为。
5.3 解决问题的方法
在开发阶段修复应用程序是最快和最有效的解决方案。这样做还有一个积极的副作用,即应用程序更接近获得 Windows Vista 认证标志。要找出所有不符合 Windows Vista 认证标准的进程,简单检查虚拟文件和注册表位置很可能会发现它们。
6. 受保护进程的安全特性
除了为创建“有史以来最安全的 Windows 版本”而进行的安全更改外,Windows Vista 还引入了其他安全更改,旨在防止对所谓的受保护进程进行篡改。受保护进程通常是托管媒体播放应用程序,当使用受 DRM 技术保护的媒体时,它能提供更高程度的防篡改保护。
虽然支持受保护进程的更改在内核中深入实现,但表现为无法调试此类进程。Microsoft MSDN 有几篇白皮书描述了受保护进程以及该领域的未来发展。
综上所述,Windows Vista 引入了一系列安全特性,这些特性对软件应用程序产生了重要影响。了解这些安全特性的工作原理和影响,以及掌握从失败系统中提取详细信息的机制,对于开发和调试在 Windows Vista 上运行的应用程序至关重要。以下是一个总结表格,展示了 Windows Vista 主要安全特性及其影响:
| 安全特性 | 描述 | 影响 |
| — | — | — |
| 堆管理器革新 | 新的低碎片前端分配器改善安全和性能,
!heap
扩展命令更新 | 便于深入研究堆,提高应用程序调试效率 |
| 用户账户控制(UAC) | 引入完整性级别,控制进程交互和消息流 | 增强系统安全性,防止恶意软件利用管理员权限漏洞 |
| 注册表和文件虚拟化 | 临时修复需要管理员权限的应用程序 | 影响应用程序对注册表和文件的访问,需注意运行模式 |
| 受保护进程 | 防止对特定进程的篡改 | 提高媒体播放等应用程序的安全性,但调试受限 |
超级会员免费看
141

被折叠的 条评论
为什么被折叠?



