
Движок семантического анализа для обнаружения исправлений уязвимостей в патчах драйверов ядра Windows — 58 правил YAML, декомпиляция Ghidra, отслеживание достижимости и оценка
Автоматизированная платформа анализа исправлений и поиска уязвимостей
Движок семантического анализа для обнаружения исправлений уязвимостей в патчах драйверов ядра Windows. AutoPiff использует консервативные YAML-правила для выявления изменений кода, связанных с безопасностью, с высокой точностью и объяснимостью.
AutoPiff анализирует различия между уязвимой и исправленной версиями драйвера, чтобы автоматически обнаруживать:
NULL после ExFreePool)memcpy)ProbeForRead/ProbeForWrite)Вендор выпускает 500 обновлений драйверов в год
├── 490 — функциональные/производительные/косметические изменения
├── 8 — незначительные исправления ошибок
└── 2 — молчаливые исправления безопасности (без CVE)
Без автоматизации: просмотреть 500 вручную, чтобы найти 2
С AutoPiff: просмотреть 10 с наивысшим рейтингом, чтобы найти 2
Патчи безопасности часто выпускаются без назначения CVE. Ручное реверс-инжиниринг каждого обновления драйвера для поиска изменений, связанных с безопасностью, невозможно. AutoPiff решает эту проблему, автоматически выявляя важные изменения.
Итого: с 4–12 часов на пару драйверов до 2–5 минут
┌─────────────────────────────────────────────────────────────────┐
│ АВТОМАТИЗИРОВАНО AutoPiff │
│ ├── Найти иголку: "Эта функция изменилась рядом с ExFreePool" │
│ ├── Классифицировать: "Похоже на исправление Use-After-Free" │
│ └── Оценить: "Оценка 5.5 — стоит исследовать" │
├─────────────────────────────────────────────────────────────────┤
│ ПО-ПРЕЖНЕМУ ВРУЧНУЮ (Ваша экспертиза) │
│ ├── Подтвердить эксплуатируемость: "Могу ли я реально это │
│ вызвать?" │
│ ├── Анализ первопричины: "Почему это было уязвимо?" │
│ ├── Разработка эксплойта: "Как мне достичь этого приёмника?" │
│ └── Оценка воздействия: "Каков реальный риск?" │
└─────────────────────────────────────────────────────────────────┘
AutoPiff не заменяет исследования по эксплуатации. Он делает их возможными в масштабе, автоматизируя фазу разведки.
1. Обнаружение молчаливых исправлений
2. Исследование уязвимостей 1-го дня
3. Аудит безопасности вендора
4. Создание исторического корпуса CVE
AutoPiff работает как конвейер Karton, состоящий из 8 последовательных этапов плюс параллельная ветвь триажа DriverAtlas. Каждый этап — независимый микросервис, общающийся через Redis/RabbitMQ.
graph LR
sources["WinBIndex<br/>VirusTotal"]:::src --> s0["Stage 0<br/>Monitor"]
s0 --> s14["Stages 1-4<br/>Patch Differ"]
s0 --> triage["DriverAtlas<br/>Triage"]:::triage
s14 --> s5["Stage 5<br/>Reachability"]
s5 --> s6["Stage 6<br/>Ranking"]
s6 --> s7["Stage 7<br/>Report"]
s6 --> s8["Stage 8<br/>Alerter"]
triage --> alerts["MWDB Tags<br/>+ Alerts"]:::triage
classDef src fill:#1a1a2e,stroke:#e94560,color:#eee
classDef triage fill:#1a1a2e,stroke:#e9a345,color:#eee
classDef default fill:#16213e,stroke:#0f3460,color:#eee
AutoPiff включает 58 правил в 22 категориях. Полные спецификации см. в Docs/semantic_rules.md и техническом справочнике Docs/SEMANTIC_RULES_REFERENCE.md.
Движок правил отслеживает более 50 опасных API-символов в 8 группах приёмников:
memory_copy: RtlCopyMemory, memcpy, memmovepool_alloc: ExAllocatePool, ExAllocatePoolWithTagpool_free: ExFreePool, ExFreePoolWithTaguser_probe: ProbeForRead, ProbeForWriteio_sanitization: RtlULongAdd, RtlSizeTMultexceptions: __try, __exceptstring_copy: strcpy, wcsncpyrefcounting: InterlockedIncrement/DecrementРезультаты оцениваются с помощью настраиваемой модели (rules/scoring.yaml):
final_score = semantic_score + reachability_bonus + sink_bonus - penalties
Компоненты оценки:
Пороги:
git clone https://github.com/splintersfury/AutoPiff.git
cd AutoPiff
docker compose up -d
Для полного производственного стека с MWDB, дашбордами и мониторингом см. driver_analyzer.
pip install pyyaml
from services.karton_patch_differ.rule_engine import SemanticRuleEngine
engine = SemanticRuleEngine('rules/semantic_rules.yaml', 'rules/sinks.yaml')
hits = engine.evaluate(func_name, old_code, new_code, diff_lines)
Отредактируйте rules/semantic_rules.yaml, чтобы добавить или изменить правила:
rules:
- rule_id: my_custom_rule
category: bounds_check
confidence: 0.85
required_signals:
- sink_group: memory_copy
- change_type: guard_added
- guard_kind: length_check
plain_english_summary: Added length validation before memory copy.
AutoPiff создаёт JSON-отчёты, прикрепляемые к образцам в MWDB:
{
"pairing": {
"driver_new": {"sha256": "...", "version": "2.0.9.0"},
"driver_old": {"sha256": "...", "version": "2.0.8.0"},
"decision": "accept",
"confidence": 0.95
},
"semantic_deltas": {
"deltas": [
{
"function": "HandleIoctl",
"rule_id": "null_after_free_added",
"category": "lifetime_fix",
"confidence": 0.88,
"sinks": ["pool_free"],
"final_score": 5.5,
"why_matters": "Pointer is now set to NULL after freeing memory."
}
],
"summary": {
"total_deltas": 1,
"top_score": 5.5,
"match_rate": 100.0
}
}
}
AutoPiff/
├── Docs/ # Проектные документы и спецификации
├── ghidra/scripts/ # Головные скрипты Ghidra
│ └── autopiff_reachability.py # BFS достижимости + экспорт декомпиляции
├── rules/
│ ├── semantic_rules.yaml # 58 правил обнаружения
│ ├── sinks.yaml # 50+ опасных API-символов
│ └── scoring.yaml # Конфигурация модели оценки
├── schemas/ # JSON-схемы для каждого этапа
├── services/
│ ├── karton-patch-differ/ # Этапы 1-4: diff + семантический анализ
│ ├── karton-reachability/ # Этап 5: граф вызовов + декомпиляция
│ ├── karton-ranking/ # Этап 6: оценка
│ ├── karton-report/ # Этап 7: генерация отчёта
│ ├── karton-driver-triage/ # Триаж поверхности атаки DriverAtlas
│ ├── autopiff-alerter/ # Этап 8: оповещения Telegram
│ ├── driver-monitor/ # Этап 0: опрос версий
│ └── dashboard/ # Веб-интерфейс
├── tests/unit/ # 137 модульных тестов
├── docker-compose.yml
└── README.md
AutoPiff разработан для работы с driver_analyzer, который предоставляет полную производственную инфраструктуру (MWDB, Karton, MinIO, дашборды). Файл сборки driver_analyzer напрямую использует сервисы AutoPiff:
# В driver_analyzer/docker-compose.yml
karton-driver-patch-differ:
build:
context: ../AutoPiff
dockerfile: services/karton-patch-differ/Dockerfile
volumes:
- ../AutoPiff/rules:/app/rules:ro
См. README driver_analyzer для инструкций по настройке.
Лицензия MIT — подробнее см. в LICENSE.
| Этап | Ручная работа | С AutoPiff | Сэкономленное время |
|---|
| Сопоставление версий | 5–15 мин/драйвер | Автоматически | ~100% |
| Декомпиляция | 2–10 мин/бинарник | Пакетно, параллельно | ~95% |
| Сопоставление функций | 30–60 мин/пара | Мгновенно | ~100% |
| Выявление изменений безопасности | 2–8 ч/пара | Секунды | ~99% |
| Первичная триаж и ранжирование | 1–2 ч | Мгновенно | ~100% |
| Генерация отчёта | 30–60 мин | Мгновенно | ~100% |
| Этап | Сервис | Что делает |
|---|
| 0 | driver-monitor | Опрашивает WinBIndex и VirusTotal на предмет новых версий драйверов, загружает в MWDB |
| 1–4 | karton-patch-differ | Сопоставление версий, декомпиляция в Ghidra, сопоставление функций, оценка семантических правил |
| 5 | karton-reachability | BFS графа вызовов Ghidra от точек входа IOCTL/IRP до изменённых функций, экспорт полной декомпиляции |
| 6 | karton-ranking | Оценивает результаты с учётом достижимости, семантической серьёзности и поверхности атаки |
| 7 | karton-report | Генерирует структурированные отчёты в Markdown, загружает в MWDB |
| 8 | autopiff-alerter | Отправляет оповещения в Telegram для результатов с оценкой >= 8.0 |
| — | autopiff-driver-triage | Оценка поверхности атаки DriverAtlas (параллельно этапам 1–4), тегирует образцы в MWDB, оповещения в Telegram |
| Категория | Пример обнаружения |
|---|
bounds_check | Добавлена проверка длины перед memcpy |
lifetime_fix | Присвоение NULL после ExFreePool |
user_boundary_check | Добавлен ProbeForRead/ProbeForWrite |
int_overflow | Использование безопасных математических хелперов |
state_hardening | Операции interlocked refcount |
ioctl_input_validation | Новые проверки размера/типа в обработчиках диспетчеризации |
pool_type_hardening | Миграция на NonPagedPoolNx |
privilege_check | Добавлен SeSinglePrivilegeCheck |
| Переменная | Описание | По умолчанию |
|---|
MWDB_API_URL | API-эндпоинт MWDB Core | http://mwdb-core:8080/api/ |
MWDB_API_KEY | API-ключ MWDB для загрузок | (обязательно) |
KARTON_REDIS_HOST | Хост Redis для Karton | karton-redis |
AUTOPIFF_GHIDRA_TIMEOUT | Тайм-аут декомпиляции Ghidra (сек) | 900 |
VT_API_KEY | API-ключ VirusTotal для мониторинга драйверов | (опционально) |
TELEGRAM_BOT_TOKEN | Токен бота Telegram для оповещений | (опционально) |
TELEGRAM_CHAT_ID | Чат Telegram для оповещений | (опционально) |
AUTOPIFF_SCORE_THRESHOLD | Минимальная оценка для оповещений в Telegram | 8.0 |
DRIVERATLAS_SCORE_THRESHOLD | Минимальная оценка поверхности атаки для оповещений триажа | 8.0 |
| Документ | Описание |
|---|
Docs/semantic_rules.md | Спецификация семантических правил: структура правил и что обнаруживает каждая категория |
Docs/SEMANTIC_RULES_REFERENCE.md | Технический справочник движка правил, логики оценки и подсчёта баллов |
Docs/reachability.md | Спецификация тегирования достижимости: BFS графа вызовов от точек входа диспетчеризации |
Docs/reporting.md | Спецификация формата отчёта |
Docs/decisions.md | Журнал проектных решений и обоснований |
rules/semantic_rules.yaml | Все 58 правил обнаружения (YAML) |
rules/sinks.yaml | 50+ опасных API-символов, сгруппированных по категориям |
rules/scoring.yaml | Конфигурация модели оценки |
schemas/ | JSON-схемы для вывода каждого этапа конвейера |