BitLocker 是 Windows 自带的全盘加密方案,可以完整加密整个硬盘分区。BitLocker 默认使用 AES-128 加密(组策略可以配置为使用 AES-192 或 AES-256)。对于现代 CPU (支持 AES-NI 指令集) 和 SSD 固态硬盘,启用 BitLocker 带来的性能损失可以忽略不计(例外:某些 SandForce 等主控的 SSD 自带写入数据压缩功能,加密会导致数据无法被压缩,对于这种情况性能会有大幅度下降)。对于 HDD 机械硬盘,启用 BitLocker 后对写入性能有较大影响(一些测试显示启用 BitLocker 后 HDD写入性能下降了一半以上),但对读取性能影响不大(<5%)。
相对于其它全盘加密方案(例如 VeraCrypt),BitLocker 最大的缺点是不提供 Plausible deniability。
概述
概念
- 主密钥(Full Volume Encryption Key, FVEK):Bitlocker 最终用于加/解密硬盘分区的 AES 密钥。密钥本身通过 Protector 加密后的密文保存在硬盘物理扇区里。
- Protector : 用于加密密钥。一个 Bitlocker 加密的硬盘分区可以存在多种类型的不同 Protector(通过每种 Protector 加密后的密钥密文都会保存在硬盘扇区里)。每个 Protector 都可以单独解密密钥。
BitLocker 支持的 Protector 类型:
- Recovery Password (Numerical Password) (-RecoveryPassword) : BitLocker 生成的 48 位的随机数字密码。Windows 里通过 GUI 创建 BitLocker 加密卷时会强制要求生成。可以之后通过 CLI 删除。就信息熵而言 48位数字 ≈ 160 bits (Math.log(10)/Math.log(2) * 48),超过了 AES-128 的密钥长度,所以这个48位数字的“密码强度”是非常高的。但仍然低于 AES-192 / AES-256。如果为了提高安全性而配置了组策略使 BitLocker 使用 AES-192 或 AES-256,必须删除 Recovery Password 这种 protector,否则 192 / 256位的密钥长度就毫无意义。
- TPM (-tpm) : BitLocker 默认使用的 Protector。使用TPM在启动时自动解锁硬盘。如果 TPM 发现/认为当前启动环境异常或不安全,会拒绝解锁硬盘。
- TPM + pin (-TPMAndPIN)
- Password (-Password) (默认不支持,需要在 gpedit.msc 里启用)
- External Key : 通过一个 *.BEK KEY 文件加密。在 Windows BitLocker 的管理界面里对非系统盘 Turn on auto-unlock 时会自动创建对应分区的 External Key protector 并将内容保存到注册表
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FVEAutoUnlock
路径下。
如果使用了 pin 或 password,机器启动时必须通过本地键盘输入密码(TPM + pin 模式下可以开启远程解锁通过网络提供 PIN,但实际的配置和使用方式非常麻烦)。
对于 TPM + pin 这种 Protector 模式,实际使用的 key 仍然只存放在 TPM 里(PIN does not become part of the key),只是通过 TPM 提供的验证机制要求用户开机时输入 PIN 而已。本质上 TPM 和 TPM + pin 模式的安全性没有任何差别。如果攻击者控制了 TPM,仍然可以无需 PIN 即解密硬盘。
强烈建议不要使用 TPM (或 TPM+pin)作为 Protector。TPM 可以被轻易攻击:
- 中国大陆等地区销售的 PC 的 TPM 很可能存在后门,允许政府机构直接解密密钥。
- TPM 通过 LPC 总线与主板连接并明文交互数据,攻击者可以在主板上焊接特制的 fPGA 芯片轻易从 LPC 总线上提取出 TPM 里存储的密钥。
- TPM 保护的 BitLocker 极易受冷启动攻击(Memory (DRAM) remanence) 攻击!即使 PC 出于完全关机状态下也会受到此类攻击(TPM + pin 方式可以阻止完全关机状态下的此类攻击)。
- TPM 保护的 BitLocker 同样极易受 DMA 攻击。如果设备上有 PCI-E / m2 插槽或雷电 / USB 4.0 等接口,攻击者可以轻松使用特制的硬件或软件(例如:pcileech)直接 dump 出整个系统内存并从中提取出硬盘密钥。参考这个资料。
总之,如果你的安全威胁模型里包含任何专业的对手而非仅仅是脚本小子,你都绝对不应该依赖 TPM 提供保护。
配置 (组策略)
gpedit.msc
Local Computer Policy > Computer Configuration > Administrative Templates > Windows Components > BitLocker Drive Encryption > Operating System Drives :
- Require additional authentication at startup: 可以选中 Allow Bitlocker without a compatible TPM (requires a password or a startup key on a USB flash drive)
- Allow enhanced PINs for startup : 允许 pin 可以使用字母和符号。
启动流程
- bios 初始化,cpu 对 bios /固件 进行验证,保证固件是可信的。但有些平台未正确配置验证,带来了风险。
- 固件初始化 TPM 。TPM 挂在 LPC 总线上,是可以被监听通信并窃取加密 key 的,成本也不高,用 FPGA 搞的。
TPM 本身也会对主板 /固件进行一些验证,发生变化了则得不到解密的 key 。所以换主板基本不行的,倒是 tpm 可能有后门。
固件读取硬盘的未加密分区上的 bootmgr/bootmgfw.efi 并执行,理论上你可以替代 Windows bootmgr 为恶意软件,但是:- TPM 可能检测到这一变化,拒绝放出 key,出现 bitlocker 恢复,要求提供 48 位 recovery pw 。不专业的用户可能会输入,然后密码被偷。
- 在启用了 UEFI Secure Boot 的平台上,若恶意 bootloader 未签名,固件会拒绝启动,并提出警告通知用户系统可能被攻击。
- 若攻击者有办法签名:如果利用 grub2 等工具的漏洞执行恶意代码,但也拿不到 tpm 的 key,因为 linux 的 grub 和微软 bootmgr 用的 UEFI SB 证书链不一样,导致 pcr7 变化,tpm 不会放出 key. 除非能搞到微软的 CA 私钥来攻击你。。。
- 一些平台使用 UEFI SB + TPM2 + PCR7 时有严重漏洞,用一些手段能让 tpm 错误地给出 key 。
- 若上面的步骤都正常,bootmgr 解密 c 盘,并启动 Windows 内核,后续就没 tpm 啥事了。
启动后 C 盘确实解锁了,但 key 在内存里,要小心的攻击:液氮冰冻内存,然后读取内存数据很到密钥。所以要小心机器睡眠(sleep) (不要和休眠(hibernate)混淆,后者内存会断电)。以及雷电接口 /1394/pci-e 设备 dma 偷数据,此处 @AppleBootCamp /doge/
所以至少两个分区:
- system/ efi system:未加密,内有 Windows bootmgr 引导代码,这些代码就 uefi sb/tpm 验证。
- Windows 的 C 盘:加密分区
Bitlocker 的技术名词
- 解密:把数据变成未加密存回硬盘。
- 解锁:打开加密的卷,密钥存储在内存中,重启就会丢失。数据加解密在内存中进行,没有明文内容写在硬盘中。
- 暂停保护:把钥匙(以明文形式)直接写在硬盘里。有极少数情况需要暂停保护,比如更新 bios 等操作时肯定会触发 pcr 改变的情况,数据加解密于内存中进行,写入硬盘的数据仍然是加密形式的。
对普通人来说,能做到最好的情况就是:
tpm + pin + usb key 三重验证,次一点就是 tpm + 启动 pin 验证(不是登陆界面那个 pin) ,最差也就 tpm 了。
管理 Bitlocker
控制面板(control) - Bitlocker 界面功能不全,建议使用 CLI 工具 manage-bde 管理 Bitlocker。
查看加密硬盘信息
manage-bde -protectors D: -get
输出结果:
BitLocker Drive Encryption: Configuration Tool version 10.0.19041
Copyright (C) 2013 Microsoft Corporation. All rights reserved.
Volume D: [Data]
All Key Protectors
Password:
ID: {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}
External Key:
ID: {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}
External Key File Name:
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF.BEK
Numerical Password:
ID: {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}
Password:
123456-123456-123456-123456-123456-123456-123456-123456
External Key:
ID: {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}
External Key File Name:
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF.BEK
Automatic unlock enabled.
其中显示的 "Numerical Password" 的 ID 就是对应硬盘分区的 disk identifier。其 Password 就是可以用于解密该分区的 Recovery Key。
更换 Protector
TPM => password
注意 Windows 默认不允许对系统盘使用 password 这种 protector,需要通过 gpedit.msc 开启:
Computer Configuration → Administrative Templates → Windows Components → BitLocker Drive Encryption → Operating System Drives:
Configure use of passwords for operating system drives: 设为 enabled
// 查看当前的所有 protectors
manage-bde -protectors C: -get
// 移除 C 盘(系统盘)现有的所有 Protectors (包括 Recovery Password !)。注意会同时将 C 盘 bitlocker 状态变为 Protection Suspended。
manage-bde -protectors C: -delete
// 或者只删除 TPM 的 protector
manage-bde -protectors C: -delete -id {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}
// 配置使用密码保护密钥。
// 必须先删除 TPM 的 protector 才能添加 password。
manage-bde -protectors C: -add -Password
// 恢复 Bitlocker 保护状态
manage-bde -resume C:
// 可选:重新创建 Recovery Password 并保存。
manage-bde -protectors C: -add -RecoveryPassword