用于Linux/BlueZ上蓝牙低功耗安全测试的单一Go二进制文件:扫描、枚举GATT、读/写/通知、模糊测试特征,并通过JSON输出运行结构化评估。
一个 Go 二进制文件,涵盖 Linux/BlueZ 上完整的蓝牙低功耗评估工作流:扫描、枚举、读/写/通知、模糊测试和结构化安全评估,并为脚本和智能体提供 JSON 输出。
Caeruleus 将蓝牙低功耗(BLE)安全测试整合为一个基于 Linux BlueZ 栈构建的单一 Go 二进制文件。它通过 BlueZ D-Bus 和原始 L2CAP/HCI 套接字与外围设备通信,覆盖整个生命周期:发现设备、浏览并读/写 GATT 树、捕获通知、对可写特征进行模糊测试,以及运行可重复的安全评估工作流。每条命令都会输出结构化的 -o json / -o jsonl 输出,供脚本、报告和 LLM 智能体使用。
Caeruleus 由进攻性安全工程师构建,旨在取代通常那一堆 bettercap、gatttool、hcitool、bluetoothctl 和一次性 Bleak 脚本,并将抽象保持在人类或智能体实际工作的层级。
caeruleus:拉丁语,意为蓝牙低功耗中的“蓝色”
BLE 安全测试的标准工作流就像是在一堆从未设计为协同工作的工具之间寻宝:
hcitool / hciconfig 用于适配器配置和发现,两者均已被 BlueZ 弃用,且在许多现代发行版中缺失。bettercap 用于 ble.recon 和 ble.enum。功能强大,但仅仅为了浏览 GATT 树就要安装一个完整的网络攻击框架。gatttool 用于读写句柄,已弃用多年,但仍出现在每个教程中。每种工具都说着自己的方言,且没有一个能输出可管道传递到下一步的机器可读输出,因此你成了集成层,手动在终端之间复制 MAC 地址和句柄。BlueZ 自身支持的前端(bluetoothctl、btmgmt)是通用管理工具,其抽象层级并不适合评估工作。
Caeruleus 用一套一致命令界面取代了整堆工具:
| 使用场景 | 以往方法 | 使用 Caeruleus |
|---|---|---|
| 发现附近设备 | hcitool lescan / bettercap ble.recon / bluetoothctl scan on | caeruleus scan |
| 列出并读取服务/特征 | bettercap ble.enum <mac> | caeruleus enumerate -b <mac> --values |
| 交互式会话 | gatttool -I / bluetoothctl | caeruleus shell -b <mac> |
| 读取句柄 | gatttool --char-read-hnd 0x0013 | caeruleus read -b <mac> -a 0x0013 |
| 写入句柄 | gatttool -b <mac> --char-write-req -a 0x002c -n $(...) | caeruleus write -b <mac> -a 0x002c --req -s "value" |
| 捕获通知 | 自定义 Bleak 记录器 | caeruleus listen -b <mac> -a <handle> |
| 审计未认证暴露 | 自定义 Bleak 审计脚本 | caeruleus recon / caeruleus assess ... |
| 对特征进行模糊测试 | 自定义模糊测试器 / boofuzz | caeruleus fuzz write -b <mac> -a <handle> |
| 连接参数、MTU | hcitool con / btmgmt con-info | caeruleus conn-params -b <mac> |
| 适配器电源与恢复 | btmgmt power / hciconfig reset / rfkill | caeruleus doctor / caeruleus adapter power cycle |
处处结构化输出。 每条产生输出的命令都支持 -o text|json|jsonl。JSON 是规范表示,而非次要导出;jsonl 为 scan --live 和 listen 每个事件流式输出一条记录。enumerate --compact 为每个特征输出一行 key=value,便于 grep 或 LLM 上下文窗口使用。
BLE 栈健康检查。 caeruleus doctor 遍历 BlueZ 和内核状态,并打印 OK/WARN/FAIL 检查清单:bluetoothd 正在运行、适配器已通电、无泄漏的发现会话、BlueZ 缓存地址与 MGMT 芯片实时地址对比、一次实时 2 秒扫描探测,以及处于安全区间的 ExchangeMTU。每个非 OK 的发现都附带具体的修复命令,退出码遵循 grep/diff 约定(0 表示正常,2 表示失败)。
干净拆除。 在收到 SIGTERM/SIGHUP 时,工具会运行断开连接路径并轮询,直到 Connected=false 通过 BlueZ 传播,因此外围设备会立即重新广播,而不是卡在其监督超时上。崩溃后不再有“幽灵连接”。
脚本与自动化。 serve/send 通过 Unix 套接字保持一条 GATT 链路打开,使脚本或智能体避免每条命令约 1.5 秒的重连开销;batch 通过单条持久连接从 stdin 运行命令;listen --trigger-value 设置通知、触发写入并原子地捕获响应。
便利细节。 根据 GAP Appearance 加上广播服务推断设备类型(手表显示为“Smartwatch”,而不是原始外观代码);宽容的输入解析(句柄可为 0x002a、0X2A 或 42;十六进制可为 deadbeef、de:ad:be:ef 或 0xdeadbeef);caeruleus recipes 列出并关键词搜索 19 个常见工作流;conn-params 显示 gatttool 和 bettercap 都不暴露的协商间隔、延迟和监督超时。
Caeruleus 将 LLM 智能体视为一等用户。-o json / -o jsonl 提供令牌高效的结构化输出,智能体无需抓取人类格式的表格即可解析,且仓库附带一个可移植的 Agent Skill(skills/caeruleus/SKILL.md),向任何兼容 Agent Skills 的助手教授命令界面和推荐的评估方法。将智能体指向一个设备,它就能端到端地运行整个方法。
在我们的基准测试中,使用 Caeruleus 及其技能的 Opus 4.8(xHigh)完成任务所用时间为自由选择工具(其选择了 hcitool 和 Bleak 脚本)的同一模型的 62%,令牌数为 70%。
Caeruleus 面向 带 BlueZ(bluetoothd)的 Linux 和标准 BLE 适配器。它不能在 macOS 或 Windows 上构建或运行。少数原始套接字命令需要 root 权限。
使用 Go 工具链:
go install github.com/praetorian-inc/caeruleus/cmd/caeruleus@latest
预构建发布二进制文件(x86_64 和 arm64):从 Releases 页面下载适用于你架构的归档文件,解压,并将 caeruleus 放入你的 $PATH。
从源码构建:
git clone https://github.com/praetorian-inc/caeruleus
cd caeruleus
make build # -> ./caeruleus
make test # unit tests + shell tests
对适配器进行健全性检查,然后发现附近设备:
$ caeruleus doctor
adapter: hci0
[ OK] bluetoothd active
[ OK] Powered true
[ OK] Discovering false
[ OK] Address agreement 00:1A:7D:DA:71:13
[ OK] LE scan healthy saw advertisements
[ OK] ExchangeMTU 247
$ caeruleus scan
ADDRESS TYPE RSSI DEVICE NAME
------------------------------------------------------------
9C:9C:1F:F2:88:86 public -32 BLECTF_JohnsonSpace
C4:C0:B0:3B:5B:EF random -59 Aranet4 06D4B
DC:FD:B4:CA:B4:E9 random -62 JBL Boombox 2
浏览完整的 GATT 树并一次性读取每个特征,然后操作单个句柄:
$ caeruleus enumerate -b 9C:9C:1F:F2:88:86 --values
SVC HND CHR HND CHR UUID PROPS HEX ASCII
0x0014 0x0015 0x2A00 R 424c457b46... BLE{F4K3_1D3NT1TY}
0x0028 0x002d 0xFF03 R 424c457b50... BLE{T0K3N_S4V3R}
0x0028 0x002f 0xFF05 R,W 577269746... Write anything here
$ caeruleus read -b 9C:9C:1F:F2:88:86 -a 0x002d
0x002d hex=424c457b503447335f5455524e33527d ascii="BLE{T0K3N_S4V3R}"
$ caeruleus write -b 9C:9C:1F:F2:88:86 -a 0x002f -s "praetorian"
0x002f written=10 type=request
交互式 shell(gatttool 风格动词)、stdin batch 模式,以及 serve/send 热链路守护进程,在你需要跨多个操作保持一条连接时随时可用。
| 分组 | 命令 |
|---|---|
| 发现 | scan、enumerate、primary、characteristics |
| GATT 操作 | read、write、raw-write、listen、cccd、mtu |
| 连接管理 | pair/unpair、conn-params、disconnect、forget |
| 脚本与自动化 | shell、batch、serve/send |
| 安全评估 | recon、assess check-auth、assess encryption、assess pairing、assess wwr、assess dfu |
| 模糊测试 | fuzz write(含 --raw)、fuzz replay |
| 适配器与诊断 | doctor、adapter、bdaddr、monitor |
每条命令的全局标志:-b/--bdaddr、-i/--adapter(默认 hci0)、-t/--timeout、-o/--format、-q/--quiet、-v/--verbose。特权命令(conn-params、monitor、fuzz write --raw、cccd --raw、raw-write、mtu --set、bdaddr --set)需要 root 权限。
刚接触该工具,或来自 bettercap / gatttool / bluetoothctl / nRF Connect / Bleak?运行 caeruleus recipes 获取用例优先的示例。完整的逐命令参考、评估方法以及硬件/适配器说明,请参阅 Wiki 和 skills/caeruleus/SKILL.md。
在较旧的 BlueZ(例如 5.55)上,其 D-Bus GATT 树会隐藏远程 GAP/GATT 服务,此时
enumerate --raw(root)会直接通过 ATT 通道发现数据库,以获得完整、独立于主机的视图,并带有设备的真实句柄。
读写句柄是简单的部分。Caeruleus 将临时的“让我检查几件事”阶段转变为可重复、结构化的评估。recon 对设备进行指纹识别并审计其 GATT 树;每个 assess 子命令探测一类弱点:
assess check-auth — 未配对攻击者可以读取(或使用 --probe-write 时写入)什么assess encryption — 配对/加密要求是否真正被强制执行assess pairing — SMP 配对特性交换和降级抵抗能力assess wwr — 无响应写入溢出和快速连发韧性assess dfu — 暴露的、未认证的固件更新入口点每个评估都输出相同的结构 {address, test, summary, findings[]},每个发现带有 severity、handle、uuid 和 evidence。看起来像机密的值会与 Praetorian 的 Titus 规则集交叉检查:通过未配对链路读取到的硬编码密钥本身就会被升级为高严重性发现。