edit_note帖子
1,551
stars积分
20,071
event加入
2011-05-19
怀旧国机
Windows Vista内核的安全性②
schedule发表于 2013-05-27 16:05:00
visibility查看 163
chat_bubble回复 3
#1 楼主
6.受保护的进程
下一代多媒体内容,如 HD-DVD、BluRay 和高级访问内容系统 (AACS) 下许可的其他格式,在以后几年内会变得更加常见。Windows Vista 包括许多技术,统称为受保护的媒体路径 (PMP),AACS 标准要求在播放此类内容时使用这些技术。PMP 包括受保护的用户模式音频 (PUMA) 和受保护的视频路径 (PVP),它们一直为音频和视频驱动程序及媒体播放机应用程序提供机制,以防止未授权软件或硬件捕获高清晰度格式的内容。
PUMA 和 PVP 定义特定于音频和视频播放机、设备驱动程序和硬件的接口和支持,但是 PMP 也依赖在 Windows Vista 中引入的一般内核机制,即称为受保护的进程。受保护的进程以标准的 Windows 进程构造为基础,该构造封装了运行的可执行映像、其 DLL、安全上下文(进程运行所在的帐户及其安全权限),及在进程内执行代码但阻止某些访问类型的线程。
标准进程实施访问控制模式,允许使用“调试程序”权限完全访问进程所有者和管理帐户。完全访问允许用户查看和修改进程的地址空间,包括映射到进程的代码和数据。用户也可以将线程注入进程。这些访问类型与 PMP 的要求不一致,因为它们允许未授权代码获取存储在播放内容的进程中的高清晰度内容和数字版权管理 (DRM) 密钥的访问权限。
受保护的进程限制访问一组受限的信息和进程管理界面,包括查询进程的映像名和终止或挂起进程。但是,内核通过一般的进程查询功能(返回有关系统上所有进程的数据)为受保护的进程提供诊断信息,因此不要求直接访问进程。访问可能会损坏只允许通过其他受保护的进程访问的媒体。
此外,为避免从内部受到危害,加载到受保护进程的所有可执行代码(包括其可执行映像和 DLL)必须由 Microsoft (WHQL) 使用受保护的环境 (PE) 标记签名,或者(如果是音频编解码器)由开发人员使用从 Microsoft 获得的 DRM 签名证书签名。因为内核模式代码可以获取任何进程的完全访问权限(包括受保护的进程),并且 32 位 Windows 允许加载未签名的内核模式代码,所以内核可为受保护的进程提供 API,以查询内核模式环境的“清洁度”,并仅在没有加载未签名代码时使用结果解除对高级内容的锁定。
没有特定识别受保护进程的 API,但是您可以间接地根据有关它们的受限信息以及甚至无法从管理帐户进行调试来识别它们。音频设备图形隔离进程 (%Systemroot%\System32\Audiodg.exe) 用于播放使用内容加密系统 (CSS) 编码的 DVD,并在“任务管理器”窗格中标识为受保护的进程。事实上,即使使用管理权限运行,任务管理器也无法获得其命令行、虚拟化和数据执行保护状态。
7.地址空间加载随机化
不管采取什么措施,如数据执行保护和增强的编译器错误检查,恶意软件作者都会继续找到缓冲区溢出漏洞,这些漏洞使他们能够感染面向网络的进程(如 Internet Explorer、Windows 服务及第三方应用程序),获得进入系统的立足点。不过,在设法感染进程后,他们必须使用 Windows API 通过修改用户或系统配置设置来完成读取用户数据或建立永久存在的最终目的。
使用 DLL 导出的 API 入口点连接应用程序,通常由操作系统加载器处理,但是这些类型的恶意软件感染不会从加载器的服务中受益。恶意软件在以前的 Windows 版本中还没有出现过此类问题,因为对于任何特定的 Windows 版本,系统可执行映像和 DLL 总在同一个位置加载,让恶意软件假定 API 驻留在固定的地址。
Windows Vista 地址空间加载随机化 (ASLR) 功能使恶意软件不可能知道 API 的位置,方法是通过每次系统启动时在不同位置加载系统 DLL 和可执行文件。在启动进程早期,内存管理器会从用户模式地址空间顶部 16MB 区域的 256 个 64KB 对齐地址中随机选取一个作为 DLL 映像加载偏差。由于在映像标头中有新的动态重新定位标记的 DLL 加载到进程中,因此内存管理器会从映像加载偏差地址开始并继续将 DLL 选取到内存中。
具有标记组的可执行文件会得到类似的处理,在存储在其映像标头中的 16MB 基本加载地址内以随机的 64KB 对齐点加载。此外,如果使用给定的 DLL 或可执行文件的所有进程卸载后再次加载它,内存管理器会重新选择一个随机的加载位置。
只有具有动态重新定位标记的映像(包括所有 Windows Vista DLL 和可执行文件)才能重新定位,因为移动原有映像可能会中断开发人员对其映像加载位置所做的内部假设。Visual Studio 2005 SP1 增加了对设置标记的支持,以便第三方开发人员可以充分利用 ASLR。
将 DLL 加载地址随机分布到 256 个位置之一,并不会使恶意软件猜不出正确的 API 位置,但是它会严重限制网络蠕虫传播的速度,并且可以阻止仅有一次机会感染系统的恶意软件以可靠地运行。此外,ASLR 的重新定位策略的第二个好处是,地址空间压缩比在以前的 Windows 版本上的更加紧密,为连续内存分配创建更大的可用内存区域,减少内存管理分配以跟踪地址空间布局的页表数,以及最小化转换旁路缓冲器 (TLB) 遗漏。
8.服务安全性改进
Windows 服务成为理想的恶意软件目标。许多服务都提供通过网络访问其功能,这很可能会暴露远程可利用的访问系统的机会,而大多数服务运行都使用比标准用户帐户更多的权限,如果它们被恶意软件利用,则会提供在本地系统上提升权限的机会。因此,Windows 以在 Windows XP SP2 中所做的更改为始不断完善,将权限和对指定服务的访问权限降为仅其角色需要的权限。例如,Windows XP SP2 引入了本地服务和网络服务帐户(仅包括服务以前一直运行的本地系统帐户权限的子集)。这样可以在利用服务时最小化攻击者获取的访问权限。
通过使用像 Sysinternals 提供的 Process Explorer 一样的工具,在两个不同的引导会话中比较进程的 DLL 加载地址,您可以很容易看到 ASLR 的效果。在从两个不同会话截取的这两个屏幕快照中,Ntdll.dll 首先在地址 0x77A30000、然后在地址 0x77750000 加载到 Explorer。 在以前的文章中,就介绍了服务如何在其会话中与用户帐户分开运行,但是 Windows Vista 还通过进一步降低分配给大多数服务对文件、注册表项及防火墙端口的权限和访问权限,以扩大其最小权限原则的使用。Windows Vista 为每种服务定义了一组唯一的新帐户,称为服务安全标识符 (SID)。服务可以对其资源设置权限,这样只有其服务 SID 拥有访问权限,避免在服务出现安全漏洞时以相同用户帐户运行的其他服务拥有访问权限。您可以使用 sc showsid 命令后接服务名称来查看服务的 SID。
服务 SID 保护对特定服务所拥有资源的访问权限,但默认情况下,服务对其运行的用户帐户可以访问的所有对象仍有访问权限。例如,在“本地服务”帐户中运行的服务可能无法访问在不同进程(该进程使用参考服务 SID 的权限保护其对象)中以“本地服务”运行的另一服务创建的资源;但是,它仍可以读取和写入“本地服务”(以及“本地服务”所属的任何组,如“服务组”)有权访问的任何对象。
因此,Windows Vista 引入了称为限制写入服务的新受限服务类型,可让服务仅对其服务 SID、Everyone 组及分配到登录会话的 SID 可访问的对象允许写入访问权限。为了实现这一点,它会使用重新引入 Windows 2000 的受限 SID 类型。当打开对象的进程是限制写入服务时,访问 - 检查算法会发生变化,这样尚未以受限和非受限方式分配到进程的 SID 就无法用来为进程授予 对象的写入权限。您可以使用以下命令查看服务是否受限:sc qsidtype [service]
另一个变化是让服务更容易阻止在相同帐户中运行的其他服务对其创建的服务拥有访问权限。在以前的 Windows 版本中,对象的创建者也是对象的所有者,而且所有者能够读取和更改其对象的权限,允许其对自己对象的完全访问权限。Windows Vista 引入了新的所有者权限 SID,如果在对象的权限中存在 SID,则 SID 可以限制所有者对其对象的访问权限,甚至会删除设置和查询权限的权利。
对 Windows Vista 中服务安全模式的进一步改进,可以让服务开发人员确切地指定当服务在系统上注册时,此服务需要什么安全权限才能操作。例如,如果服务需要生成审核事件,它就可以列出“审核”权限。
当“服务控制管理器”启动托管一个或多个 Windows 服务的进程时,它就为在该进程中仅包括服务所需权限的进程创建了一个安全令牌(列出进程用户帐户、组成员身份和安全权限的内核对象)。如果服务指定了其运行的帐户不可用的权限,则服务无法启动。当“本地服务”帐户进程中未运行任何需要(例如)“调试程序”权限的服务时,“服务控制管理器”会从进程的安全令牌中剥夺此权限。因此,如果服务进程被破坏,恶意代码无法利用进程中运行的服务未明确请求的权限。sc qprivs 命令会报告服务已请求的权限。
9.查看限制写入服务
在 Windows Vista 上只有一种托管服务进程托管受限服务,您可以使用进程查看工具(如 Process Explorer)将它识别为具有以下命令行的进程:svchost -k LocalServiceNoNetwork
配置在此进程中运行的服务包括基本筛选引擎、诊断策略服务、Windows 防火墙、性能日志和警报及 Windows Media Center 服务启动程序。
此屏幕显示文本格式的基本筛选引擎的服务 SID (NT SERVICE\BFE),第一次列出时有受限标记,再次列出时没有受限标记,因此进程对该帐户可以访问的资源拥有访问权限。不过,它不必对“本地服务”帐户通常可以访问的其他对象拥有访问权限。例如,因为 NT AUTHORITY\SERVICE 帐户不会在有受限标记的进程令牌中出现,所以进程无法修改仅对令牌(有受限标记)中此帐户而不是其他帐户授予写入权限的对象。
在此进程中运行的服务还会限制其权限,因为在属性对话框底部列出的权限是可用于“本地服务”帐户的子集。
结束语
有些功能和改进本文没有涉及或提及,如面向应用程序开发人员的新的工作线程池、新的同步机制(如共享读取器/编写器锁定)、服务线程标记、对在线 NTFS 磁盘检查和卷大小调整的支持以及称为高级本地过程调用 (ALPC) 的新内核 IPC 机制。
下一代多媒体内容,如 HD-DVD、BluRay 和高级访问内容系统 (AACS) 下许可的其他格式,在以后几年内会变得更加常见。Windows Vista 包括许多技术,统称为受保护的媒体路径 (PMP),AACS 标准要求在播放此类内容时使用这些技术。PMP 包括受保护的用户模式音频 (PUMA) 和受保护的视频路径 (PVP),它们一直为音频和视频驱动程序及媒体播放机应用程序提供机制,以防止未授权软件或硬件捕获高清晰度格式的内容。
PUMA 和 PVP 定义特定于音频和视频播放机、设备驱动程序和硬件的接口和支持,但是 PMP 也依赖在 Windows Vista 中引入的一般内核机制,即称为受保护的进程。受保护的进程以标准的 Windows 进程构造为基础,该构造封装了运行的可执行映像、其 DLL、安全上下文(进程运行所在的帐户及其安全权限),及在进程内执行代码但阻止某些访问类型的线程。
标准进程实施访问控制模式,允许使用“调试程序”权限完全访问进程所有者和管理帐户。完全访问允许用户查看和修改进程的地址空间,包括映射到进程的代码和数据。用户也可以将线程注入进程。这些访问类型与 PMP 的要求不一致,因为它们允许未授权代码获取存储在播放内容的进程中的高清晰度内容和数字版权管理 (DRM) 密钥的访问权限。
受保护的进程限制访问一组受限的信息和进程管理界面,包括查询进程的映像名和终止或挂起进程。但是,内核通过一般的进程查询功能(返回有关系统上所有进程的数据)为受保护的进程提供诊断信息,因此不要求直接访问进程。访问可能会损坏只允许通过其他受保护的进程访问的媒体。
此外,为避免从内部受到危害,加载到受保护进程的所有可执行代码(包括其可执行映像和 DLL)必须由 Microsoft (WHQL) 使用受保护的环境 (PE) 标记签名,或者(如果是音频编解码器)由开发人员使用从 Microsoft 获得的 DRM 签名证书签名。因为内核模式代码可以获取任何进程的完全访问权限(包括受保护的进程),并且 32 位 Windows 允许加载未签名的内核模式代码,所以内核可为受保护的进程提供 API,以查询内核模式环境的“清洁度”,并仅在没有加载未签名代码时使用结果解除对高级内容的锁定。
没有特定识别受保护进程的 API,但是您可以间接地根据有关它们的受限信息以及甚至无法从管理帐户进行调试来识别它们。音频设备图形隔离进程 (%Systemroot%\System32\Audiodg.exe) 用于播放使用内容加密系统 (CSS) 编码的 DVD,并在“任务管理器”窗格中标识为受保护的进程。事实上,即使使用管理权限运行,任务管理器也无法获得其命令行、虚拟化和数据执行保护状态。
7.地址空间加载随机化
不管采取什么措施,如数据执行保护和增强的编译器错误检查,恶意软件作者都会继续找到缓冲区溢出漏洞,这些漏洞使他们能够感染面向网络的进程(如 Internet Explorer、Windows 服务及第三方应用程序),获得进入系统的立足点。不过,在设法感染进程后,他们必须使用 Windows API 通过修改用户或系统配置设置来完成读取用户数据或建立永久存在的最终目的。
使用 DLL 导出的 API 入口点连接应用程序,通常由操作系统加载器处理,但是这些类型的恶意软件感染不会从加载器的服务中受益。恶意软件在以前的 Windows 版本中还没有出现过此类问题,因为对于任何特定的 Windows 版本,系统可执行映像和 DLL 总在同一个位置加载,让恶意软件假定 API 驻留在固定的地址。
Windows Vista 地址空间加载随机化 (ASLR) 功能使恶意软件不可能知道 API 的位置,方法是通过每次系统启动时在不同位置加载系统 DLL 和可执行文件。在启动进程早期,内存管理器会从用户模式地址空间顶部 16MB 区域的 256 个 64KB 对齐地址中随机选取一个作为 DLL 映像加载偏差。由于在映像标头中有新的动态重新定位标记的 DLL 加载到进程中,因此内存管理器会从映像加载偏差地址开始并继续将 DLL 选取到内存中。
具有标记组的可执行文件会得到类似的处理,在存储在其映像标头中的 16MB 基本加载地址内以随机的 64KB 对齐点加载。此外,如果使用给定的 DLL 或可执行文件的所有进程卸载后再次加载它,内存管理器会重新选择一个随机的加载位置。
只有具有动态重新定位标记的映像(包括所有 Windows Vista DLL 和可执行文件)才能重新定位,因为移动原有映像可能会中断开发人员对其映像加载位置所做的内部假设。Visual Studio 2005 SP1 增加了对设置标记的支持,以便第三方开发人员可以充分利用 ASLR。
将 DLL 加载地址随机分布到 256 个位置之一,并不会使恶意软件猜不出正确的 API 位置,但是它会严重限制网络蠕虫传播的速度,并且可以阻止仅有一次机会感染系统的恶意软件以可靠地运行。此外,ASLR 的重新定位策略的第二个好处是,地址空间压缩比在以前的 Windows 版本上的更加紧密,为连续内存分配创建更大的可用内存区域,减少内存管理分配以跟踪地址空间布局的页表数,以及最小化转换旁路缓冲器 (TLB) 遗漏。
8.服务安全性改进
Windows 服务成为理想的恶意软件目标。许多服务都提供通过网络访问其功能,这很可能会暴露远程可利用的访问系统的机会,而大多数服务运行都使用比标准用户帐户更多的权限,如果它们被恶意软件利用,则会提供在本地系统上提升权限的机会。因此,Windows 以在 Windows XP SP2 中所做的更改为始不断完善,将权限和对指定服务的访问权限降为仅其角色需要的权限。例如,Windows XP SP2 引入了本地服务和网络服务帐户(仅包括服务以前一直运行的本地系统帐户权限的子集)。这样可以在利用服务时最小化攻击者获取的访问权限。
通过使用像 Sysinternals 提供的 Process Explorer 一样的工具,在两个不同的引导会话中比较进程的 DLL 加载地址,您可以很容易看到 ASLR 的效果。在从两个不同会话截取的这两个屏幕快照中,Ntdll.dll 首先在地址 0x77A30000、然后在地址 0x77750000 加载到 Explorer。 在以前的文章中,就介绍了服务如何在其会话中与用户帐户分开运行,但是 Windows Vista 还通过进一步降低分配给大多数服务对文件、注册表项及防火墙端口的权限和访问权限,以扩大其最小权限原则的使用。Windows Vista 为每种服务定义了一组唯一的新帐户,称为服务安全标识符 (SID)。服务可以对其资源设置权限,这样只有其服务 SID 拥有访问权限,避免在服务出现安全漏洞时以相同用户帐户运行的其他服务拥有访问权限。您可以使用 sc showsid 命令后接服务名称来查看服务的 SID。
服务 SID 保护对特定服务所拥有资源的访问权限,但默认情况下,服务对其运行的用户帐户可以访问的所有对象仍有访问权限。例如,在“本地服务”帐户中运行的服务可能无法访问在不同进程(该进程使用参考服务 SID 的权限保护其对象)中以“本地服务”运行的另一服务创建的资源;但是,它仍可以读取和写入“本地服务”(以及“本地服务”所属的任何组,如“服务组”)有权访问的任何对象。
因此,Windows Vista 引入了称为限制写入服务的新受限服务类型,可让服务仅对其服务 SID、Everyone 组及分配到登录会话的 SID 可访问的对象允许写入访问权限。为了实现这一点,它会使用重新引入 Windows 2000 的受限 SID 类型。当打开对象的进程是限制写入服务时,访问 - 检查算法会发生变化,这样尚未以受限和非受限方式分配到进程的 SID 就无法用来为进程授予 对象的写入权限。您可以使用以下命令查看服务是否受限:sc qsidtype [service]
另一个变化是让服务更容易阻止在相同帐户中运行的其他服务对其创建的服务拥有访问权限。在以前的 Windows 版本中,对象的创建者也是对象的所有者,而且所有者能够读取和更改其对象的权限,允许其对自己对象的完全访问权限。Windows Vista 引入了新的所有者权限 SID,如果在对象的权限中存在 SID,则 SID 可以限制所有者对其对象的访问权限,甚至会删除设置和查询权限的权利。
对 Windows Vista 中服务安全模式的进一步改进,可以让服务开发人员确切地指定当服务在系统上注册时,此服务需要什么安全权限才能操作。例如,如果服务需要生成审核事件,它就可以列出“审核”权限。
当“服务控制管理器”启动托管一个或多个 Windows 服务的进程时,它就为在该进程中仅包括服务所需权限的进程创建了一个安全令牌(列出进程用户帐户、组成员身份和安全权限的内核对象)。如果服务指定了其运行的帐户不可用的权限,则服务无法启动。当“本地服务”帐户进程中未运行任何需要(例如)“调试程序”权限的服务时,“服务控制管理器”会从进程的安全令牌中剥夺此权限。因此,如果服务进程被破坏,恶意代码无法利用进程中运行的服务未明确请求的权限。sc qprivs 命令会报告服务已请求的权限。
9.查看限制写入服务
在 Windows Vista 上只有一种托管服务进程托管受限服务,您可以使用进程查看工具(如 Process Explorer)将它识别为具有以下命令行的进程:svchost -k LocalServiceNoNetwork
配置在此进程中运行的服务包括基本筛选引擎、诊断策略服务、Windows 防火墙、性能日志和警报及 Windows Media Center 服务启动程序。
此屏幕显示文本格式的基本筛选引擎的服务 SID (NT SERVICE\BFE),第一次列出时有受限标记,再次列出时没有受限标记,因此进程对该帐户可以访问的资源拥有访问权限。不过,它不必对“本地服务”帐户通常可以访问的其他对象拥有访问权限。例如,因为 NT AUTHORITY\SERVICE 帐户不会在有受限标记的进程令牌中出现,所以进程无法修改仅对令牌(有受限标记)中此帐户而不是其他帐户授予写入权限的对象。
在此进程中运行的服务还会限制其权限,因为在属性对话框底部列出的权限是可用于“本地服务”帐户的子集。
结束语
有些功能和改进本文没有涉及或提及,如面向应用程序开发人员的新的工作线程池、新的同步机制(如共享读取器/编写器锁定)、服务线程标记、对在线 NTFS 磁盘检查和卷大小调整的支持以及称为高级本地过程调用 (ALPC) 的新内核 IPC 机制。
全部回复 (3)
2013-05-27 16:13:00
沙发
沙发
~~~~
2013-05-27 18:17:00
板凳
<br/>道,可道,非常道;名,可名,非常名!
2013-05-27 19:06:00
地板
以后别发这种帖子,vista已经没人会用了!
登录 后才能回复
flag举报帖子