
Détecteur d'attaques par injection HID dans l'espace noyau Linux utilisant eBPF. Surveille les périphériques HID USB et Bluetooth pour détecter un timing anormal des frappes et délie automatiquement les périphériques malveillants avant la fin de l'attaque.
Voir Pourquoi ce dépôt a été archivé ci-dessous.
Un moniteur de sécurité dans l'espace noyau Linux pour détecter et bloquer les attaques par injection HID (Rubber Ducky, O.MG Cable, émulateurs de clavier basés sur ESP32) en utilisant eBPF HID-BPF struct_ops.
Les périphériques HID malveillants émulent des claviers et injectent des frappes bien plus rapidement qu'aucun humain ne peut taper. Cet outil détecte cette anomalie temporelle et désactive le périphérique incriminé du pilote HID du noyau avant que l'attaque ne se termine.
Au démarrage, l'outil prend un instantané de tous les périphériques HID actuellement connectés et les ignore — seuls les périphériques nouvellement connectés sont surveillés. Il prend en charge les périphériques HID USB et Bluetooth.
main — Preuve de concept fonctionnellePipeline fonctionnel de bout en bout, testé contre un émulateur de clavier basé sur ESP32 :
struct_ops HID-BPF au périphérique découvertLimitations connues ayant déclenché la réécriture :
hid_id dérivé du numéro mineur sysfs, qui n'est pas stable entre les redémarragesv0.1 — Réécriture propre (arrêtée)Fondation portable construite avant de rebrancher la couche BPF :
/sys/bus/hid/devices/hid_desc_parse.c) — identification du type de périphérique non terminéeLes deux branches se sont heurtées au même mur : HID-BPF opère sur des tableaux d'octets bruts, donc toute analyse de descripteurs et vérification de type de périphérique doit résider dans l'espace utilisateur, quelle que soit la façon dont la logique de détection est répartie. Plutôt que de continuer à construire cet échafaudage à partir de zéro, j'ai migré vers [udev-hid-bpf].
Les périphériques HID malveillants émulent des claviers et injectent des frappes bien plus rapidement qu'aucun humain ne peut taper. Cet outil détecte cette anomalie temporelle et désactive le périphérique incriminé du pilote HID du noyau avant que l'attaque ne se termine.
Au démarrage, l'outil prend un instantané de tous les périphériques HID actuellement connectés et les ignore — seuls les périphériques nouvellement connectés sont surveillés. Il prend en charge les périphériques HID USB et Bluetooth.
main — Preuve de concept fonctionnellePipeline fonctionnel de bout en bout, testé contre un émulateur de clavier basé sur ESP32 :
struct_ops HID-BPF au périphérique découvertLimitations connues ayant déclenché la réécriture :
hid_id dérivé du numéro mineur sysfs, qui n'est pas stable entre les redémarragesv0.1 — Réécriture propre (développement actif)Fondation portable en cours de construction avant de rebrancher la couche BPF :
/sys/bus/hid/devices/hid_desc_parse.c) — identifiera le type de périphérique avant attachement┌─────────────────────────────────────────────────────┐
│ Espace utilisateur │
│ │
│ moniteur udev → analyse descripteur → clavier ? │
│ ↓ │
│ remplir les maps de configuration BPF (seuils, info périph.) │
│ ↓ │
│ attacher struct_ops HID-BPF à hid_id │
│ ↓ │
│ consommateur du tampon circulaire → désactiver sysfs en attaque │
└──────────────────────────┬──────────────────────────┘
│
┌──────────────────────────▼──────────────────────────┐
│ BPF (côté noyau) │
│ │
│ hid_device_event → calcul temporel (variance en │
│ ligne de Welford, virgule fixe) → maps d'horodatage│
│ par touche → soumission au tampon circulaire en │
│ cas d'anomalie │
└─────────────────────────────────────────────────────┘
La logique de détection passe dans BPF. L'espace utilisateur gère l'analyse des descripteurs, le remplissage des maps de configuration et la réponse de désactivation. La fenêtre d'énumération entre la connexion du périphérique et l'attachement BPF est une limitation documentée et bornée — les outils d'injection HID réels incluent des délais volontaires après l'énumération dans lesquels cette fenêtre s'inscrit.
libbpflibelf et zlibmake
# Détection automatique : branchez ou appariez le périphérique lorsque demandé
sudo ./hid_guard
# Surcharge manuelle avec un hid_id connu
sudo ./hid_guard <hid_id>
# Liste des périphériques HID disponibles
ls /sys/bus/hid/devices/
main.c)| Paramètre | Défaut | Signification |
|---|---|---|
ATTACK_MAX_MS |
Un ESP32-S2 a été utilisé pour la transmission de frappes BLE. Prochaine étape : tester avec du matériel comme un rubber ducky ou ESP32-S3, ciblant les ports USB.
GPL v2
| 5 ms |
| Intervalle inter-frappes indiquant une injection |
HUMAN_MIN_MS | 30 ms | Intervalle minimum pour la frappe humaine |
ALERT_THRESHOLD | 3 | Événements suspects consécutifs avant blocage |
| Composant | État |
|---|
| Énumération des périphériques | Terminé |
| Lecture du descripteur de rapport | Terminé |
| Analyseur de descripteur (identification clavier) | En cours |
| Remplissage des maps de configuration BPF | Planifié |
| Attachement HID-BPF struct_ops | Terminé (branche main) |
| Détection temporelle (variance Welford, côté BPF) | Planifié |
| Blocage par désactivation sysfs | Terminé (branche main) |