Windows/BitLocker

Windows/BitLocker

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 提供保护。

配置 (组策略)

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 可以使用字母和符号。

启动流程

参考资料

  1. bios 初始化,cpu 对 bios /固件 进行验证,保证固件是可信的。但有些平台未正确配置验证,带来了风险。
  2. 固件初始化 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 。
  3. 若上面的步骤都正常,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

// 移除 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}

// 配置使用密码保护密钥
manage-bde -protectors C: -add -Password

// 恢复 Bitlocker 保护状态
manage-bde -resume C:

// 可选:重新创建 Recovery Password 并保存。
manage-bde -protectors C: -add  -RecoveryPassword

Last update: 2022-11-28 08:01:35 UTC