marcebd/Inocula_Lab
GitHub: marcebd/Inocula_Lab
这是一个基于三节点架构的混合蓝牙攻击与防御研究实验室,能够通过多维行为检测和LLM分类器,在203毫秒内自动识别并阻断结合了蓝牙欺骗与网络载荷的复杂混合攻击。
Stars: 0 | Forks: 0
# INOCULA
### 混合 BLE 攻击与防御安全研究实验室
[](https://github.com/Jaseci-Labs/jaclang)
[](https://python.org)
[](https://reactjs.org)
[]()
[]()
*A 3-machine security research lab that orchestrates hybrid Bluetooth attacks across a Raspberry Pi scout, attacker C2, and defender sentinel — then measures real-time detection and automated response using 7 behavioral detectors and an LLM-augmented classifier.*
[架构](#architecture) | [仪表板](#dashboards) | [防御实战](#defense-mechanism-in-action) | [功能](#features) | [快速入门](#getting-started) | [演示场景](#demo-scenarios) | [技术栈](#tech-stack)
*A 3-machine security research lab that orchestrates hybrid Bluetooth attacks across a Raspberry Pi scout, attacker C2, and defender sentinel — then measures real-time detection and automated response using 7 behavioral detectors and an LLM-augmented classifier.*
[架构](#architecture) | [仪表板](#dashboards) | [防御实战](#defense-mechanism-in-action) | [功能](#features) | [快速入门](#getting-started) | [演示场景](#demo-scenarios) | [技术栈](#tech-stack)
## 问题所在 传统的蓝牙防御专注于单一攻击面——检测 MAC 克隆、RSSI 异常或 HID 配置文件不匹配。但一个复杂的攻击者不会只在一个层面发动攻击。他们将一个**高调**的蓝牙层诱饵(MAC 克隆)与一个**隐秘**的网络层载荷(通过 HTTP 进行 HID 注入)结合起来,压制 BT 检测器,而真正的攻击则在未被察觉的情况下溜走。 **Inocula 证明了这一漏洞的存在——并填补了它。**
## 架构 Inocula 分布在共享局域网内的三台物理机上,实现了带有实时防御者反馈的闭环 **OODA (Observe-Orient-Decide-Act)** 攻击循环: ``` ┌─────────────────────────────────────┐ │ LAPTOP A — SENTINEL │ │ Defense Monitor (port 8787) │ │ │ │ 7 Behavioral Detectors: │ │ ├─ RSSI Drift Analysis │ │ ├─ Reconnect Timing Anomaly │ │ ├─ Duplicate MAC Detection │ │ ├─ HID Profile Mismatch │ │ ├─ Sleep Cycle Violation │ │ ├─ NetworkSentinel ← NEW │ │ └─ ProcessSentinel ← NEW │ │ │ │ LLM Classifier + Auto-Remediation │ └──────────────┬──────────────────────┘ │ trigger_payload (HTTP) │ sentinel_alert (webhook) │ ┌────────────────────┐ report_scan │ ┌────────────────────────────┐ │ RASPBERRY PI │ ─────────────────────── │ LAPTOP B — C2 │ │ Scout │ (HTTP POST) │ │ Attack Orchestrator │ │ │ │ │ (port 8788) │ │ BLE + Classic BT │ ◄────────────────────── │ │ │ Passive Scanner │ ssh bt_clone.sh │ │ OODA State Machine │ │ (outbound only) │ │ │ Track Selector │ └────────────────────┘ │ │ Dry-Run Previewer │ │ └────────────────────────────┘ ``` | 节点 | 角色 | 端口 | 语言 | |------|------|------|----------| | **Sentinel** | 防御监视器——检测、分类并修复攻击 | `8787` | Jac + Python | | **C2** | 攻击编排器——OODA 循环、跟踪分发、操作员控制台 | `8788` | Jac + Python | | **Scout** | 被动 BLE 扫描器——将设备观测数据发送给 C2 | 仅出站 | Python |
## 仪表板 两个仪表板均使用 Jac 的 `cl {}` React 转译器构建,提供受 SOC 终端启发的深色 UI,并从 Jac walker 端点获取实时更新。 ### Sentinel 防御仪表板
### C2 操作员控制台
## 防御机制实战 随着攻击被检测、分类和中和,Sentinel 仪表板会实时转换。以下是完整序列: ### 实时演示
Full attack simulation: monitoring → detection → quarantine in 203ms
### 逐步拆解
#### 1. 监控状态
Sentinel 处于 **MONITORING**(监控)阶段。所有行为基线均为绿色——RSSI 在范围内,HID 配置文件已验证,睡眠周期节奏正常。信任网络检查显示全部通过。威胁情报日志处于安静状态。
|
#### 2. Sentinel 运行中 + 分类
点击 **RUN SENTINELS**(运行哨兵)后,全部 7 个检测器扫描环境。**LLM 分类器**条激活,显示 `BENIGN / INFO conf 68% · RULES` ——基于规则的后端确认无威胁。网络和进程哨兵状态条更新扫描时间戳。
|
#### 3. 检测到攻击 — 第一阶段
模拟攻击触发防御级联。仪表板爆发:
- **幽灵节点**出现在网络图中(红色 "UNKNOWN IDENTITY / QUARANTINED")
- **RSSI 监视器**飙升为红色——偏离基线 12 dBm
- **HID 配置文件**闪烁 "MISMATCH DETECTED"(检测到不匹配)
- **信任网络**检查变为红色(RSSI、HID、LATENCY、SLEEP、DUP_ID 全部失败)
- **威胁情报**充斥红色警报:重复的 BLE 身份、RSSI 偏离、鼠标 HID 上的键盘报告
- **威胁时间轴**出现橙色/红色事件点
|
#### 4. 隔离完成 — 第二阶段
在 **203 毫秒**内,防御循环完成:
- **"TIME TO DETECTION: 203ms"**(检测耗时:203ms)横幅出现在底部
- 幽灵节点连接线**切断**——设备被隔离
- TrustEdge 状态:**QUARANTINED**(已隔离)
- 所有 walker 检查保持红色,确认威胁
- 威胁情报日志显示:*"Ghost node isolated. Connection severed."*
- 攻击在无人工干预的情况下被完全遏制
|
## 功能 ### 攻击编排 (C2) | 功能 | 描述 | |---------|-------------| | **OODA 状态机** | 基于扫描证据、目标 RSSI 和受害者空闲状态的自动阶段转换 | | **隐秘跟踪** | 通过 HTTP POST 向 Sentinel 的白名单端点交付基于网络的 HID 载荷 | | **高调跟踪** | 通过 SSH 向 Raspberry Pi 发起一次性蓝牙 MAC 克隆(`bt_clone.sh`) | | **混合跟踪** | 无论单个跟踪结果如何,在单个操作中链接高调 → 隐秘 | | **试运行预览器** | 解析完整攻击计划(URL、正文、SSH argv)而不执行或推进冷却时间 | | **冷却门控** | 可配置的冷却时间(默认 90s)防止连发;UI 显示实时倒计时 | | **自适应 Scout 轮询** | C2 通过 `next_poll_seconds` 响应字段控制 Pi 扫描间隔 | ### 防御检测 (Sentinel) | 检测器 | 平面 | 检测内容 | |----------|-------|-----------------| | **RSSI 漂移** | 蓝牙 | 指示设备欺骗的统计基线方差 | | **重连时序** | 蓝牙 | 来自克隆设备的异常重连接延迟模式 | | **重复 MAC** | 蓝牙 | 同一蓝牙地址同时出现在两个位置 | | **HID 配置文件不匹配** | 蓝牙 | 设备通告错误的服务配置文件(例如,鼠标声称是键盘) | | **睡眠违规** | 蓝牙 | 在预期空闲期间发生的唤醒事件 | | **NetworkSentinel** | 网络 | 恶意入站 POST、未知 TCP 监听器、意外 LAN 对等方 | | **ProcessSentinel** | 进程 | 空闲生成队列检测(空闲时的 calc/notepad),SendInput 突发标记 | ### AI 驱动分类 ``` Features from 7 detectors │ ▼ ┌──────────────┐ ┌──────────────┐ │ LLM Backend │ ──► │ Structured │ │ (Claude) │ │ Response │ └──────┬───────┘ │ │ │ fallback │ kind: │ ▼ │ severity: │ ┌──────────────┐ │ confidence: │ │ Rule Engine │ ──► │ actions: │ │ (Pure Py) │ │ summary: │ └──────────────┘ └──────────────┘ ``` - **双后端分类器:** Claude LLM 用于细致的攻击模式识别,确定性规则引擎用于保证可用性 - **分类输出:** `STEALTH_NETWORK` | `STEALTH_PROCESS` | `NOISY_BT` | `BENIGN` | `UNKNOWN` - **严重性级别:** CRITICAL → HIGH → MEDIUM → LOW → INFO 并附带置信度评分(0–1) - **自动修复:** `kill_listener`、`block_ip`、`kill_process`、`quarantine_device` —— 均受白名单控制 ### 安全保障 - **Token 认证**的节点间通信(`X-Inocula-Token` 头) - Sentinel 触发端点上的 **IP 白名单**(仅限 C2 的 IP) - **进程终止白名单:** 仅限 `calc`、`notepad`、`cmd`、`powershell`、`wscript`、`cscript`、`mshta` - **任何地方都不使用 `shell=True`** —— 所有子进程调用使用经验证的 argv 列表 - 每个破坏性操作上的 **试运行门控** - 对 MAC 地址、SSH 主机、URL、IP 和防火墙规则名称的 **输入验证**
## 项目结构 ``` Inocula_Lab/ │ ├── sentinel/ # Laptop A — Defense (port 8787) │ ├── main.jac # ~2,500 LOC: graph, 7 detectors, walkers, React UI │ ├── jac.toml # Jac config: React deps, LLM backend │ └── adapters/ # Python OS adapters │ ├── win_bt.py # Windows BT enum via WinRT │ ├── net_scan.py # TCP listener & LAN peer scanner │ ├── proc_scan.py # Process cohort & idle-spawn detector │ ├── classify.py # LLM + rule-based attack classifier │ └── kill_listener.py # Remediation: taskkill + netsh firewall │ ├── c2/ # Laptop B — Attack (port 8788) │ ├── main.jac # ~3,000 LOC: C2 graph, OODA machine, React console │ ├── jac.toml # Jac config │ ├── adapters/ │ │ └── track_ops.py # fire_stealth / fire_noisy / plan_operation │ └── tracks/ │ ├── track_stealth.jac # Stealth attack contract │ └── track_noisy.jac # Noisy attack contract │ ├── scout/ # Raspberry Pi — BLE Sensor │ ├── pi_agent.py # ~500 LOC: async BLE scanner + C2 client │ ├── bt_clone.sh # One-shot MAC clone script (93 lines) │ └── requirements.txt # bleak, requests │ ├── shared/ # Inter-node contracts │ ├── protocol.md # HTTP endpoints, JSON shapes, timeouts, errors │ └── auth.md # Token spec, .env layout, IP whitelist rules │ ├── tests/ # Test suite (~704 LOC) │ ├── test_new_sentinels.py # Phase 3: Network + Process sentinel adapters │ └── test_c2_tracks.py # Phase 4: Track dispatch, validation, dry-run │ ├── .env.example # Master environment template └── docs/screenshots/ # Dashboard screenshots ```
## 快速入门 ### 前置条件 | 需求 | 版本 | 用途 | |-------------|---------|---------| | Python | 3.10+ | JacLang 和适配器的运行时 | | JacLang | 0.13.5 | 图遍历运行时 + React UI 转译器 | | Node.js + npm | 18+ | React 打包构建(通过 `jac-client`) | | Bleak | 0.21+ | BLE 扫描(Scout + Sentinel) | ### 1. 生成共享 Token ``` python -c "import secrets; print(secrets.token_hex(32))" # → 将其粘贴到所有三个 .env 文件中的 INOCULA_TOKEN ``` ### 2. 配置环境 ``` # 复制并根据主机自定义 .env cp .env.example sentinel/.env # Laptop A cp .env.example c2/.env # Laptop B # Scout .env 放置在 Pi 上 ```
关键环境变量
| 变量 | 主机 | 描述 | |----------|------|-------------| | `INOCULA_TOKEN` | 所有 | 64 位十六进制共享密钥 | | `INOCULA_SENTINEL_PORT` | Sentinel | 默认 `8787` | | `INOCULA_C2_PORT` | C2 | 默认 `8788` | | `INOCULA_C2_URL` | Sentinel | 用于警报 Webhook 的 C2 地址 | | `INOCULA_SENTINEL_URL` | C2 | 用于受害者轮询的 Sentinel 地址 | | `INOCULA_PI_SSH_HOST` | C2 | 用于 Pi SSH 访问的 `user@host` | | `INOCULA_ALLOW_REMOTE_TRIGGER_FROM` | Sentinel | C2 的 IP(白名单) | | `ANTHROPIC_API_KEY` | Sentinel | 可选——启用 LLM 分类器 |## 演示场景 ### 场景 1:隐秘攻击 ``` C2 selects "STEALTH" → RUN OPERATION → HTTP POST to Sentinel /walker/trigger_payload → NetworkSentinel detects rogue inbound POST → Classifier: STEALTH_NETWORK / CRITICAL → Auto-remediation: block_ip via netsh firewall → sentinel_alert webhook fires back to C2 ``` ### 场景 2:高调攻击 ``` C2 selects "NOISY" → RUN OPERATION → SSH to Pi → bt_clone.sh
## 测试 ``` # 运行完整测试套件(模拟 HTTP + SSH,无需网络) python -m unittest discover tests -v ``` | 测试文件 | 覆盖范围 | 代码行数 | |-----------|----------|-----| | `test_new_sentinels.py` | NetworkSentinel、ProcessSentinel、分类器、修复试运行 | 330 | | `test_c2_tracks.py` | 隐秘 POST 形状、SSH argv 构造、冷却门控、验证器 | 374 |
## 技术栈
| 层级 | 技术 | 角色 |
|-------|-----------|------|
| **运行时** | JacLang 0.13.5 | 图遍历计算模型 |
| **前端** | React 18 + Recharts + Lucide | SOC 终端仪表板 |
| **后端** | Python 3.10+ 适配器 | 系统级扫描、分类、修复 |
| **BLE** | Bleak 0.21+ | 异步蓝牙低功耗扫描 |
| **AI** | Claude(通过 LiteLLM) | 攻击模式分类 |
| **协议** | HTTP + JSON + SSH | 节点间通信 |
| **认证** | HMAC token + IP 白名单 | 实验室级访问控制 |
| **打包工具** | Vite 6.4 | React 构建管道 |
## 内部工作原理 **Jac 的图遍历范式** 为整个系统提供动力。Inocula 不是使用传统的 REST 控制器,而是定义 **图节点**(设备、外设、信任边)和遍历图以执行检测、分类和响应的 **walkers**: ``` Walker: run_sentinel ├── Walks to LaptopNode ├── Runs 5 BT detectors (RSSI, timing, MAC, HID, sleep) ├── Calls NetworkSentinel adapter (TCP listeners, LAN peers, POST log) ├── Calls ProcessSentinel adapter (recent processes, idle cohort, SendInput) ├── Aggregates features into classification payload ├── Dispatches to classify() → LLM or rule engine └── Executes recommended_actions (kill, block, quarantine) ``` C2 上的 **OODA 循环** 是一个由图节点属性驱动的状态机: | 条件 | 阶段 | |-----------|-------| | 未选择目标 | **Observe**(观察)——等待 Scout 扫描数据 | | 已选择目标,未武装 | **Orient**(调整)——轮询 Sentinel 以确认空闲状态 | | 已武装,零触发器 | **Decide**(决策)——操作员选择跟踪 | | 已武装,触发器已触发 | **Act**(行动)——分发到跟踪适配器 |
## 协议规范 所有节点间通信均 [`shared/protocol.md`](shared/protocol.md) 中的约定: | 路由 | 调用者 | 用途 | 超时 | |-------|--------|---------|---------| | `POST /walker/report_scan` | Scout → C2 | BLE 设备快照 | 15s | | `POST /walker/victim_status` | C2 → Sentinel | 空闲时间 + 防御状态 | 8s | | `POST /walker/trigger_payload` | C2 → Sentinel | 触发隐秘载荷 | 8s | | `POST /walker/sentinel_alert` | Sentinel → C2 | 警报 Webhook | 6s | 认证:所有远程调用均需 `X-Inocula-Token` 头。Localhost 豁免。
## 安全与伦理 - 每个破坏性操作都有**试运行门控** - 每次节点间调用都需要 **token 认证** - 进程终止限制为**硬编码白名单** - 无 TLS —— 仅专为**可信的私有 LAN** 设计 - Token 是实验室便利工具,**不**是安全的认证机制 - **请勿在直接人工监督之外的私有实验室之外部署**
**~7,945 行代码** | **3 个节点** | **7 个检测器** | **2 个攻击跟踪** | **1 个研究目标**
*Built with [JacLang](https://github.com/Jaseci-Labs/jaclang) — the graph-walker programming language*
标签:BLE, DLL 劫持, HID注入, JacLang, LLM, MAC地址欺骗, Python, Raspberry Pi, React, RSSI异常检测, Syscalls, Unmanaged PE, 低功耗蓝牙, 内存分配, 内存执行, 命令与控制, 大语言模型, 实时检测, 无后门, 混合攻击, 物联网安全, 硬件安全, 网络安全, 自动化威胁检测, 蓝牙安全, 逆向工具, 防御实验室, 隐私保护
点击 **RUN SENTINELS**(运行哨兵)后,全部 7 个检测器扫描环境。**LLM 分类器**条激活,显示 `BENIGN / INFO conf 68% · RULES` ——基于规则的后端确认无威胁。网络和进程哨兵状态条更新扫描时间戳。
模拟攻击触发防御级联。仪表板爆发:
- **幽灵节点**出现在网络图中(红色 "UNKNOWN IDENTITY / QUARANTINED")
- **RSSI 监视器**飙升为红色——偏离基线 12 dBm
- **HID 配置文件**闪烁 "MISMATCH DETECTED"(检测到不匹配)
- **信任网络**检查变为红色(RSSI、HID、LATENCY、SLEEP、DUP_ID 全部失败)
- **威胁情报**充斥红色警报:重复的 BLE 身份、RSSI 偏离、鼠标 HID 上的键盘报告
- **威胁时间轴**出现橙色/红色事件点
在 **203 毫秒**内,防御循环完成:
- **"TIME TO DETECTION: 203ms"**(检测耗时:203ms)横幅出现在底部
- 幽灵节点连接线**切断**——设备被隔离
- TrustEdge 状态:**QUARANTINED**(已隔离)
- 所有 walker 检查保持红色,确认威胁
- 威胁情报日志显示:*"Ghost node isolated. Connection severed."*
- 攻击在无人工干预的情况下被完全遏制