
eBPF를 사용하는 Linux 커널 공간 HID 주입 공격 탐지기. USB 및 블루투스 HID 장치의 비정상적인 키스트로크 타이밍을 모니터링하고 공격이 완료되기 전에 악성 장치를 자동으로 언바인드합니다.
아래 이 저장소가 보관된 이유를 참조하세요.
Linux 커널 공간 보안 모니터로, eBPF HID-BPF struct_ops를 사용하여 HID 인젝션 공격(Rubber Ducky, O.MG Cable, ESP32 기반 키보드 에뮬레이터)을 탐지하고 차단합니다.
악성 HID 장치는 키보드를 에뮬레이트하여 사람이 입력하는 속도보다 훨씬 빠르게 키 입력을 주입합니다. 이 도구는 이러한 타이밍 이상을 감지하여 공격이 완료되기 전에 해당 장치를 커널 HID 드라이버에서 바인딩 해제합니다.
시작 시 이 도구는 현재 연결된 모든 HID 장치의 스냅샷을 찍고 이를 무시합니다. 새로 연결된 장치만 모니터링됩니다. USB 및 Bluetooth HID 장치를 모두 지원합니다.
main — 작동하는 개념 증명ESP32 기반 키보드 에뮬레이터로 테스트된 기능적 종단간 파이프라인:
struct_ops 프로그램 연결재작성을 유발한 알려진 제한 사항:
hid_id가 sysfs 마이너 번호에서 파생되며 재부팅 간에 안정적이지 않음v0.1 — 클린 재작성 (중단됨)BPF 레이어를 재연결하기 전에 구축된 이식 가능한 기반:
/sys/bus/hid/devices/를 통해 모든 HID 장치 열거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 장치 열거hid_desc_parse.c) — 연결 전에 장치 유형 식별 예정┌─────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────┘
탐지 로직이 BPF로 이동합니다. 사용자 공간은 디스크립터 파싱, 설정 맵 채우기, 바인딩 해제 응답을 처리합니다. 장치 연결과 BPF 연결 사이의 열거 창은 문서화된 제한된 한계입니다 — 실제 HID 인젝션 도구는 이 창 내에 속하는 의도적인 사후 열거 지연을 포함합니다.
libbpf 개발 헤더libelf 및 zlib 개발 헤더make
# 자동 탐지: 메시지가 표시되면 장치를 연결하거나 페어링하세요
sudo ./hid_guard
# 알려진 hid_id로 수동 재정의
sudo ./hid_guard <hid_id>
# 사용 가능한 HID 장치 목록 보기
ls /sys/bus/hid/devices/
main.c)| 매개변수 | 기본값 | 의미 |
|---|---|---|
ATTACK_MAX_MS | 5 ms | 주입을 나타내는 키 입력 간 간격 |
HUMAN_MIN_MS |
ESP32-S2가 BLE 키 입력 전송에 사용되었습니다. 다음으로, USB 포트를 대상으로 rubber ducky 또는 ESP32-S3와 같은 하드웨어로 테스트
GPL v2
| 30 ms |
| 인간 타이핑의 최소 간격 |
ALERT_THRESHOLD | 3 | 차단 전 연속 의심 이벤트 수 |
| 구성 요소 | 상태 |
|---|
| 장치 열거 | 완료 |
| 리포트 디스크립터 읽기 | 완료 |
| 디스크립터 파서 (키보드 식별) | 진행 중 |
| BPF 설정 맵 채우기 | 계획됨 |
| HID-BPF struct_ops 연결 | 완료 (main 브랜치) |
| 타이밍 탐지 (Welford 분산, BPF 측) | 계획됨 |
| Sysfs 바인딩 해제 차단 | 완료 (main 브랜치) |