
Детектор атак внедрения HID в пространстве ядра Linux с использованием eBPF. Отслеживает USB- и Bluetooth-устройства HID на предмет аномальной временной последовательности нажатий клавиш и автоматически отключает вредоносные устройства до завершения атаки.
См. раздел Почему этот репозиторий архивирован ниже.
Монитор безопасности на уровне ядра Linux для обнаружения и блокировки атак с внедрением HID (Rubber Ducky, O.MG Cable, эмуляторы клавиатуры на ESP32) с использованием eBPF HID-BPF struct_ops.
Вредоносные HID-устройства эмулируют клавиатуры и внедряют нажатия клавиш значительно быстрее, чем любой человек-машинист. Этот инструмент обнаруживает такую временную аномалию и отключает вредоносное устройство от драйвера HID ядра до завершения атаки.
При запуске инструмент делает снимок всех текущих подключенных HID-устройств и игнорирует их — отслеживаются только новые подключенные устройства. Поддерживаются как USB-, так и Bluetooth-HID-устройства.
main — Рабочий прототипФункциональный сквозной конвейер, протестированный на эмуляторе клавиатуры на ESP32:
struct_ops к обнаруженному устройствуИзвестные ограничения, вызвавшие переписывание:
hid_id получается из номера младшего устройства sysfs, который нестабилен при перезагрузкахv0.1 — Чистый переписывание (остановлено)Переносимая основа, созданная до переподключения BPF-уровня:
/sys/bus/hid/devices/hid_desc_parse.c) — идентификация типа устройства не завершенаОбе ветки столкнулись с одной и той же стеной: HID-BPF работает с сырыми байтовыми массивами, поэтому весь разбор дескрипторов и проверка типа устройства должны находиться в пользовательском пространстве, независимо от того, как разделена логика обнаружения. Вместо того чтобы продолжать строить эту инфраструктуру с нуля, я перешел на [udev-hid-bpf].
Вредоносные HID-устройства эмулируют клавиатуры и внедряют нажатия клавиш значительно быстрее, чем любой человек-машинист. Этот инструмент обнаруживает такую временную аномалию и отключает вредоносное устройство от драйвера HID ядра до завершения атаки.
При запуске инструмент делает снимок всех текущих подключенных HID-устройств и игнорирует их — отслеживаются только новые подключенные устройства. Поддерживаются как USB-, так и Bluetooth-HID-устройства.
main — Рабочий прототипФункциональный сквозной конвейер, протестированный на эмуляторе клавиатуры на ESP32:
struct_ops к обнаруженному устройствуИзвестные ограничения, вызвавшие переписывание:
hid_id получается из номера младшего устройства sysfs, который нестабилен при перезагрузкахv0.1 — Чистый переписывание (активная разработка)Переносимая основа, создаваемая до переподключения BPF-уровня:
/sys/bus/hid/devices/hid_desc_parse.c) — будет определять тип устройства перед подключением┌─────────────────────────────────────────────────────┐
│ Пользовательское пространство │
│ │
│ udev-монитор → разбор дескриптора → клавиатура? │
│ ↓ │
│ заполнение конфигурационных карт BPF (пороги, │
│ информация об устройстве) │
│ ↓ │
│ подключение HID-BPF struct_ops к hid_id │
│ ↓ │
│ потребитель кольцевого буфера → отключение через │
│ sysfs при атаке │
└──────────────────────────┬──────────────────────────┘
│
┌──────────────────────────▼──────────────────────────┐
│ BPF (сторона ядра) │
│ │
│ hid_device_event → временные вычисления │
│ (онлайн-дисперсия Уэлфорда, фиксированная точка) │
│ → карты временных меток на клавишу │
│ → отправка в кольцевой буфер при аномалии │
└─────────────────────────────────────────────────────┘
Логика обнаружения переходит в BPF. Пользовательское пространство обрабатывает разбор дескрипторов, заполнение конфигурационных карт и реакцию отключения. Окно перечисления между подключением устройства и подключением BPF является документированным, ограниченным ограничением — реальные инструменты внедрения HID включают преднамеренные задержки после перечисления, в которые это окно укладывается.
libbpflibelf и zlibmake
# Автообнаружение: подключите или сопрягите устройство, когда будет предложено
sudo ./hid_guard
# Ручное переопределение с известным hid_id
sudo ./hid_guard <hid_id>
# Список доступных HID-устройств
ls /sys/bus/hid/devices/
main.c)| Параметр | По умолчанию | Значение |
|---|---|---|
ATTACK_MAX_MS |
ESP32-S2 использовался для передачи нажатий клавиш по BLE. Далее планируется тестирование на аппаратных устройствах, таких как rubber ducky или ESP32-S3, с нацеливанием на USB-порты.
GPL v2
| 5 мс |
| Интервал между нажатиями клавиш, указывающий на внедрение |
HUMAN_MIN_MS | 30 мс | Минимальный интервал для набора человеком |
ALERT_THRESHOLD | 3 | Количество последовательных подозрительных событий до блокировки |
| Компонент | Состояние |
|---|
| Перечисление устройств | Готово |
| Чтение дескриптора отчета | Готово |
| Парсер дескриптора (идентификация клавиатуры) | В процессе |
| Заполнение конфигурационных карт BPF | Запланировано |
| Подключение HID-BPF struct_ops | Готово (ветка main) |
| Временное обнаружение (дисперсия Уэлфорда, сторона BPF) | Запланировано |
| Блокировка отключения через sysfs | Готово (ветка main) |