
Linux-Kernelspace-HID-Injektionsangriff-Detektor mit eBPF. Überwacht USB- und Bluetooth-HID-Geräte auf anomale Tastenanschlags-Zeiten und entbindet automatisch bösartige Geräte, bevor der Angriff abgeschlossen ist.
Siehe unten Warum dies archiviert wurde.
Ein Linux-Kernel-Space-Sicherheitsmonitor zur Erkennung und Blockierung von HID-Injektionsangriffen (Rubber Ducky, O.MG Cable, ESP32-basierte Tastaturemulatoren) mittels eBPF HID-BPF struct_ops.
Bösartige HID-Geräte emulieren Tastaturen und injizieren Tastenanschläge weit schneller als jeder menschliche Schreibende. Dieses Tool erkennt diese Zeitabnormalität und trennt das angreifende Gerät vom Kernel-HID-Treiber, bevor der Angriff abgeschlossen ist.
Beim Start erstellt das Tool eine Momentaufnahme aller derzeit angeschlossenen HID-Geräte und ignoriert sie – nur neu verbundene Geräte werden überwacht. Es unterstützt sowohl USB- als auch Bluetooth-HID-Geräte.
main – Arbeitsfähiger Proof of ConceptFunktionale End-to-End-Pipeline, getestet gegen einen ESP32-basierten Tastaturemulator:
struct_ops-Programm an das entdeckte Gerät anBekannte Einschränkungen, die die Neufassung auslösten:
hid_id wird von der sysfs-Minor-Nummer abgeleitet, die über Neustarts hinweg nicht stabil istv0.1 – Saubere Neufassung (angehalten)Tragfähiges Fundament, erstellt bevor die BPF-Schicht neu verdrahtet wird:
/sys/bus/hid/devices/ aufhid_desc_parse.c) – Gerätetyp-Identifikation nicht abgeschlossenBeide Zweige stießen auf die gleiche Hürde: HID-BPF arbeitet mit rohen Byte-Arrays, daher muss das gesamte Deskriptor-Parsing und die Gerätetyp-Überprüfung unabhängig von der Aufteilung der Erkennungslogik im Userspace stattfinden. Anstatt dieses Gerüst von Grund auf neu zu bauen, bin ich zu [udev-hid-bpf] gewechselt.
Bösartige HID-Geräte emulieren Tastaturen und injizieren Tastenanschläge weit schneller als jeder menschliche Schreibende. Dieses Tool erkennt diese Zeitabnormalität und trennt das angreifende Gerät vom Kernel-HID-Treiber, bevor der Angriff abgeschlossen ist.
Beim Start erstellt das Tool eine Momentaufnahme aller derzeit angeschlossenen HID-Geräte und ignoriert sie – nur neu verbundene Geräte werden überwacht. Es unterstützt sowohl USB- als auch Bluetooth-HID-Geräte.
main – Arbeitsfähiger Proof of ConceptFunktionale End-to-End-Pipeline, getestet gegen einen ESP32-basierten Tastaturemulator:
struct_ops-Programm an das entdeckte Gerät anBekannte Einschränkungen, die die Neufassung auslösten:
hid_id wird von der sysfs-Minor-Nummer abgeleitet, die über Neustarts hinweg nicht stabil istv0.1 – Saubere Neufassung (aktive Entwicklung)Tragfähiges Fundament im Aufbau, bevor die BPF-Schicht neu verdrahtet wird:
/sys/bus/hid/devices/ aufhid_desc_parse.c) – wird vor dem Anhängen den Gerätetyp identifizieren┌─────────────────────────────────────────────────────┐
│ Userspace │
│ │
│ udev monitor → descriptor parse → keyboard? │
│ ↓ │
│ populate BPF config maps (thresholds, device info) │
│ ↓ │
│ attach HID-BPF struct_ops to hid_id │
│ ↓ │
│ ring buffer consumer → sysfs unbind on attack │
└──────────────────────────┬──────────────────────────┘
│
┌──────────────────────────▼──────────────────────────┐
│ BPF (kernel side) │
│ │
│ hid_device_event → timing math (Welford's online │
│ variance, fixed-point) → per-key timestamp maps │
│ → ring buffer submit on anomaly │
└─────────────────────────────────────────────────────┘
Die Erkennungslogik wird in BPF verlagert. Der Userspace übernimmt das Parsen der Deskriptoren, die Befüllung der Konfigurations-Maps und die Unbind-Antwort. Das Zeitfenster zwischen Geräteverbindung und BPF-Anhängung ist eine dokumentierte, begrenzte Einschränkung – reale HID-Injektionswerkzeuge enthalten absichtliche Verzögerungen nach der Enumeration, in die dieses Fenster fällt.
libbpf-Entwicklungsheaderlibelf- und zlib-Entwicklungsheadermake
# Auto-Erkennung: Gerät einstecken oder koppeln, wenn aufgefordert
sudo ./hid_guard
# Manuelle Überschreibung mit bekannter hid_id
sudo ./hid_guard <hid_id>
# Verfügbare HID-Geräte auflisten
ls /sys/bus/hid/devices/
main.c)| Parameter | Default | Bedeutung |
|---|---|---|
ATTACK_MAX_MS |
ESP32-S2 wurde für BLE-Tastenanschlagsübertragung verwendet. Als nächstes Test mit Hardware wie Rubber Ducky oder ESP32-S3, auf USB-Ports abzielend.
GPL v2
| 5 ms |
| Intervall zwischen Tastenanschlägen, das auf Injektion hinweist |
HUMAN_MIN_MS | 30 ms | Mindestintervall für menschliches Tippen |
ALERT_THRESHOLD | 3 | Aufeinanderfolgende verdächtige Ereignisse vor der Blockierung |
| Komponente | Zustand |
|---|
| Geräteaufzählung | Erledigt |
| Berichtsdeskriptor lesen | Erledigt |
| Deskriptor-Parser (Tastaturidentifikation) | In Bearbeitung |
| Befüllung der BPF-Konfigurations-Map | Geplant |
| HID-BPF struct_ops-Anhängung | Erledigt (main-Branch) |
| Zeiterkennung (Welford-Varianz, BPF-Seite) | Geplant |
| Sysfs-Unbind-Blockierung | Erledigt (main-Branch) |