蓝牙安全全解析——从 SSP 到 LE Secure Connections
TL;DR:蓝牙安全经历了 Legacy PIN → SSP(BT 2.1)→ Secure Connections(BT 4.1)→ LE Secure Connections(BT 4.2)四次大升级。本文系统梳理经典蓝牙与 BLE 的安全机制:密钥体系、配对流程、关联模型、加密算法、常见攻击(KNOB、BLURtooth、BIAS)及防护建议。适合嵌入式安全、蓝牙开发、IoT 安全从业者阅读。
一、蓝牙安全的演进路线
二、经典蓝牙安全体系
2.1 密钥层级
| 密钥 | 作用 | 长度 | 生命周期 |
|---|---|---|---|
| Link Key(LK) | 配对产物,用于认证和派生加密密钥 | 128 bit | 半永久 |
| Encryption Key(Kc) | 每次加密会话派生 | 8~128 bit | 每次连接 |
| Combination Key | 由双方地址和 PIN 派生 | 128 bit | 半永久 |
2.2 安全模式
| 模式 | 描述 | 状态 |
|---|---|---|
| Mode 1 | 不安全 | 已废弃 |
| Mode 2 | 服务级安全 | 旧版 |
| Mode 3 | 链路级安全 | 旧版 |
| Mode 4 | SSP 强制 | 当前主流 |
三、Legacy PIN 配对(已废弃)
3.1 流程
双方输入相同 PIN
│
├─→ E22 算法 → Initialization Key(Kinit)
├─→ Kinit + BD_ADDR → Link Key
└─→ 存储 LK,后续认证使用
3.2 致命缺陷
- PIN 长度短(常见 4 位数字)
- E22 可被离线暴力破解
- 无 MITM 保护
- 已被 SSP 完全替代
四、SSP:Secure Simple Pairing(BT 2.1+)
4.1 核心改进
引入 ECDH 密钥交换,取代固定 PIN:
4.2 四阶段流程
- 公钥交换:双方交换 ECDH 公钥,计算共享 DHKey
- 认证阶段 1:根据 IO 能力选择关联模型
- 认证阶段 2:用 DHKey 确认,防止 MITM
- 生成链路密钥:派生 Link Key,启动加密
4.3 四种关联模型
| 模型 | 适用场景 | MITM 保护 | 典型设备 |
|---|---|---|---|
| Numeric Comparison | 双屏双输入 | ✅ | 手机 ↔ PC |
| Passkey Entry | 一屏一输入 | ✅ | 手机 ↔ 手环 |
| Just Works | 无屏无输入 | ❌ | TWS 耳机 |
| Out of Band | NFC/二维码 | ✅ | 车机/NFC 配件 |
MITM 警告:Just Works 不防中间人攻击,无屏设备是蓝牙安全的天然短板。
4.4 经典 SSP vs Secure Connections
| 特性 | SSP(BT 2.1~4.0) | Secure Connections(BT 4.1+) |
|---|---|---|
| 椭圆曲线 | P-192 | P-256 |
| 哈希 | SHA-256 | SHA-256 |
| 密钥派生 | 简化 | F5/F6 HMAC-SHA-256 |
| 强度 | 80 位左右 | 128 位 |
五、认证与加密
5.1 认证流程
5.2 加密算法
| 算法 | 引入版本 | 状态 |
|---|---|---|
| E0 流密码 | 1.x | 已不推荐 |
| AES-CCM | 4.1+ Secure Connections | 当前推荐 |
E0 弱点:密钥流可被相关攻击,建议 Kc 有效长度 ≥ 7 字节。
AES-CCM 优势:AES-128 计数器模式 + CBC-MAC,同时提供加密和完整性。
六、BLE 安全机制
6.1 BLE 配对模式
| 模式 | 版本 | 特点 |
|---|---|---|
| LE Legacy Pairing | 4.0/4.1 | 类似经典 Legacy,TK 短,强度弱 |
| LE Secure Connections | 4.2+ | 基于 ECDH P-256,与经典 Secure Connections 对齐 |
6.2 BLE 密钥层级
| 密钥 | 作用 |
|---|---|
| LTK | 长期密钥,半永久存储 |
| EDIV | 加密 diversifier,用于识别 LTK |
| Rand | 随机值,与 EDIV 一起派生会话密钥 |
| SK | 会话密钥,每次连接派生 |
| IV | 初始化向量 |
6.3 LE Secure Connections 关联模型
| 模型 | 说明 |
|---|---|
| Numeric Comparison | 双屏设备比对 6 位数字 |
| Passkey Entry | 一端显示,一端输入 |
| Just Works | 无 MITM 保护 |
| OOB | NFC 等外通道 |
七、CTKD:BR/EDR 与 BLE 共享 Link Key
双模设备如果 BR/EDR 和 BLE 各自独立配对,用户就要配对两次。蓝牙 4.2 引入的 CTKD(Cross-Transport Key Derivation,跨传输密钥派生) 允许在一侧完成 Secure Connections 配对后,派生出另一侧的密钥,实现“配对一次,双模共用”。
7.1 为什么需要 CTKD?
| 场景 | 无 CTKD | 有 CTKD |
|---|---|---|
| 手机连双模耳机 | 先 BR/EDR 配对,再 BLE 配对 | 配对一次,自动共用 |
| 用户体验 | 繁琐,易失败 | 一次确认,双模生效 |
| 密钥管理 | 两个独立数据库 | 统一派生,一致性强 |
7.2 CTKD 的两种方向
| 方向 | 流程 |
|---|---|
| BR/EDR → LE | BR/EDR Secure Connections 配对 → 得到 Link Key → 派生 LE LTK / CSRK |
| LE → BR/EDR | LE Secure Connections 配对 → 得到 LTK → 派生 BR/EDR Link Key |
CTKD 只在 Secure Connections / LE Secure Connections 下可用,Legacy Pairing 不支持。
7.3 派生算法:h6
蓝牙规范使用 AES-CMAC 进行密钥派生:
h6(W, keyID) = AES-CMAC(W, keyID)
- W:输入密钥(Link Key 或 ILK)
- keyID:固定字符串标识符
从 BR/EDR Link Key 派生 LE 密钥
ILK = h6(LinkKey, "1btd1") // Intermediate Link Key
LTK = h6(ILK, "2le1")
CSRK = h6(ILK, "2le2")
从 LE LTK 派生 BR/EDR Link Key
ILK = h6(LTK, "1le1")
LinkKey = h6(ILK, "2btd1")
实际 keyID 字符串以蓝牙规范最新版为准,不同版本可能存在差异。核心思想是:用不同 keyID 做域分离。
7.4 完整流程示例(BR/EDR → LE)
7.5 CTKD 与 HKDF 的关系
| 维度 | CTKD h6 | HKDF |
|---|---|---|
| 原语 | AES-CMAC | HMAC |
| 输入长度 | 固定 128 bit | 任意 |
| 输出长度 | 128 bit | 任意 |
| 用途 | 蓝牙跨传输短密钥派生 | 通用密钥派生 |
| 多轮扩展 | 需手动链式调用 | Expand 阶段内置链式反馈 |
经典 SSP 的 F5/F6 基于 HKDF-SHA256,而 CTKD 的 h6 基于 AES-CMAC,两者不要混淆。
7.6 工程落地要点
- 只在 Secure Connections 下启用:Legacy Pairing 不支持 CTKD。
- keyID 必须严格匹配规范:错一个字符,派生结果完全不同。
- ILK 不要直接当密钥用:ILK 只是中间密钥,需再派生一次。
- 双模地址要关联:BR/EDR BD_ADDR 与 LE Public Address 通常应一致。
- 注意 BLURtooth 风险:CTKD 的便利也被 CVE-2020-15802 利用,见下节。
八、常见攻击与防护
8.1 攻击面总览
| 攻击 | 描述 | 影响 | 缓解 |
|---|---|---|---|
| KNOB Attack | 强制 Kc 有效长度=1 字节 | 加密可被秒破 | 升级栈到最小 7 字节 |
| BLURtooth | 跨模态密钥混淆(CTKD 滥用) | 链路密钥被覆盖 | 升级到 BT 5.1+,可禁用 CTKD |
| BIAS | 配对绕过,旧 LK 重用 | 冒充已知设备 | 强制重新认证 |
| BlueBorne | LMP 协议栈 RCE | 无需配对远程执行 | 补丁升级 |
| PIN 爆破 | Legacy PIN 暴力破解 | 老设备被破解 | 弃用 Legacy |
8.2 KNOB Attack 详解(2019)
原理:
- 攻击者在 LMP 加密密钥大小协商时注入
Max Key Size = 1 - 双方接受后,Kc 实际只有 8 bit 强度
- 抓包离线爆破分钟级破解
防护:
- 升级到支持最小 7 字节的蓝牙栈
- Core Spec 5.0+ 已修正该漏洞
8.3 BLURtooth(2020)
原理:BLURtooth 本质是 CTKD 的方向滥用。攻击者诱使目标设备在一侧(如 LE)与自己完成配对,然后利用 CTKD 在另一侧(如 BR/EDR)派生新的 Link Key,覆盖原有链路密钥,从而夺取 BR/EDR 连接的控制权。
防护:
- 升级到 BT 5.1+:引入 CTKD 权限控制,设备可拒绝跨传输覆盖
- 禁用 CTKD:若业务不需要双模共用密钥,可在栈配置中关闭
- 跨传输派生前要求用户明确确认
- 避免无 MITM 保护的配对模式作为 CTKD 入口
8.4 BIAS(2020)
原理:利用蓝牙认证过程中“单向认证”的弱点,冒充已配对设备。
防护:
- 强制双向认证
- 禁用旧 Link Key,定期重配对
- 升级到支持 Secure Connections 的栈
九、安全配置最佳实践
9.1 通用设备
- 强制 SSP + Secure Connections
- 禁用 Just Works(除无屏设备外)
- Kc 最小长度强制 ≥ 7 字节,敏感场景 ≥ 16 字节
9.2 无屏外设(TWS 耳机等)
- 使用 Just Works + Secure Connections
- 出厂预置 Link Key 或 OOB 备选
- 限制可发现时间,减少攻击窗口
9.3 车机/手机
- Numeric Comparison + 用户二次确认
- 定期清理旧配对
- 禁止 Legacy Pairing
9.4 工业/医疗设备
- OOB(NFC/二维码)+ AES-CCM
- 安全启动 + 密钥安全存储
- 定期密钥轮换
十、调试与观察
10.1 查看配对密钥(Linux)
# 查看本地保存的配对密钥
sudo cat /var/lib/bluetooth/<本地BD_ADDR>/<对端BD_ADDR>/info
# 查看加密状态
hcitool enc <handle>
10.2 抓包分析
# Wireshark 过滤 LMP 认证
btlmp.opcode == 0x0017 # LMP_au_rand
# 过滤 HCI 配对事件
bthci_evt.code == 0x33 # User Confirmation Request
10.3 关键检查项
- 是否启用 Secure Connections?
- 加密密钥长度是否 ≥ 7 字节?
- 是否支持 Legacy Pairing fallback?
- 无屏设备是否使用 Just Works?
- 配对数据库是否有防篡改/校验?
十一、总结
- 蓝牙安全四代演进:Legacy PIN → SSP → Secure Connections → LE Secure Connections。
- SSP 是分水岭:引入 ECDH,取代固定 PIN,但 Just Works 不防 MITM。
- Secure Connections 是底线:P-256 + AES-CCM,所有新设备都应启用。
- BLE 安全独立发展:LE Secure Connections(BT 4.2+)与经典对齐。
- CTKD 是双模便利与风险的结合:配对一次双模共用,但也被 BLURtooth 利用,BT 5.1+ 可通过权限控制缓解。
- 近年攻击都在利用旧模式或弱配置:KNOB/BLURtooth/BIAS 都针对 Legacy、短密钥或缺乏双向认证的场景。
- 配置建议:强制 Secure Connections、限制 Just Works、谨慎启用 CTKD、定期重配对、安全存储密钥。
更多推荐


所有评论(0)