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协议栈的分层和关键接口画清楚了。你保存下来,以后排查问题对着看。
怎么看这张图:从上往下是数据流向。应用层数据经过GATT/ATT封装,再经过L2CAP分段,通过HCI传给控制器。控制器里的链路层负责重传和加密,物理层负责发出去。反过来,接收路径也一样。
3.5 安全视角:每层的攻击面
搞清楚了分层,我们就能针对每一层做安全防护。我列个表,你对照着看:
| 层级 | 常见攻击 | 防护建议 |
|---|---|---|
| Application | 数据伪造、重放攻击 | 应用层加密+时间戳校验 |
| GATT/ATT | 未授权访问、Notification欺骗 | 设置权限属性、服务端验证 |
| L2CAP | 数据包篡改、DoS | MTU限制、完整性校验 |
| HCI | 命令注入、固件篡改 | HCI加密通道、固件签名 |
| Link Layer | 嗅探、中间人攻击 | BLE配对绑定、加密连接 |
| PHY/RF | 信号干扰、嗅探 | 跳频、发射功率控制 |
我个人习惯,做网关安全设计时,至少要在三层做防护:应用层做数据校验,GATT层做访问控制,链路层开加密。三层都防住了,攻击者基本没机会。
好了,这一章的内容就到这。协议栈是基础,后面讲具体攻击和防护的时候,我们会反复回到这张分层图上。