marcebd/Inocula_Lab

GitHub: marcebd/Inocula_Lab

这是一个基于三节点架构的混合蓝牙攻击与防御研究实验室,能够通过多维行为检测和LLM分类器,在203毫秒内自动识别并阻断结合了蓝牙欺骗与网络载荷的复杂混合攻击。

Stars: 0 | Forks: 0

# INOCULA ### 混合 BLE 攻击与防御安全研究实验室 [![JacLang](https://img.shields.io/badge/JacLang-0.13.5-00ff88?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMGZmODgiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTEyIDJMMiA3bDEwIDUgMTAtNS0xMC01eiIvPjxwYXRoIGQ9Ik0yIDE3bDEwIDUgMTAtNSIvPjxwYXRoIGQ9Ik0yIDEybDEwIDUgMTAtNSIvPjwvc3ZnPg==)](https://github.com/Jaseci-Labs/jaclang) [![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://python.org) [![React](https://img.shields.io/badge/React-18.2-61DAFB?style=for-the-badge&logo=react&logoColor=black)](https://reactjs.org) [![Bluetooth](https://img.shields.io/badge/BLE-5.0-0082FC?style=for-the-badge&logo=bluetooth&logoColor=white)]() [![License](https://img.shields.io/badge/License-Research_Only-ff3355?style=for-the-badge)]()
*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 防御仪表板
Inocula Sentinel Dashboard


### C2 操作员控制台
Inocula C2 Dashboard


## 防御机制实战 随着攻击被检测、分类和中和,Sentinel 仪表板会实时转换。以下是完整序列: ### 实时演示
Inocula Defense Simulation
Full attack simulation: monitoring → detection → quarantine in 203ms

### 逐步拆解
#### 1. 监控状态 Clean monitoring state Sentinel 处于 **MONITORING**(监控)阶段。所有行为基线均为绿色——RSSI 在范围内,HID 配置文件已验证,睡眠周期节奏正常。信任网络检查显示全部通过。威胁情报日志处于安静状态。 #### 2. Sentinel 运行中 + 分类 Classifier output 点击 **RUN SENTINELS**(运行哨兵)后,全部 7 个检测器扫描环境。**LLM 分类器**条激活,显示 `BENIGN / INFO conf 68% · RULES` ——基于规则的后端确认无威胁。网络和进程哨兵状态条更新扫描时间戳。
#### 3. 检测到攻击 — 第一阶段 Attack detection phase 模拟攻击触发防御级联。仪表板爆发: - **幽灵节点**出现在网络图中(红色 "UNKNOWN IDENTITY / QUARANTINED") - **RSSI 监视器**飙升为红色——偏离基线 12 dBm - **HID 配置文件**闪烁 "MISMATCH DETECTED"(检测到不匹配) - **信任网络**检查变为红色(RSSI、HID、LATENCY、SLEEP、DUP_ID 全部失败) - **威胁情报**充斥红色警报:重复的 BLE 身份、RSSI 偏离、鼠标 HID 上的键盘报告 - **威胁时间轴**出现橙色/红色事件点 #### 4. 隔离完成 — 第二阶段 Quarantine complete 在 **203 毫秒**内,防御循环完成: - **"TIME TO DETECTION: 203ms"**(检测耗时:203ms)横幅出现在底部 - 幽灵节点连接线**切断**——设备被隔离 - TrustEdge 状态:**QUARANTINED**(已隔离) - 所有 walker 检查保持红色,确认威胁 - 威胁情报日志显示:*"Ghost node isolated. Connection severed."* - 攻击在无人工干预的情况下被完全遏制
### 您所看到的 防御机制运行一个**闭环检测管道**: ``` Attack Event │ ▼ ┌─────────────────────────────────────────────────────┐ │ SentinelWalker traverses TrustEdge to each device │ │ ├── RSSI check → -72 dBm (expected -60 ±3) │ ❌ DRIFT │ ├── HID check → MIXED (expected MOUSE_ONLY) │ ❌ MISMATCH │ ├── Latency check → 45ms (threshold 15ms) │ ❌ ANOMALY │ ├── Sleep check → 0.012s (expected 25s) │ ❌ VIOLATION │ └── Duplicate ID → 2 signals on same MAC │ ❌ DETECTED │ │ │ threat_score: 0.94 → ACTION: QUARANTINE │ └─────────────────────────────────────────────────────┘ │ ▼ Device isolated in 203ms ```
## 功能 ### 攻击编排 (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 分类器 |
### 3. 启动实验室 ``` # 终端 1 — Sentinel (笔记本电脑 A) cd sentinel PYTHONIOENCODING=utf-8 PYTHONUTF8=1 jac start main.jac --port 8787 # 终端 2 — C2 (笔记本电脑 B) cd c2 PYTHONIOENCODING=utf-8 PYTHONUTF8=1 jac start main.jac --port 8788 # 终端 3 — Scout (Raspberry Pi) python3 scout/pi_agent.py ``` ### 4. 验证 - **Sentinel 仪表板:** `http://localhost:8787/` - **C2 控制台:** `http://localhost:8788/` - **C2 健康检查:** 在启动输出中查找 `ssh_ok: True, has_sentinel_url: True, has_token: True`
## 演示场景 ### 场景 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 → Sentinel's Duplicate MAC detector fires → BT remediation removes cloned device → Dashboard flips to red alert ``` ### 场景 3:混合攻击(两者) ``` C2 selects "BOTH" → RUN OPERATION → NOISY leg: MAC clone trips BT detectors (expected) → STEALTH leg: HID payload slips through... → NetworkSentinel catches the rogue POST ← THIS IS THE GAP INOCULA CLOSES → ProcessSentinel detects idle-spawn cohort → Hybrid classification: CRITICAL, multi-plane attack confirmed → Cooldown: 90s before next operation ``` 每个场景均可作为 **试运行** 使用——预览完整攻击计划而不执行或触及冷却时钟。
## 测试 ``` # 运行完整测试套件(模拟 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, 低功耗蓝牙, 内存分配, 内存执行, 命令与控制, 大语言模型, 实时检测, 无后门, 混合攻击, 物联网安全, 硬件安全, 网络安全, 自动化威胁检测, 蓝牙安全, 逆向工具, 防御实验室, 隐私保护