研究ツール · 初回インポート: 2026年4月3日 · ドキュメント改訂: 2026年7月11日
中核哲学 — 外部シグナル
モデル推論の外部で計算された再現可能な観測値に注意を向けさせ、優先度を証明と誤解してはならない。
プロジェクトの状態。 このリポジトリは、実際のLinuxカーネル脆弱性調査のために構築・使用したLLM支援型リサーチハーネスの初期バージョンです。このバージョンは、CVE-2026-31720として公開された脆弱性の発見に使用されました。ハーネスは調査対象の優先順位付けを行いますが、脆弱性を自動的に証明したり、カーネルのセキュリティを保証したりするものではなく、最終的な検証と報告は人間が行います。
Abstract— Linuxカーネルのような大規模なコードベースをLLMにそのまま探索させると、コンテキストが急速に散漫になり、危険なAPIの存在と実際の攻撃可能性が容易に混同されます。Kernel Codex Harnessは、この問題を脆弱性の自動検出ではなく、調査の優先順位決定と状態ベースのオーケストレーションの問題として定義します。このプロジェクトは、LLM推論の外部で計算された再現可能な観測値によってモデルの注意を制御する原則をExternal Signalと呼びます。カーネルパス、userspace境界、lifetime・usercopy・refcount・size関連の静的シグナルと、オプションのsyzbotクラッシュインテリジェンスを組み合わせて候補ファイルをランク付けし、各候補を狭いプロンプトバンドルに変換します。手動レビューと時間予算ベースのオートパイロットは、同じ応答契約とセッション状態を使用します。このハーネスは、実際のLinuxカーネル調査においてUSB gadget audioパスのstack out-of-bounds writeを発見するために使用され、その欠陥はCVE-2026-31720として公開されました。本実装は精密な静的解析ツールではなく、説明可能なヒューリスティックによってLLMの調査範囲を制限するリサーチワークフローであり、すべてのfindingはreachability、invariant break、concrete impactについて人間による再検証を要求します。
Index Terms— Linux kernel, vulnerability research, external signal, LLM orchestration, heuristic prioritization, syzbot, program analysis, Codex.
Linuxカーネルのセキュリティレビューには、2種類の規模の問題があります。第一に、ソースツリー全体は1回のLLMコンテキストで扱うには大きすぎます。第二に、copy_from_user、アロケータ、refcount、lockなどのシグナルは一般的ですが、それ自体が脆弱性を意味するわけではありません。アナリストはまず「どこを見るか」を決定し、その後でuserspace reachabilityと具体的な状態遷移を別途証明する必要があります。
このプロジェクトの中核哲学はExternal Signalです。
LLMが自分でどこを見るかを決定させない。モデル推論の外部にある再現可能なシグナルが注意を配分するが、脆弱性の結論はreachabilityとinvariant evidenceによってのみ決定される。
したがって、ハーネスはモデルにカーネル全体を漠然と探索させません。ファイルを優先順位付けし、一度に1つの調査分岐のみを提供し、結論よりも証拠構造を先に要求します。
External Signalは、LLMが生成した判断ではなく、モデル実行前に決定され、同じソースツリー・profile・保存されたsyzbot JSONから再計算できる観測値です。パス重み、正規表現ヒット、キャッシュされたsyzbot overlapがこれに該当します。このシグナルは候補のランクとプロンプトコンテキストにのみ使用され、verdictやproofに昇格させることはありません。
このドキュメントのExternal Signalはプロジェクト哲学全体を指します。コードのExternalSignalデータモデルは、現在そのうちsyzbot由来のシグナルのみを表現するため、2つの用語の範囲は異なります。
正規表現ヒット、高リスクパス、syzbot overlapはすべて調査順序のためのシグナルです。スコアが高くても、実際の呼び出しパス、権限、カーネルconfig、namespace、デバイスの利用可能性が攻撃者の到達を許可しなければ、セキュリティfindingではありません。
監査は、syscall、ioctl、netlink、procfs、ファイルシステム、BPF、ドライバフックなど、userspaceから始まる境界を最初に確認します。その後で初めてUAF、OOB、refcount、race、info leak、capability checkなどのbug classを評価します。
1つの調査単位は、基本的に1つのファイルと近接するcaller・teardown・free pathに制限されます。モデルが推奨するmanual follow-upは最大2回のみ許可されます。この制限は探索能力を減らすためではなく、検証可能な範囲内で結論を維持するためのものです。
プロンプトは、強いfindingが少なくとも以下の項目を説明することを要求します。
根拠が不十分な場合、モデルは脆弱性を強く主張する代わりに、次に確認する単一のターゲットを返します。これはprompt-level evidence contractであり、現在のパーサーが各証拠の完全性を自動検証するわけではありません。ingestionはverdictとnext targetを正規化するため、最終的な証拠検証は人間の責任です。
初期の調査フローは、Protect AIのvulnhuntrが使用したファイル単位の分析、制限されたコンテキスト拡張、構造化された成果物という発想から出発しました [1]。このプロジェクトでは、これをPythonアプリケーション分析にそのまま適用せず、userspace-reachable kernel surface、カーネルオブジェクトのlifetime、teardown path、syzbot overlapを中心に再設計しました。特に優先順位シグナルと脆弱性証明を分離し、reachabilityをbug classより先に確認することがカーネルハーネスの中核的な設計選択です。
Fig. 1. The External Signal layer turns observations computed before model inference into ranked review units. It allocates attention but does not establish vulnerability proof.
TABLE I — MAJOR MODULE RESPONSIBILITIES
スキャナーはprofileのinclude directory以下の.cと.hファイルを走査します。ファイルfの優先順位スコアは概念的に次のように構成されます。
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
このスコアは確率やexploitabilityの尺度ではありません。各項目は、モデルが最初に確認するファイルを決めるための相対的な順序のみを提供します。現在の実装はすべてのline-level matchを合算し、プロンプトに表示する上位シグナルのみを制限します。同じ結果の再計算は、同じsource tree、profileとキャッシュされたsyzbot JSONを前提とします。syzbot weightはpath・lineヒューリスティックで先に候補となったファイルに事後適用され、syzbot hitだけで新しい候補ファイルを生成することはありません。
主な静的シグナルは以下のとおりです。
ioctl、compat handler、file operation hookcopy_from_user、copy_to_user、__userkmalloc、kzalloc、kvmalloc、キャッシュ割り当てとfree path組み込みプロファイルはdefault、net、fs、io_uring、bpf、driversです。プロファイルはinclude path、pattern、weight、1つのファイルで保持するシグナル数を定義します。カーネル全体に1つのscoring policyを適用する代わりに、サブシステムごとの攻撃面とlifetime特性を反映します。
syzbot-fetchはsyzkallerプロジェクトの公開syzbot bug page [2]からtitle、subsystem、bug type、file:line情報を抽出してJSONキャッシュに保存します。exact file overlapは強いExternal Signalとして、subsystem overlapは弱いExternal Signalとして使用します。live dashboardは変化する可能性があるため、再現単位はfetch時点の保存済みJSONです。クラッシュ情報はvariant huntingの出発点に過ぎず、新しい脆弱性の証拠として扱いません。
scanはランク付けされたcandidate manifestと上位prompt bundleを生成します。各プロンプトはtarget path、score reason、line signal、syzbot contextと監査手順を含みます。
モデル応答は次のverdictのいずれかに正規化されます。
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_context応答は1つのSingle best next targetと短いsummaryを含みます。pending targetのない古い応答は新しいターゲットに接続せず、別途archiveします。
git clone https://github.com/foxirain/linux-kernel-codex-harness.git
cd linux-kernel-codex-harness
python3 -m venv .venv
source .venv/bin/activate
python -m pip install .
組み込みprofile JSONはwheelに含まれます。外部JSONルールは--config /path/to/profile.jsonで渡すことができます。
# 1. Create a ranked session.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 2. Inspect high-priority candidates.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
# 3. Render one focused prompt.
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
--limitはmanifestに保持するcandidate数で、--topは最初に事前生成するprompt bundle数です。それ以降のrankのbundleも要求時に生成できます。
kernel-harness autopilot artifacts/session-YYYYMMDDTHHMMSSZ \
--duration 30m \
--per-run-timeout 10m \
--include-snippet
デフォルトのsandboxはread-onlyです。分析過程でファイルの変更がどうしても必要な場合にのみ--sandbox workspace-writeを明示する必要があります。
kernel-harness syzbot-fetch https://syzkaller.appspot.com/upstream \
--out artifacts/syzbot/upstream.json \
--limit 50
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 # present while a response is pending
├── bundles/
│ ├── <rank>-<target>.md
│ └── <rank>-<target>.snippet.txt
├── responses/
└── autopilot/
├── AUTOPILOT_STATUS.txt
├── AUTOPILOT_PROGRESS.txt
├── AUTOPILOT_FINDINGS.txt
├── prompts/
├── exec/
└── findings/
このバージョンは概念実証に留まらず、実際のLinuxカーネル脆弱性調査に使用されました。
TABLE II — DISCLOSED VULNERABILITY OUTCOME
| Public outcome | Affected area | Severity / CVSS | Vulnerability |
|---|
CVE-2026-31720: NVD CVSS 3.1 · 7.8 High · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H検証は検出精度のベンチマークではなく、実装の回帰と配布可能性に焦点を当てます。
TABLE III — ENGINEERING VERIFICATION SCOPE
python -m unittest discover -s tests -v
GitHub Actionsはunit regressionを実行した後、wheelを新しい環境にインストールし、default profile scanをsmoke-testします。上記の公開事例は実際の調査で得られたoperational outcomeですが、代表的なLinux tree corpusで測定したprecision、recall、またはCVE discovery rate benchmarkではありません。
read-only sandboxを維持することを推奨します。--dangerously-bypass-approvals-and-sandboxを使用しないでください。Git historyに記録された最初のバージョンから、目標は「LLMが脆弱性を自動的に見つけること」よりも「どのコードを最初に見て、どの証拠を要求するかを制御すること」に近いものでした。CVE-2026-31720を発見したv1-assisted調査は、狭いinvestigation unitとevidence contractが実際の研究に適用された事例を提供しました。v2はこのworkflowを、repository stateとknown referenceを一緒に保存するprovenance-aware triageまで拡張しました。今もう一度実装するなら、以下を優先します。
reviewとrunnerレイヤー分離によるCLI/autopilotの重複排除、それでも維持したい中心原則はExternal Signalです。LLMにコードベース全体を漠然と探索させず、モデル外部のシグナルで絞り込んだ調査単位をreachabilityとinvariant中心で反復する。
Kernel Codex HarnessはLinuxカーネル脆弱性検出を代替しません。代わりにExternal Signalを説明可能なランクに変換し、LLMレビューを短く状態のある調査プロセスに制限します。この構造は実際の調査でCVE-2026-31720の発見に使用されました。プロジェクトの中核的な成果は新しい分析アルゴリズムを主張することではなく、LLMセキュリティレビューをexternal-signal attention allocation、evidence contract、reproducible orchestrationの問題として定義し、実戦的な研究ワークフローに適用したことにあります。
.
├── .github/workflows/ci.yml
├── docs/
│ ├── assets/kernel-harness-architecture.svg
│ ├── AUTOPILOT.md
│ ├── CODEX_CLI.md
│ ├── CODEX_WORKFLOW.md
│ └── SYZBOT.md
├── kernel_harness/
│ ├── resources/
│ │ ├── linux-kernel-default.json
│ │ └── profiles/
│ ├── autopilot.py
│ ├── bundle.py
│ ├── cli.py
│ ├── ingest.py
│ ├── models.py
│ ├── prompting.py
│ ├── session.py
│ ├── syzbot.py
│ └── targeting.py
├── tests/test_regressions.py
├── README.md
└── pyproject.toml
詳細な運用手順はdocs/で確認できます。
[1] Protect AI, “vulnhuntr,” GitHub repository. https://github.com/protectai/vulnhuntr
[2] Google, “syzkaller and syzbot,” GitHub repository. https://github.com/google/syzkaller
[3] OpenAI, “Codex CLI.” https://developers.openai.com/codex/cli/
Licensed under the Apache License 2.0.
| Module | Responsibility |
|---|
targeting.py | カーネルファイルの探索とパス・パターン・syzbotシグナルのスコアリング |
models.py | Candidate、Signalとsyzbot由来のExternalSignalデータモデル |
bundle.py | manifest、session index、prompt/snippet bundleの生成 |
prompting.py | reachabilityとinvariant中心のカーネル監査プロンプト |
session.py | pending review、history、follow-up depth状態の保存 |
ingest.py | strict verdictとnext targetの正規化 |
autopilot.py | 時間予算ベースのcodex exec、ログ、archive、finding管理 |
syzbot.py | 公開syzbotページの収集とローカルJSONキャッシュの生成 |
cli.py | scan、inspect、codex、loop、autopilotなどのコマンド接続 |
| Investigation model |
|---|
| CVE-2026-31720 | USB gadget audio · drivers/usb/gadget/function/f_uac1_legacy.c | Host-controlled request length could overflow a four-byte stack object | Finding surfaced during a v1-assisted investigation; validation and disclosure remained human-led |
| Verification item | Expected property |
|---|
| Allocator regression | kmallocとkvmallocをallocator signalとして検出 |
| Profile resources | source checkoutで6つのbuilt-in profileをロード、installed wheelでdefault profile smoke-test |
| Verdict contract | not_cve_candidateをpositive findingと誤認しない |
| Follow-up policy | 2回のmanual follow-upを許可、3回目の要求をブロック |
| Stale response handling | pending targetのない応答をarchiveし再利用しない |
| Safe default | autopilot sandboxのデフォルトがread-only |
| CI matrix | Python 3.11と3.12でregression suiteを実行 |