深入理解Windows Vista内核三:BitLocker
Windows Vista是目前最安全的Windows操作系统。除了包含Windows Defender防间谍软件引擎,Windows Vista还引入了很多安全和深度防御特性,包括BitLocker全卷加密特性,内核模式代码的代码签名,受保护的进程、地址空间随机加载(ASLR),还有Windows服务的安全改进和用户帐户控制(UAC)。
只有在运行的时候,操作系统才能强制执行其安全策略,所以为了防止系统的物理安全受到攻击,防止绕过操作系统访问数据,我们必须采用额外的方法来保护数据。BIOS密码和加密这样的基于硬件的机制,是我们常用的两种方法,可以阻止未经授权的访问,尤其是笔记本电脑(更容易被窃或者丢失)。
Windows 2000引入了EFS加密,而在Windows Vista中,EFS具有许多新的改进,包括性能的提升、支持页面文件加密、可以在智能卡里存储用户的EFS密钥。但是我们无法借助EFS来保护系统的某些敏感区域,例如注册表配置单元文件。举个例子,如果组策略允许我们不在域环境时登录到笔记本电脑,验证所用的域凭据就会缓存在注册表中,这样攻击者就可以使用工具获取域帐户密码的散列值,然后借助密码破解工具来破解域帐户的密码。然后攻击者就可以访问我们的帐户,并且偷获我们的EFS加密文件(假设我们没有把EFS加密密钥保存在智能卡里)。
为了方便加密整个启动卷(包含Windows安装目录的卷),包括所有系统文件和数据,Windows Vista引入了一个称为BitLocker的全卷加密特性。EFS通过NTFS文件系统驱动程序来实现,并在文件的级别上进行操作;而BitLocker则有所不同,它使用全卷加密驱动程序(FVE)(%Systemroot%\System32\Drivers\Fvevol.sys),在整个卷的级别上进行加密,如图1所示。

FVE是一个筛选级驱动程序,所以它能看到NTFS文件系统发送给卷的所有的I/O请求,写入的时候自动进行加密,而读取的时候自动进行解密,加密和解密过程是通过全卷加密密钥(FVEK)而进行的,初始化配置使用BitLocker时,会给Windows卷分配FVEK。默认情况下,会用一个128位的AES密钥和一个128位的Diffuser密钥对卷进行加密。因为加密和解密过程发生在NTFS I/O系统的下方,所以对NTFS来说,卷好像没有加密过,NTFS甚至根本不知道BitLocker的存在。但是如果在Windows系统的外面访问卷中的数据,则看上去像没有格式化过。
卷主密钥(VMK)对FVEK进行加密,并将其存放在卷的特殊元数据区域。根据系统硬件配置的不同,设置BitLocker时,我们有多个选项用来保护VMK。如果系统具有符合V1.2规范的TPM芯片,并且具有相应的BIOS支持,我们可以用TPM来加密VMK,既可以用TPM芯片里存储的密钥和USB闪盘里的密钥联合对VMK进行加密,也可以用TPM芯片里的密钥和开机时输入的PIN联合对VMK进行加密。如果系统没有TPM芯片,我们还可以用USB闪盘里的密钥对VMK进行加密。无论采用什么加密选项,我们都必须要准备一个至少1.5GB大小的NTFS卷作为引导扇区(不能进行加密),以便存放引导管理器(bootmgr)和引导配置数据库(BCD)。
盆盆评注:由此可见,VMK是所有加密选项的中转站,可以用不同的加密方法对VMK进行加密,这样如果一种加密方法失败(例如TPM芯片损坏),还可以通过另外一种方法(例如恢复模式)重新生成密钥链。
使用TPM的好处是,BitLocker可以借助TPM芯片来确保只有BIOS或者系统启动文件发生变动,系统就不会解密VMK,从而不会解锁Windows卷。第一次加密Windows卷,或者要更新前面提到的组件时,BitLocker会为每个组件自动计算出一个SHA-1散列值,并且在TPM设备驱动程序(%Systemroot%\System32\Drivers\Tpm.sys)的帮助下,把每个散列值(称作度量值,measurement)存放在TPM芯片里相应的PCR寄存器中。然后TPM对VMK进行封装,封装的操作需要用到存放在TPM芯片里的私钥(对VMK进行加密),还有存放在PCR寄存器里的值和BitLocker传递给TPM的其他数据。然后BitLocker会把封装后的VMK,还有加密后的FVEK,保存在加密卷的元数据区域。
盆盆评注:本以为BitLocker会把加密后的VMK和FVEK存放在不加密的引导卷中,而不会存放在加密卷中(否则相当于把钥匙忘在房间里)。但实际上确实保存在加密卷的元数据区域。
当系统启动时,会把自己的散列值和PCR加载代码进行比较,并把该散列值写入到TPM芯片的第一个PCR寄存器中。然后会计算BIOS的散列值(度量值),并将该度量值存放在合适的PCR寄存器中。接下来BIOS会给启动序列中的下一个组件(引导扇区的主引导记录)计算散列值,然后该过程会一直持续,直到操作系统加载程序也已经计算出度量值并进行比较。其后运行的每段代码都需要负责对其加载的代码计算度量值,并负责把度量值存储到TPM芯片里相应的PCR寄存器中。最后,当用户选择引导的操作系统,引导管理器(bootmgr)会从该卷中读取加密的VMK,并请求TPM对其进行解密。只有当所有的度量值都和VMK封装时的结果一样,包括可选的PIN,TPM才能成功解密VMK。
盆盆评注:由于引导卷上的文件,包括bootmgr和bcd都不能被加密,所以TPM芯片可以提供一个比较好的方法,通过计算其散列值来确保这些文件没有被篡改。
我们可以把这种机制想象为信任链,在这个信任链中,启动序列里的每一个组件都要向TPM描述其后的组件。只有全部的描述都和原始的组件相匹配,TPM才能成功进行解密。这样的话,就算把磁盘拆卸下来,放在另外一个系统上,并用另外一个操作系统引导该系统,或者引导卷上的未加密文件已经受到攻击时,BitLocker依然可以对加密数据提供保护。
盆盆评注:BitLocker可以很好地保证系统的启动安全,就算TPM芯片和整个磁盘都被攻击者获取,虽然系统已经释放出VMK,但是由于帐户密码的存在,攻击者还是无法获取加密数据,因为攻击者无法采用常规方法破解帐户密码。