Windows Vista操作系统最新安全特性分析:改进和局限 (上)
没有十全十美的安全系统。
——安全领域第一定律
申明。文章仅代表个人观点,与所在公司无任何联系。
1. 概述
微软最新发行的Windows Vista操作系统,特别强调了对安全特性的支持。可以毫不夸张地说,安全特性的提高是Windows Vista操作系统同以往发布的Windows操作系统相比,改进最大的地方之一,也是促使用户升级到Windows Vista操作系统的重要考虑因素。
Windows Vista操作系统提供的各类最新的安全特性,涵盖以下四个大部分:
· 基础平台。包括安全软件开发周期(SDL),系统服务保护(Service Hardening),防止缓存溢出,64位平台安全改进。
· 权限保护。包括用户帐户控制(UAC),智能卡/登陆体系,网络权限保护(NAP)。
· 防止有害软件和恶意入侵。包括安全中心,反间谍软件(Windows Defender)和有害软件删除工具,防火墙,IE安全改进。
· 数据保护。包括BitLocker,加密文件系统,版权保护,USB设备控制。
本文会逐一分析每一个安全特性的开发背景,Windows Vista中做出的改进,及应用范围。并且特别强调了每一个安全特性的局限性。因为在安全领域中有一句话:比没有安全更糟糕的是虚假的安全。
通过对每一个安全特性的分析,希望读者能得到以下两个关键信息:
· Windows Vista 提供了许多非常好的安全特性
· Windows Vista 不能解决你所有的安全问题。在某种程度上,意识这一点更为重要。
2. 安全是什么?
安全是一个整体的,系统的概念。安全的范围包括硬件安全,软件安全,员工培训等等。其主要目的,就是为了保证被保护的核心数据不被损害,这意味着:
· 权限控制:合法用户拥有权限,而非法用户则无法访问。
· 可靠性:合法用户可以成功执行数据操作。
· 完整性:合法用户所得到的数据是正确的,未经篡改的。
无论是计算机病毒,间谍软件,或黑客等,其行为都是针对数据的正常访问。例如:删除数据,窃取数据,篡改数据,DDOS攻击等等。
图
1:Windows Vista在可用性和安全的取舍
在这个世界上,没有十全十美的安全系统。任何一个操作系统必须在不同特性中作出取舍。以Windows 95举例,它的可用性好,但安全性差。 而Windows Vista中,针对安全特性的提高,有时候则不得不牺牲部分可用性。例如,用户帐户控制这个Windows Vista中新增安全特性就是一个典型的例子。
3. 基础平台
3.1安全软件开发周期
背景:冲击波病毒。众所周知,当年Blaster病毒给微软及其用户带来了巨大的损失。安全软件开发周期(SDL - Security Development Lifecycle)可以说是一个微软痛定思痛后,决心加强产品安全的产物。
SDL的中心思想就是将安全特性的考虑渗透到产品生命周期的每一个阶段。
· 设计。每一个功能模块均需要制定其相应的风险模型(threat model),来预测可能的攻击方式,相应反制措施等等。
· 开发。遵循严格的代码规范。对禁止使用那些容易误用的API调用。使用静态程序分析工具查寻可疑的代码片断。
· 测试。特别严格测试风险模型指出的高风险代码。并广泛采用“FUZZ”测试。“FUZZ”测试指通过模拟错误的,不合规范的输入数据,来测试软件代码针对错误处理的响应。它被证明是一个有效的发现产品漏洞的测试手段。
· 审查。产品代码在正式发布前要经过严格的安全审查,
· 维护/响应。一旦正式发布的产品代码中发现安全漏洞,需要有一套严格的安全响应程序,以迅速,正确地提供安全补丁。
我们用对筷子的设计来举例SDL对产品安全的影响。在普通设计下,考虑的因素也许是筷子的易用,结实,好看。加入SDL安全考虑,就需要考虑:如何不让别人抢走我的筷子?如何不让别人的筷子伸到我的碗里?如何不让别人伪造我的筷子等等在普通设计中忽视考虑的因素。
Windows Vista是第一个从头至尾采用SDL进行开发的操作系统。通过SDL严格的开发规程,微软期望,Windows Vista安全水准较先前Windows操作系统有显著提高。
但是,任何开发人员都是无法完全预知未来攻击的所有模式。换句话说,就是开发者是不可能预测到攻击者是怎么想,会怎么用操作系统的。所以说,SDL并不能保证操作系统杜绝所有的安全漏洞。Windows Vista操作系统会有自身的安全漏洞。而我们希望的是,SDL可以减少这些安全漏洞的数目和严重程度。
3.2系统服务保护(Service Hardening)
背景:系统服务程序(System Service)被恶意软件攻击的次数日益增多。原因有以下两点:
· 系统服务无需用户交互,即可自动运行。
· 系统服务运行于“LocalSystem”账号下,拥有对系统的完全控制权。一旦被成功攻击,恶意程序就可以在系统上为所欲为。
最著名的例子就是冲击波病毒。它就是攻击DCOM的远程调用(RPC)系统服务。
在Windows Vista操作系统提供了系统服务保护功能。包括:
· 许多系统服务程序运行在较低权限的用户帐号下,如LocalService or NetworkService。
· 系统服务程序有相应的配置文件,用以指定该服务可以执行的文件,注册表和网络行为。例如,远程调用(RPC)系统服务被限制为不能更改系统文件和注册表。通过和防火墙配置的结合,可以限制系统服务的异常网络行为。这样,即使一个系统程序被攻击,由于不能修改重要的系统文件和注册信息,或者连接网络,它所造成的危害也会得到限制。
局限性。Service Hardening是不可能限制所有的系统服务的。关键的系统服务还是需要在系统核心权限下运行。一旦这些服务出现安全漏洞,还是会导致严重的安全问题。
3.3防止缓存溢出
背景:缓存溢出是操作系统最为严重的安全漏洞。几个有名的例子是:
· Code Red: IIS缓存溢出
· Blaster: DCOM RPC缓存溢出
· Zotob: PnP缓存溢出
其原因在于,缓存溢出的安全漏洞往往导致恶意代码可被远程执行。以下是一个堆栈缓存溢出的例子:
/*以下UnSafeNetRecv代码*/
void UnSafeNetRecv(char* payload)
{
char localBuffer[128];
… …
strcpy (localBuffer, payload);
}
在编译过程中,堆栈空间是自高向低分配的。函数UnSafeNetRecv的堆栈分配如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/chengyun_chu/290393/o_image002.gif)
图2:缓存溢出的安全漏洞
在执行到strcpy (localBuffer, payload) 时,如果从网络传输的payload长度超过128个字节,函数的返回地址就被覆盖。重新写入的地址会指向传入的恶意数据(代码)。这样,当函数返回时,IP寄存器不是指向上一层调用,而是从恶意数据(代码)处开始执行。
3.3.1 NX保护
NX的含义是“No Execution”。在以上的缓存溢出的例子中,恶意代码在堆栈上被执行。NX保护可以指定特定的页面(如堆栈所在页面)是数据页面,不允许在上运行指令。这样,一旦IP寄存器指向了堆栈所在页面,会导致硬件异常,而不是执行恶意数据(代码)。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/chengyun_chu/290393/o_image005.gif)
图3:NX保护
Windows Vista相对Windows XP SP2,提供了更多NX保护支持。在32位平台上,Windows Vista的缺省设置是系统代码设置满足NX标准(NX-compliant)。同时,还可以指定某个特定的应用程序是否满足NX标准。这样,在确保向前兼容性的前提下,可以最大可能的提高系统中被NX保护的比例。在64位平台上,NX保护缺省设置为应用于所有代码。
3.3.2寻址空间随机分布(ASLR)
同样从上个堆栈溢出的例子说起。如果写入的新的返回地址不是指回堆栈页面,而是指向了一个系统函数的入口地址,那样NX保护就不起作用。这类攻击有一个前提,即特定系统函数的入口地址是可以事先确定的。
寻址空间随机分布(ASLR: Address Space Layout Randomization)就是针对此类攻击手段。在Windows Vista启动时,操作系统随机从256个地址空间中选出一个载入DLL/EXE。这样攻击方就难以事先确定系统函数的入口地址。
寻址空间随机分布和NX保护结合在一起,可以有效限制缓存溢出危害程度。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/chengyun_chu/290393/o_image003.gif)
图4:寻址空间随机分布
局限性。尽管缓存溢出是操作系统最为严重的安全漏洞,并不是所有严重的安全漏洞都是由缓存溢出导致的。例如,2006年Windows系统最严重的安全漏洞之一,MS06-001 WMF安全漏洞,就和缓存溢出没有关系。在这种情况下,NX保护,或是寻址空间随机分布,都是不起作用的。
3.4 64位平台安全改进
背景:有缺陷或恶意的驱动程序导致系统崩溃,不稳定,和极为严重的安全问题。
这里需要简单介绍“Rootkit”这个概念。这个术语来自于Unix系统。最早的一个版本是出现在SunOS 4。它特指那些用于修改操作系统,以改变操作系统的表现行为的工具软件 。而这种改变,往往不是操作系统设计时所期望的。
Rootkit最典型的目的就是“隐藏”。隐藏的对象可以是文件,特定的注册表,特定进程,打开的网络端口等等。这个“隐藏”是通过修改操作系统本身来实现的。下面是Win32 API的调用过程:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/chengyun_chu/290393/o_image004.gif)
图5:Win32 API的调用过程
Rootkit可以将自身代码插入到每一个箭头连接处,以控制函数的返回结果。举个例子,一个应用程序(如反病毒软件)需要查询系统中运行的当前进程,Rootkit只需要将所想隐藏的进程从返回的进程列表中删除,那么上层的应用程序就根本不知道有这样一个进程正在系统中运行。
为什么说Rootkit会导致严重的安全问题?试想一下,如果一个恶意程序把自身文件和运行进程从系统中隐藏起来,那么如何指望反病毒软件/反间谍软件能成功的检测/清除这个程序?!
在64位平台Windows Vista,特别增加了下面两个重要的安全特性。
· 设备驱动程序数字认证。在64位平台Windows Vista中,所有工作在核心模式下的设备驱动程序都必须提供数字认证,才能被系统加载。由于需要修改操作系统行为,Rootkit往往是一个工作在核心模式下的设备驱动程序。那么,数字认证首先可以指明一个驱动程序是由哪个厂商发布的。其次,数字认证可以验证这个驱动程序的代码完整性,也就是否被篡改过。这样,就可以防止系统加载Rootkit驱动程序。
· 核心模式保护(Kernel Patch Protection)。这个技术也被称为PatchGuard。它用来防止未经认证的代码自由修改操作系统的核心状态(Kernel State)。最为危险的Rootkit往往直接修改核心模式的重要数据,例如系统的进程控制表,中断控制表等等。通过对核心状态的保护,可以有效阻止这类攻击。
局限性。由于向前兼容的原因,设备驱动程序的数字认证,和核心模式保护只在64位平台上有效。也就是说,32位平台Windows Vista上的Rootkit威胁并没有得到有效控制。