3. 蓝牙协议栈基础:BLE协议栈分层架构

做蓝牙网关安全,第一件事就是搞懂协议栈长什么样。我见过不少团队,上来就调API,出了问题抓瞎——根本不知道数据在哪一层丢的。

BLE协议栈,说白了就是一套分层规范。每一层只管自己的事,层与层之间通过标准接口通信。这种设计的好处是:你替换底层硬件,上层代码不用动。

3.1 三层架构:Controller、Host、Application

BLE协议栈分三层,从下往上分别是:

  • Controller(控制器)—— 负责物理收发
  • Host(主机)—— 负责协议逻辑
  • Application(应用)—— 负责业务功能

Controller和Host之间有一条标准分界线,叫HCI(Host Controller Interface)。这条线很重要——很多安全攻击就卡在这里。

关键认知:Controller通常跑在蓝牙芯片上,Host可以跑在主CPU上。网关产品里,Controller是硬件模块,Host是软件协议栈,Application是你的业务代码。

我做过一个项目,客户抱怨网关经常断连。查了三天,最后发现是Controller的固件版本太老,跟Host的协议栈不兼容。嗯,这种坑,踩过一次就记住了。

3.2 GAP与GATT:两个核心角色

BLE里有两个最基础的角色模型,你绕不开。

3.2.1 GAP(Generic Access Profile)

GAP管的是“设备怎么被发现、怎么建立连接”。它定义了四种角色:

角色 说明 典型设备
Broadcaster 只发广播,不连接 信标、温度传感器
Observer 只扫描广播,不连接 扫描仪、网关监听端
Peripheral 可被连接,通常发广播 手环、智能锁
Central 主动扫描并发起连接 手机、网关主控

网关通常是Central角色。但注意,一个设备可以同时扮演多个角色——比如网关一边连传感器(Central),一边广播自己的状态(Broadcaster)。

我的经验:做网关安全时,GAP层的广播包是最容易被嗅探的。我曾经在客户现场抓包,发现某个智能锁的广播包里直接包含了设备序列号——明文。这种信息泄露,攻击者拿来就能伪造设备。

3.2.2 GATT(Generic Attribute Profile)

GATT管的是“连接之后怎么交换数据”。它定义了两种角色:

  • GATT Server —— 提供数据的一方(比如传感器)
  • GATT Client —— 读取/写入数据的一方(比如网关)

一个设备可以同时是Server和Client。举个例子:网关从温度传感器读数据(Client),同时把自己的配置信息暴露给手机App(Server)。

GATT的数据模型是树状的:

Profile(服务集合)
 └── Service(服务,如电池服务)
      └── Characteristic(特征,如电量百分比)
           ├── Value(数据值)
           ├── Properties(读/写/通知等权限)
           └── Descriptors(描述符,如配置通知开关)

我建议你在设计网关时,把敏感数据放在需要认证才能访问的Characteristic里。别图省事全设成公开可读——我见过太多产品这么干,结果被第三方App随便读走了设备密钥。

3.3 Attribute Protocol(ATT)

ATT是GATT的底层传输协议。说白了,GATT定义“数据长什么样”,ATT定义“数据怎么传”。

ATT有6种操作类型:

  • Request/Response —— 客户端发请求,服务器必须回复
  • Command —— 客户端发命令,服务器不需要回复
  • Notification —— 服务器主动通知客户端,客户端不需要确认
  • Indication/Confirmation —— 服务器主动通知,客户端必须确认

这里有个安全细节:Command和Notification不需要确认,所以攻击者可以伪造这些包,让网关收到假数据。我在做渗透测试时,就利用这个漏洞给网关发了伪造的Notification,导致网关误判设备状态。

避坑指南:千万不要完全信任ATT层的Notification数据。网关应用层必须做数据校验——比如加时间戳、序列号、或者简单的CRC。我曾经遇到一个客户,网关收到Notification就直接更新状态,结果被攻击者刷了一堆假数据,整个系统乱套。

3.4 协议栈分层架构总览

下面这张图是我自己整理的,把BLE协议栈的分层和关键接口画清楚了。你保存下来,以后排查问题对着看。

BLE协议栈分层架构 Application Layer(应用层) 业务逻辑 · 用户数据 · 安全策略 Host Layer(主机层) GAP 发现 · 连接 · 安全 GATT 数据模型 · 服务 · 特征 ATT 属性协议 · 读写通知 L2CAP 数据封装 · 多路复用 HCI(Host Controller Interface) Controller Layer(控制器层) LL(链路层) 状态机 · 重传 PHY(物理层) 射频 · 调制解调 RF(射频) 天线 · 信号

怎么看这张图:从上往下是数据流向。应用层数据经过GATT/ATT封装,再经过L2CAP分段,通过HCI传给控制器。控制器里的链路层负责重传和加密,物理层负责发出去。反过来,接收路径也一样。

3.5 安全视角:每层的攻击面

搞清楚了分层,我们就能针对每一层做安全防护。我列个表,你对照着看:

层级 常见攻击 防护建议
Application 数据伪造、重放攻击 应用层加密+时间戳校验
GATT/ATT 未授权访问、Notification欺骗 设置权限属性、服务端验证
L2CAP 数据包篡改、DoS MTU限制、完整性校验
HCI 命令注入、固件篡改 HCI加密通道、固件签名
Link Layer 嗅探、中间人攻击 BLE配对绑定、加密连接
PHY/RF 信号干扰、嗅探 跳频、发射功率控制

我个人习惯,做网关安全设计时,至少要在三层做防护:应用层做数据校验,GATT层做访问控制,链路层开加密。三层都防住了,攻击者基本没机会。

好了,这一章的内容就到这。协议栈是基础,后面讲具体攻击和防护的时候,我们会反复回到这张分层图上。