
Инструмент исследования уязвимостей ядра Linux с учётом происхождения данных, использованный при расследовании CVE-2026-53075
Исследовательский инструмент · Первичный импорт: 3 апреля 2026 г. · Редакция документации v2: 11 июля 2026 г.
Внешний сигнал: от распределения внимания к триажу с учётом происхождения
Используйте воспроизводимые наблюдения для направления внимания модели, затем используйте происхождение репозитория для организации очередей проверки — но никогда для доказательства.
Происхождение проекта — Kernel Codex Harness v1 · Распределение внимания → Kernel Codex Harness v2 · Триаж с учётом происхождения
Статус проекта. Этот репозиторий представляет собой исследовательский харнес с поддержкой LLM, который развивает workflow распределения внимания из v1 до триажа с учётом происхождения для реального исследования уязвимостей ядра Linux. Эта версия использовалась для обнаружения уязвимости, опубликованной как CVE-2026-53075. Это не автоматический детектор уязвимостей, не оценщик новизны, не валидатор эксплойтов и не инструмент гарантии безопасности ядра; окончательная проверка и отчётность выполняются человеком.
Аннотация — Если позволить LLM напрямую исследовать такую большую кодовую базу, как ядро Linux, контекст распыляется, а наличие опасных API легко спутать с реальной эксплуатируемостью. Kernel Codex Harness v2 определяет эту проблему как обработку двухэтапного внешнего сигнала. До вызова модели весовые коэффициенты путей, лексические совпадения и кэшированное пересечение с syzbot ранжируют файлы-кандидаты для распределения внимания. После ответа модели Git-ветка, HEAD, состояние dirty и извлечённые из ответа CVE, commit и известные маркеры объединяются для классификации сильных находок в корзины проверки с учётом происхождения. Этот харнес использовался в реальном исследовании ядра Linux и обнаружил дефект проверки прав доступа к целевому сетевому пространству имён PPP, который был опубликован как CVE-2026-53075. Триаж — это эвристика для упорядочивания очереди исследования; в частности, new_candidate означает лишь то, что не было обнаружено известных подсказок или проблем с происхождением, а не доказательство новизны. Все находки требуют повторной проверки человеком на достижимость из userspace, нарушение инвариантов и конкретное воздействие.
Ключевые термины — ядро Linux, исследование уязвимостей, внешний сигнал, происхождение, эвристический триаж, оркестрация LLM, syzbot, Codex.
При проверке безопасности ядра существует два различных типа неопределённости.
Центральной проблемой v1 была первая — распределение внимания. v2 сохраняет этот принцип и расширяет его до триажа с учётом происхождения для второй проблемы. Обе версии использовались в реальных исследованиях: исследование с поддержкой v1 привело к CVE-2026-31720, а исследование с поддержкой v2 — к CVE-2026-53075.
Наблюдения вне модели сужают область исследования, а после ответа модели добавляется проверяемое происхождение репозитория. Ни один из сигналов на любом этапе не доказывает уязвимость или новизну.
Внешний сигнал до вывода — это не суждение LLM, а наблюдения, вычисляемые до запуска модели.
При использовании одного и того же дерева исходников, профиля и кэшированного JSON syzbot ранжирование кандидатов можно пересчитать. Эта оценка — не вероятность и не эксплуатируемость, а относительный порядок того, что смотреть первым.
Пост-выводный этап объединяет сильный вердикт модели со следующей информацией.
В этом документе пост-выводный внешний сигнал относится только к происхождению, собранному независимо от модели: Git-репозиторий/состояние, ветка, HEAD, состояние dirty, локальная родословная commit. CVE, commit и известные маркеры — это ссылки, полученные из модели, извлечённые из ответа модели, а не внешний сигнал или авторитетный факт. Триаж объединяет оба типа входных данных, но фиксирует их источники раздельно.
Сильные находки операционно распределяются по следующим корзинам проверки.
| Корзина | Значение |
|---|---|
new_candidate | Кандидат с подтверждённым происхождением и без обнаруженных dirty/известных блокирующих сигналов |
known_issue | Кандидат с неотрицаемой известной ссылкой или подтверждённым commit, который ответ относит к fix/upstream и который присутствует в текущем HEAD |
dirty_tree_suspect | Кандидат, на который нельзя исключить влияние dirty репозитория или dirty цели |
provenance_unknown | Кандидат, для которого не удалось надёжно подтвердить Git-репозиторий, состояние или HEAD |
Для всех результатов классификации novelty_proven равно false. new_candidate означает не «новая уязвимость», а очередь для приоритетного продолжения исследования новизны человеком.
Аудит сначала проверяет границы, начинающиеся из userspace: syscall, ioctl, netlink, procfs, файловые системы, BPF, хуки драйверов. Только после этого оцениваются классы ошибок: UAF, OOB, refcount, race, info leak, проверка capability.
Одна единица исследования ограничена одним файлом и близкими путями caller, teardown и free. Ручные follow-up, предлагаемые моделью, ограничены максимум двумя, чтобы сохранять проверяемые короткие пути вместо широкого исследования.
Сильная находка должна как минимум описывать следующее.
Парсер нормализует вердикт и следующую цель, но не доказывает автоматически полноту этих доказательств.
Первоначальный поток основан на идеях пофайлового анализа, ограниченного расширения контекста и структурированных результатов, использованных в vulnhuntr от Protect AI [1]. В этом проекте они переработаны под достижимую из userspace поверхность ядра, время жизни объектов ядра, пути teardown и пересечение с syzbot. Дополнительный вклад v2 — этап триажа находок с использованием происхождения репозитория после распределения внимания.
Рис. 1. Внешний сигнал до вывода ранжирует воспроизводимые единицы проверки. Пост-выводный триаж объединяет независимое от модели происхождение Git со ссылками из ответа модели, не рассматривая последние как внешний сигнал или авторитетный факт. Проверка человеком остаётся вне обоих автоматизированных этапов.
ТАБЛИЦА I — ОТВЕТСТВЕННОСТЬ ОСНОВНЫХ МОДУЛЕЙ
| Модуль | Ответственность |
|---|---|
targeting.py | Обход файлов ядра и оценка сигналов path, lexical и syzbot |
models.py | Candidate, Signal, производный от syzbot ExternalSignal |
bundle.py | Создание manifest, индекса сессии, пакета prompt/snippet |
prompting.py | Промпты аудита ядра с фокусом на достижимость и инварианты |
session.py | Состояние ожидающих проверок, истории и глубины follow-up |
ingest.py | Нормализация строгого вердикта и единственной следующей цели |
repo_state.py | Сбор ветки Git, HEAD, состояния, dirty-путей и родословной |
finding_triage.py | Эвристическая классификация по корзинам на основе происхождения и известных ссылок |
autopilot.py | Выполнение Codex с бюджетом времени, ingest, архивирование, запись находок |
syzbot.py | Сбор публичного HTML syzbot и создание локального JSON-кэша |
cli.py | Связывание команд scan/review/doctor/autopilot |
Сканер обходит файлы .c и .h в каталогах include профиля.
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
Текущая реализация суммирует совпадения на уровне строк и ограничивает лишь количество верхних сигналов, отображаемых в промпте. Оценка определяет порядок исследования модели, но не является статистической величиной, скорректированной на вероятность уязвимости.
Основные статические сигналы:
__user| Профиль | Фокус |
|---|---|
default | Точки входа kernel/mm/net/fs/security/io_uring/lib/drivers |
net | netlink, socket, skb, XDP |
fs | ioctl, procfs, seq_file, debugfs |
io_uring | Время жизни асинхронных запросов и teardown |
bpf | verifier, время жизни map/program, BTF |
drivers | ioctl, DMA, MMIO и teardown драйверов |
syzbot-fetch извлекает из публичных страниц ошибок syzbot заголовок, подсистему, тип ошибки и file:line и сохраняет их в JSON. Точное пересечение файлов — сильный сигнал ранжирования, пересечение подсистем — слабый. Живая панель может меняться, поэтому единицей воспроизведения является сохранённый JSON на момент выборки. Пересечение сбоев — это подсказка для поиска вариантов, а не доказательство уязвимости.
scan создаёт полный ранжированный manifest кандидатов и пакет верхних промптов. --limit — это количество кандидатов, сохраняемых в manifest, а --top — количество пакетов, создаваемых заранее. Остальные ранги можно создавать по запросу.
Ответ модели нормализуется до одного из следующих вердиктов.
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextРучная проверка и autopilot используют один и тот же review_state.json, фиксированный путь ответа и парсер вердиктов.
doctor и autopilot проверяют, является ли каталог Git-репозиторием, успешно ли собрано состояние, а также ветку, HEAD и dirty-пути. Состояние, в котором происхождение не может быть установлено, не считается чистым, а сохраняется как provenance_unknown.
Триаж сильного вердикта примерно следует следующему приоритету.
provenance_unknown,dirty_tree_suspect,known_issue,new_candidate.Выражения отрицания или несвязанности, такие как «not a known issue», «unrelated to CVE-…», не используются как основание для known. В окончательном решении сохраняются исходный вердикт вместе с веткой, HEAD, состоянием, dirty-состоянием, совпавшей ссылкой и причиной.
Текущая классификация по корзинам с учётом происхождения и JSONL-запись применяются в пути ingest autopilot. Ручные loop и ingest используют то же базовое состояние сессии и парсер вердиктов, но не создают артефакты корзин.
Зависимости среды выполнения Python — только стандартная библиотека.
git clone https://github.com/foxirain/linux-kernel-codex-harness-v2.git
cd linux-kernel-codex-harness-v2
python3 -m venv .venv
source .venv/bin/activate
python -m pip install .
kernel-harness --help
Встроенные JSON-профили включены в wheel. Дополнительные правила можно передать через --config /path/to/profile.json.
# 1. Проверьте происхождение репозитория.
kernel-harness doctor /path/to/linux
# 2. Создайте ранжированную сессию.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 3. Просмотрите и отобразите одну сфокусированную проверку.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
Ручной ответ Codex сохраняется в codex_response.txt, как указано в runbook, после чего его можно ingest следующей командой.
kernel-harness loop artifacts/session-YYYYMMDDTHHMMSSZ --include-snippet
kernel-harness status artifacts/session-YYYYMMDDTHHMMSSZ
kernel-harness autopilot artifacts/session-YYYYMMDDTHHMMSSZ \
--duration 30m \
--per-run-timeout 10m \
--include-snippet \
--require-clean-tree \
--stop-on-finding
Песочница Codex по умолчанию — read-only. --require-clean-tree разрешает выполнение только если Git-репозиторий, состояние и HEAD подтверждены, а рабочее дерево чистое. --stop-on-finding останавливается только когда результат эвристического триажа — new_candidate.
kernel-harness syzbot-fetch https://syzkaller.appspot.com/upstream \
--out artifacts/syzbot/upstream.json \
--limit 50
kernel-harness syzbot-stats artifacts/syzbot/upstream.json --top 15
kernel-harness scan /path/to/linux \
--profile fs \
--syzbot-json artifacts/syzbot/upstream.json \
--out artifacts
artifacts/session-<timestamp>/
├── SESSION.md
├── targets.json
├── finding_template.json
├── review_state.json
├── codex_response.txt # существует, когда ответ ожидает обработки
├── bundles/
├── responses/
└── autopilot/
├── AUTOPILOT_STATUS.txt
├── AUTOPILOT_PROGRESS.txt
├── AUTOPILOT_BASELINE.json
├── AUTOPILOT_FINDINGS.txt
├── AUTOPILOT_FINDINGS_NEW.txt
├── AUTOPILOT_KNOWN_ISSUES.txt
├── AUTOPILOT_SUSPECTS.txt
├── AUTOPILOT_PROVENANCE_UNKNOWN.txt
├── AUTOPILOT_FINDINGS.jsonl
├── prompts/
├── exec/
├── parse_errors/
└── findings/
├── new/
├── known/
├── suspects/
└── unknown/
AUTOPILOT_FINDINGS.jsonl сохраняет вердикт, корзину, причину, ветку, HEAD, состояние происхождения, совпавшую ссылку и пути находки/архива в форме, пригодной для постобработки.
v2 применил расширенную архитектуру к реальному исследованию уязвимостей ядра Linux.
ТАБЛИЦА II — ОПУБЛИКОВАННЫЙ РЕЗУЛЬТАТ ПО УЯЗВИМОСТИ
| Публичный результат | Затронутая область | Серьёзность / CVSS | Уязвимость | Модель исследования |
|---|---|---|---|---|
| CVE-2026-53075 | PPP · drivers/net/ppp/ppp_generic.c | Непривязанным административным ioctl не хватало проверки CAP_NET_ADMIN против пользовательского пространства имён, владеющего целевым сетевым пространством имён | Находка выявлена в ходе исследования с поддержкой v2; проверка и раскрытие оставались под руководством человека |
CVE-2026-53075: запись CVE Linux CNA · CVSS 3.1 · 8.8 High · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H16 регрессионных тестов сосредоточены не на точности обнаружения безопасности, а на программном контракте и развёртываемости.
python -m unittest discover -s tests -v
python -m pip wheel . --no-deps --wheel-dir dist
python -m pip install --force-reinstall dist/*.whl
GitHub Actions запускает регрессионные тесты на Python 3.11 и 3.12, устанавливает wheel и выполняет smoke-тест 6 упакованных профилей и сканирования по умолчанию. Приведённый выше публичный случай — это операционный результат реального исследования, а не benchmark точности, полноты, эксплуатируемости или скорости обнаружения CVE, измеренный на репрезентативном корпусе деревьев Linux.
read-only, и её рекомендуется сохранять.doctor, затем --require-clean-tree.--dangerously-bypass-approvals-and-sandbox не следует использовать вне изолированной экспериментальной среды.new_candidate, ни known_issue не являются окончательным определением новизны.v1 (репозиторий) был сосредоточен на распределении внимания LLM с помощью внешнего сигнала и использовался в реальном исследовании с поддержкой v1, которое привело к обнаружению CVE-2026-31720. v2 продолжает ту же исследовательскую философию и расширяет её так, чтобы после сильной находки модели также фиксировались состояние репозитория и ссылки из ответа. В последующем исследовании с использованием этой архитектуры был обнаружен CVE-2026-53075.
v1: наблюдения исходников → ранжирование → сфокусированная проверка
v2: наблюдения исходников → ранжирование → сфокусированная проверка → триаж с учётом происхождения
В этой эволюции необходимо сохранить два принципа.
Если бы расширение проводилось сейчас, приоритетами были бы граф вызовов Clang/tree-sitter, нормализация оценок, версионированный manifest и межпроцессная блокировка состояния, адаптер авторитетной базы CVE/исправлений, а также разделение runner, triage и записи артефактов. Текущая запись состояния использует временные файлы и атомарную замену.
Kernel Codex Harness v2 не заменяет обнаружение уязвимостей. Внешний сигнал до вызова модели распределяет исследовательский бюджет по объяснимым кандидатам, а сигнал происхождения после вызова модели организует сильные находки в проверяемые очереди. Эта архитектура использовалась в реальном исследовании для обнаружения CVE-2026-53075, и ключевой результат проекта — не алгоритм автоматического определения новизны, а боевой workflow проверки безопасности с LLM, явно разделяющий распределение внимания и триаж с учётом происхождения.
.
├── .github/workflows/ci.yml
├── docs/
│ ├── assets/kernel-harness-v2-architecture.svg
│ ├── AUTOPILOT.md
│ ├── CODEX_CLI.md
│ ├── CODEX_WORKFLOW.md
│ └── SYZBOT.md
├── kernel_harness/
│ ├── resources/
│ │ ├── linux-kernel-default.json
│ │ └── profiles/
│ │ ├── bpf.json
│ │ ├── drivers.json
│ │ ├── fs.json
│ │ ├── io_uring.json
│ │ └── net.json
│ ├── __init__.py
│ ├── __main__.py
│ ├── autopilot.py
│ ├── bundle.py
│ ├── cli.py
│ ├── finding_triage.py
│ ├── ingest.py
│ ├── models.py
│ ├── prompting.py
│ ├── repo_state.py
│ ├── session.py
│ ├── syzbot.py
│ └── targeting.py
├── tests/test_regressions.py
├── .gitignore
├── README.md
└── pyproject.toml
Подробное ручное управление описано в руководстве по Codex CLI, автоматическое выполнение и триаж — в руководстве по Autopilot, а информация о сбоях — в руководстве по syzbot.
[1] Protect AI, «vulnhuntr», репозиторий GitHub. https://github.com/protectai/vulnhuntr
[2] Google, «syzkaller and syzbot», репозиторий GitHub. https://github.com/google/syzkaller
[3] OpenAI, «Codex CLI». https://developers.openai.com/codex/cli/
Лицензировано по Apache License 2.0.