IoT 无线攻击:配对、配网与距离证明的三条边界
设备出现在手机扫描列表中,只说明无线信号可达;设备与手机建立加密连接,也不一定证明操作人是合法主人。无线安全需要分别处理“与谁通信”“允许做什么”和“对方是否确实在附近”。
实操:抓取真实 App 的 BLE 会话并核对 GATT 权限
准备自己的 BLE 产品、官方 App、Android 测试手机,以及带蓝牙适配器的 Linux 工作机。先记录设备型号、固件和 App 版本。选一个能从 App 正常读取或低风险修改的功能;本节不向设备刷入另写的外设程序。
先从正常 App 操作取得协议证据
Android 开发者选项中开启 Bluetooth HCI snoop log,关闭再打开蓝牙,重新连接设备。依次完成扫描、配对、读取状态和一次选定操作,记录时间。然后导出系统报告:
adb devices
adb bugreport bluetooth-report
unzip -l bluetooth-report.zip
在报告包中寻找 btsnoop 文件并用 Wireshark 打开;文件位置与是否包含完整记录依 Android/OEM 而异。没有找到时按 Android 官方蓝牙排障文档核对日志设置与导出方式,不假定所有手机都能直接 adb pull 同一路径。
Wireshark 用 btatt 查看 GATT 访问,用 btsmp 查看配对过程。把服务 UUID、特征句柄、读写方向和 App 操作时间对应起来。HCI 是手机主机侧日志,看到明文不证明空口未加密;捕获不到 SMP 也可能是已绑定后重连。
将一次 App 操作对应到特征和字节
清空无关显示后,只在 App 中做一次选定操作,随后再次读取状态。先用 btatt 找到该时间附近的请求,在包详情中展开 Attribute Protocol,记录 Opcode、Handle 和 Value;再用服务发现记录把 Handle 对应到特征 UUID。句柄属于当前设备的属性表,跨固件或重新发现服务后应重新核对。
Wireshark 可用以下显示过滤器缩小范围,字段含义见官方 ATT 字段参考:
btatt.opcode == 0x12 || btatt.opcode == 0x52
两项分别查找 Write Request 与 Write Command。选中实际报文的 Handle 字段,右键使用 Apply as Filter,而不是手填其他产品的句柄。Write Request 的协议响应说明 GATT 写入的处理结果,Write Command 没有相同的响应流程;业务动作仍通过后续状态回读或实际设备行为核对。
若载荷每次都变,连续做两次同一操作,再做一次不同操作,对比变化发生在哪些字节。先利用实际协议资料或固件调用确认动作、序号、认证标签和校验字段,再判断哪些部分允许改变。不能把所有变化字节都当作随机噪声,也不能仅因重放失败就断言已撤销账号权限。
在未配对的 Linux 客户端读取同一功能
先在独立终端保存本机蓝牙记录:
sudo btmon -w permission-check.btsnoop
另一终端启动 bluetoothctl,在交互提示符中执行:
power on
scan on
从实际广播和设备信息确认自己的样机,记下地址后执行 scan off、connect 实际地址、menu gatt、list-attributes。从输出复制实际特征对象路径,执行 select-attribute 实际对象路径,再执行 read。这些值来自现场枚举,不照搬别的产品 UUID。BlueZ GATT 命令
将这里枚举的 UUID 与 App 记录中的 UUID 对齐。选择真实设备上具有 Read 属性的目标特征,保存成功读取或 ATT 错误;写权限、产品认证和蓝牙配对分别核对。设备同时只支持一条连接时先断开 App,再连接 Linux,避免把连接占用误判为认证拒绝。
只读出型号或公开电量通常不构成缺陷。若无配对、无产品登录态却读出受保护数据,才继续追踪其敏感性与权限要求。connect 成功仅表示链路建立。
对照认证、绑定与重放状态
以未配对客户端、合法已绑定客户端、产品 App 中已撤销的客户端分别执行同一功能。需要写入时,先从合法 App 捕获该功能的真实载荷,确认动作后果,再在对应状态重放;不要使用任意十六进制字节测试未知控制特征。
比较设备回读和实际状态,核对重放是否被挑战、计数器或会话认证拒绝。Linux 删除蓝牙绑定和 App 解除设备所有权不是一回事,两者都要分别测试。Wi-Fi 配网同样先记录实际会话和凭据流向,再检查窗口、持有证明与配置完成后的服务状态。
停止 btmon 后保存日志。连接失败先排除 App 占用单连接、地址变化和系统权限,再判定访问控制。中继验证还需两端转发设备及距离条件,本节的 GATT 读写不能证明抗中继能力。
成立前提与能力变化
攻击条件由无线覆盖、配对方式、功能权限与配网状态共同决定。未配对读取敏感特征、中间人改变会话、中继合法通信和畸形报文攻击协议栈,是不同路径。中继还需要同时接近交互两端或建立转发链路,不能把“人在锁附近”写成充分条件。
配对完成之后仍然需要功能授权
BLE 的广播、连接、配对、绑定和 GATT 访问承担不同职责。配对用于建立安全材料,绑定用于保存相关状态,GATT 特征的读写则取决于具体权限配置。某个敏感特征如果允许未认证读取,即使其他通道要求安全配对,秘密仍可能从弱入口泄露。
不同配对方式提供的抵抗主动中间人能力并不相同。设备是否具备显示、输入或带外确认能力,会影响能够使用的认证方式。Bluetooth SIG 的 Security and Privacy Best Practices Guide R04(2023 年)强调应按具体应用选择安全与隐私机制;它是实现指导,不是另一个替代核心规范的协议。Bluetooth SIG 实现指南
审核应从敏感动作回溯:哪个连接能调用开关、升级和配网功能,是否需要明确认证,旧绑定如何删除,重启或恢复出厂后是否改变这些条件。
Wi-Fi 配网把家庭网络秘密交给了谁
配网阶段通常由 App 把网络凭据交给设备。无论承载使用 SoftAP、BLE 还是其他通道,都需要证明 App 连接的是预期设备,设备也应判断谁有权配置它。公开广播名和可见的设备标识通常不能独立承担这个证明。
ESP-IDF v5.3.4 的 Wi-Fi Provisioning 文档区分传输方式与安全会话,支持通过 SoftAP 或 BLE 接收配置。对产品评估,应继续核对选择的安全方案、持有证明与配网状态管理,而不是看到 BLE 或 Wi-Fi 就推断传输是否安全。ESP-IDF 配网文档
可评估的约束包括短暂配网窗口、每设备独立配网秘密、一次性挑战、对敏感配置的确认,以及配置完成后关闭无用服务。长期复用包装上的静态信息,可能让曾接触设备的人在转售后仍具备重新配网条件。
中继攻击不需要先拿到会话密钥
NCC Group 于 2022 年披露的 BLE 近距离认证中继研究表明,攻击者可以转发合法设备之间的通信,让相隔较远的双方继续完成交互。它针对的是“链路可建立就代表在附近”的假设,而不要求先解密每条消息。NCC Group 原始技术公告
因此,链路加密、正常配对和信号强度阈值不能自动替代安全距离证明。对于门锁或车辆等依赖距离的动作,需要评估支持的测距机制、抗中继能力与用户确认;无法满足距离假设时,可以降低被动自动执行的权限。
这里的控制选择有体验代价:增加按键确认会降低无感使用便利;更换测距硬件会影响成本与兼容性。应根据动作后果判断,而不是把所有无线功能都设置成同一种确认方式。
新鲜挑战不能独立证明物理距离
设想门锁生成随机挑战,手机签名后返回。这个过程可以防止攻击者拿旧响应直接重放,但如果攻击者能够实时把挑战转给远处的合法手机,再把响应转回门锁,消息仍然新鲜,签名也仍然正确。
因此,重放防护与抗中继要分别验证。前者主要检查响应是否对应本次会话;后者还需要建立可信的距离或用户在场条件。普通应用层往返时间包含调度、协议栈与网络抖动,简单缩短超时可能先损害合法用户体验,而不构成可靠距离证明。
同理,RSSI 会受到发射功率、天线、反射与环境影响。它可以参与产品的使用判断,但如果把它作为高风险动作的核心授权证据,就需要说明对主动攻击者的假设与补充机制。
配网产品还应定义并发行为:两个客户端同时尝试配置时,谁拥有本次事务,失败后秘密是否清除,重新打开窗口是否复用旧会话。只验证一次正常手机成功配网,很容易漏掉这些状态分支。
无线协议实现漏洞是另一条路径
配对设计正确也不能保证协议栈没有缺陷。SweynTooth 在 2020 年披露的不同 BLE SDK 问题包含崩溃、死锁与特定安全绕过,触发条件与影响依具体实现而异。SweynTooth 披露
这意味着产品要同时验证协议设计与接收实现。对蓝牙、Zigbee 和其他射频系统,调试时应记录协议版本、芯片、SDK、固件及无线访问条件;不能把一种协议的一项缺陷直接外推给所有采用该协议的设备。
把无线现象对应到可以验证的能力
假设某设备把设置网络、读取敏感状态和触发升级放在不同 GATT 特征或配网接口中,应按操作逐项检查,而不是只记录“连接成功”:
| 测试主体与状态 | 观察结果 | 能支持的结论 |
|---|---|---|
| 未配对客户端 | 可以读取敏感特征 | 该特征缺少必要访问约束 |
| 已加密但未满足产品认证要求 | 可以触发高权限配置 | 功能权限没有绑定到所需认证 |
| 已撤销绑定的客户端 | 重连后仍可控制 | 撤销未影响当前控制路径 |
| 两端合法、经实时中继通信 | 距离限制动作仍成功 | 当前距离或在场假设可以被绕过 |
如果产品把配网按钮作为持有证明,还需要明确按钮打开的是一个时间窗口,还是绑定到单次会话的授权。窗口内两个客户端竞争、失败后重新打开窗口和设备重启,可能走出与正常手机操作不同的路径。测试结论应记录这些状态,不能仅附一张蓝牙扫描截图。
验证从未配对和失去绑定之后开始
使用隔离无线环境,分别以未知客户端、已配对用户、被撤销用户和新主人身份检查敏感功能。覆盖配网超时、配网中断、重复绑定、恢复出厂和离线重连。
若产品把距离作为授权条件,应单独设计中继与延迟变化验证,测量合法动作是否仍会被错误接受。测试结论只适用于实际硬件和协议配置;单次通信失败,不能证明系统具备抗中继能力。
关联阅读:设备绑定与所有权转移、资源耗尽与恢复设计。