
Provenance-bewusster Linux-Kernel-Schwachstellenforschungs-Harness, der bei der Untersuchung von CVE-2026-53075 verwendet wird.
Forschungswerkzeug · Originalimport: 3. April 2026 · v2-Dokumentationsrevision: 11. Juli 2026
Externes Signal: Von der Aufmerksamkeitsverteilung zum Provenienz-bewussten Triage
Reproduzierbare Beobachtungen nutzen, um die Modellaufmerksamkeit zu lenken, und anschließend die Repository-Provenienz nutzen, um Review-Warteschlangen zu organisieren – niemals, um einen Beweis zu beanspruchen.
Projektlinie— Kernel Codex Harness v1 · Aufmerksamkeitsverteilung → Kernel Codex Harness v2 · Provenienz-bewusstes Triage
Projektstatus. Dieses Repository ist ein LLM-gestützter Forschungs-Harness, der den Attention-Allocation-Workflow von v1 für reale Linux-Kernel-Schwachstellenuntersuchungen zu einem Provenienz-bewussten Triage weiterentwickelt. Diese Version wurde verwendet, um die als CVE-2026-53075 veröffentlichte Schwachstelle zu finden. Es ist kein automatischer Schwachstellendetektor, kein Neuheitsbewerter, kein Exploit-Verifizierer und kein Kernel-Sicherheitsgarantie-Werkzeug; die endgültige Validierung und Berichterstattung erfolgt durch Menschen.
Abstract— Wenn man LLMs eine so große Codebasis wie den Linux-Kernel direkt durchsuchen lässt, wird der Kontext zerstreut und die Existenz gefährlicher APIs wird leicht mit tatsächlicher Ausnutzbarkeit verwechselt. Kernel Codex Harness v2 definiert dieses Problem als zweistufige Externe-Signal-Verarbeitung. Vor dem Modellaufruf werden Kandidatendateien anhand von Pfadgewichten, lexikalischen Treffern und gecachtem syzbot-Overlap priorisiert, um die Aufmerksamkeit zu verteilen. Nach der Modellantwort werden Git-Branch, HEAD und Dirty-State mit aus der Antwort extrahierten CVE-, Commit- und bekannten Markern kombiniert, um starke Befunde in Provenienz-bewusste Review-Buckets zu klassifizieren. Dieser Harness wurde in einer realen Linux-Kernel-Untersuchung verwendet, um einen Validierungsfehler der Ziel-Netzwerk-Namespace-Berechtigung von PPP zu finden, der als CVE-2026-53075 veröffentlicht wurde. Triage ist eine Heuristik zur Organisation von Untersuchungswarteschlangen; insbesondere bedeutet new_candidate nur, dass keine bekannten Hinweise oder Provenienzprobleme gefunden wurden, nicht einen Neuheitsbeweis. Alle Befunde erfordern eine menschliche Revalidierung von Userspace-Erreichbarkeit, Invariantenbruch und konkreter Auswirkung.
Indexbegriffe— Linux-Kernel, Schwachstellenforschung, externes Signal, Provenienz, heuristisches Triage, LLM-Orchestrierung, syzbot, Codex.
Die Sicherheitsüberprüfung des Kernels umfasst zwei verschiedene Arten von Unsicherheit.
Das zentrale Problem von v1 war das erste, nämlich die Aufmerksamkeitsverteilung. v2 behält dieses Prinzip bei und erweitert das zweite Problem um ein Provenienz-bewusstes Triage. Beide Versionen wurden jeweils in realen Untersuchungen eingesetzt; die v1-gestützte Untersuchung führte zu CVE-2026-31720, die v2-gestützte Untersuchung zu CVE-2026-53075.
Beobachtungen außerhalb des Modells grenzen den Untersuchungsumfang ein, und nach der Modellantwort wird eine verifizierbare Repository-Provenienz hinzugefügt. Kein Signal in irgendeiner Phase beweist eine Schwachstelle oder Neuheit.
Pre-Inferenz-Externe-Signale sind Beobachtungen, die vor der Modellausführung berechnet werden, nicht LLM-Urteile.
Mit demselben Quellbaum, Profil und gecachten syzbot-JSON-Daten kann das Kandidaten-Ranking neu berechnet werden. Diese Punktzahl ist keine Wahrscheinlichkeit oder Ausnutzbarkeit, sondern eine relative Reihenfolge, wo man zuerst hinschauen sollte.
Die Post-Inferenz-Phase kombiniert ein starkes Modellurteil mit den folgenden Informationen.
In diesem Dokument bezieht sich Post-Inferenz-Externes Signal nur auf Provenienz, die unabhängig vom Modell gesammelt wurde, wie Git-Repository/Status, Branch, HEAD, Dirty-State und lokale Commit-Abstammung. CVE-, Commit- und bekannte Marker sind modellabgeleitete Referenzen, die aus der Modellantwort extrahiert wurden, und kein externes Signal oder autoritative Tatsache. Triage kombiniert beide Arten von Eingaben, zeichnet aber deren Quellen getrennt auf.
Starke Befunde werden betrieblich in einen der folgenden Review-Buckets eingeordnet.
| Bucket | Bedeutung |
|---|---|
new_candidate | Kandidat, dessen Provenienz bestätigt wurde und bei dem keine Dirty-/bekannten Blockiersignale gefunden wurden |
known_issue | Kandidat mit nicht-negierter bekannter Referenz oder bestätigtem Commit, den die Antwort als Fix/Upstream-Beziehung identifiziert und der im aktuellen HEAD enthalten ist |
dirty_tree_suspect | Kandidat, bei dem der Einfluss eines Dirty-Repositorys oder Dirty-Ziels nicht ausgeschlossen werden kann |
provenance_unknown | Kandidat, dessen Git-Repository, Status oder HEAD nicht zuverlässig verifiziert werden konnte |
novelty_proven ist für alle Klassifizierungsergebnisse false. new_candidate bedeutet nicht „neue Schwachstelle“, sondern eine Warteschlange, in der Menschen zuerst die Neuheitsuntersuchung fortsetzen sollten.
Die Prüfung identifiziert zuerst Grenzen, die vom Userspace ausgehen, wie syscall, ioctl, netlink, procfs, Dateisystem, BPF und Driver-Hooks. Erst danach werden Bug-Klassen wie UAF, OOB, refcount, race, info leak und capability check bewertet.
Eine Untersuchungseinheit ist auf eine Datei und deren nahe Caller-, Teardown- und Free-Pfade beschränkt. Manuelle Follow-ups, die das Modell vorschlägt, sind auf maximal zwei begrenzt, um einen verifizierbaren kurzen Pfad statt einer breiten Erkundung beizubehalten.
Ein starker Befund muss mindestens Folgendes erklären.
Der Parser normalisiert nur Urteil und nächstes Ziel; er beweist nicht automatisch die Vollständigkeit dieser Beweise.
Der anfängliche Ablauf stammt aus der Idee der dateibasierten Analyse, des begrenzten Kontexterweiterung und der strukturierten Ergebnisse, die Protect AIs vulnhuntr verwendet [1]. In diesem Projekt wurde dies für die userspace-erreichbare Kernel-Oberfläche, die Kernel-Objekt-Lebensdauer, Teardown-Pfade und syzbot-Overlap neu gestaltet. Der zusätzliche Beitrag von v2 ist die Platzierung einer Finding-Triage-Stufe auf Basis der Repository-Provenienz nach der Aufmerksamkeitsverteilung.
Abb. 1. Pre-Inferenz-Externe-Signale ordnen reproduzierbare Untersuchungseinheiten. Post-Inferenz-Triage kombiniert modellunabhängige Git-Provenienz mit modellabgeleiteten Antwortreferenzen, ohne letztere als externes Signal oder autoritative Tatsache zu behandeln. Die menschliche Validierung bleibt außerhalb beider automatisierter Stufen.
TABELLE I — HAUPTMODULVERANTWORTLICHKEITEN
| Modul | Verantwortlichkeit |
|---|---|
targeting.py | Kernel-Dateisuche und Bewertung von Pfad-, Lexikal- und syzbot-Signalen |
models.py | Candidate, Signal, syzbot-abgeleitetes ExternalSignal |
bundle.py | Manifest-, Sitzungsindex-, Prompt-/Snippet-Bundle-Erstellung |
prompting.py | Kernel-Prüf-Prompts mit Fokus auf Erreichbarkeit und Invarianten |
session.py | Speicherung von ausstehenden Reviews, Verlauf und Follow-up-Tiefe |
ingest.py | Normalisierung von striktem Urteil und einzelnem nächsten Ziel |
repo_state.py | Erfassung von Git-Branch, HEAD, Status, Dirty-Pfad und Abstammung |
finding_triage.py | Heuristische Bucket-Klassifizierung basierend auf Provenienz und bekannten Referenzen |
autopilot.py | Zeitbudget-basierte Codex-Ausführung, Ingest, Archivierung und Finding-Protokollierung |
syzbot.py | Erfassung öffentlicher syzbot-HTML-Seiten und Erstellung lokaler JSON-Caches |
cli.py | Verbindung der Befehle scan/review/doctor/autopilot |
Der Scanner durchläuft .c- und .h-Dateien unter den Include-Verzeichnissen des Profils.
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
Die aktuelle Implementierung summiert Zeilenebenen-Treffer und begrenzt nur die Anzahl der Top-Signale, die im Prompt angezeigt werden. Die Punktzahl bestimmt die Untersuchungsreihenfolge des Modells, ist aber kein statistischer Wert, der die Schwachstellenwahrscheinlichkeit kalibriert.
Die wichtigsten statischen Signale sind:
__user| Profil | Fokus |
|---|---|
default | Startpunkte in kernel/mm/net/fs/security/io_uring/lib/drivers |
net | netlink, socket, skb, XDP |
fs | ioctl, procfs, seq_file, debugfs |
io_uring | Asynchrone Request-Lebensdauer und Teardown |
bpf | Verifier, Map-/Programm-Lebensdauer, BTF |
drivers | ioctl, DMA, MMIO und Driver-Teardown |
syzbot-fetch extrahiert Titel, Subsystem, Bug-Typ und Datei:Zeile aus öffentlichen syzbot-Bug-Seiten und speichert sie als JSON. Exakter Datei-Overlap ist ein starkes Ranking-Signal, Subsystem-Overlap ein schwaches Signal. Da das Live-Dashboard variieren kann, ist die reproduzierbare Einheit das zum Abrufzeitpunkt gespeicherte JSON. Crash-Overlap ist ein Hinweis für die Variantenjagd, kein Schwachstellenbeweis.
scan erstellt ein vollständiges, sortiertes Kandidaten-Manifest und ein Top-Prompt-Bundle. --limit ist die Anzahl der Kandidaten, die im Manifest verbleiben, und --top die Anzahl der vorab erstellten Bundles. Weitere Ränge können bei Bedarf erstellt werden.
Die Modellantwort wird in eines der folgenden Urteile normalisiert.
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextManuelles Review und Autopilot verwenden dieselbe review_state.json, denselben festen Antwortpfad und denselben Urteils-Parser.
doctor und Autopilot prüfen, ob ein Git-Repository vorhanden ist, ob die Status-Erfassung erfolgreich war, sowie Branch, HEAD und Dirty-Pfade. Zustände, in denen die Provenienz nicht bestätigt werden kann, werden nicht als sauber betrachtet, sondern als provenance_unknown beibehalten.
Das Triage starker Urteile folgt ungefähr der folgenden Priorität.
provenance_unknown,dirty_tree_suspect,known_issue,new_candidate.Negations- oder Nicht-verwandte-Ausdrücke wie „kein bekanntes Problem“ oder „nicht verwandt mit CVE-…“ werden nicht als bekannte Grundlage verwendet. Die endgültige Entscheidung enthält zusammen mit dem ursprünglichen Urteil Branch, HEAD, Status, Dirty-State, übereinstimmende Referenz und Grund.
Die aktuelle Provenienz-bewusste Bucket-Klassifizierung und der JSONL-Writer werden auf den Autopilot-Ingest-Pfad angewendet. Manuelle loop- und ingest-Befehle verwenden denselben zugrunde liegenden Sitzungszustand und Urteils-Parser, erstellen jedoch keine Bucket-Artefakte.
Die Python-Laufzeitabhängigkeiten umfassen nur die Standardbibliothek.
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
Die integrierten Profil-JSON-Dateien sind im Wheel enthalten. Zusätzliche Regeln können mit --config /path/to/profile.json übergeben werden.
# 1. Repository-Provenienz verifizieren.
kernel-harness doctor /path/to/linux
# 2. Eine sortierte Sitzung erstellen.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 3. Ein fokussiertes Review inspizieren und rendern.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
Manuelle Codex-Antworten werden in der vom Runbook festgelegten Datei codex_response.txt gespeichert und können dann mit dem folgenden Befehl übernommen werden.
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
Der Codex-Sandbox-Standardwert ist read-only. --require-clean-tree erlaubt die Ausführung nur, wenn Git-Repository, Status und HEAD bestätigt sind und der Arbeitsbaum sauber ist. --stop-on-finding stoppt nur, wenn das heuristische Triage-Ergebnis new_candidate ist.
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 # vorhanden, wenn eine Antwort aussteht
├── 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 bewahrt Urteil, Bucket, Grund, Branch, HEAD, Provenienzstatus, übereinstimmende Referenz sowie Finding-/Archivpfade in einer nachverarbeitbaren Form.
v2 wurde mit der erweiterten Struktur auf eine reale Linux-Kernel-Schwachstellenuntersuchung angewendet.
TABELLE II — VERÖFFENTLICHTES SCHWACHSTELLENERGEBNIS
| Öffentliches Ergebnis | Betroffener Bereich | Schweregrad / CVSS | Schwachstelle | Untersuchungsmodell |
|---|---|---|---|---|
| CVE-2026-53075 | PPP · drivers/net/ppp/ppp_generic.c | Nicht zugeordnete administrative ioctls entbehrten einer CAP_NET_ADMIN-Prüfung gegen den Benutzer-Namespace, der den Ziel-Netzwerk-Namespace besitzt | Befund während einer v2-gestützten Untersuchung aufgetaucht; Validierung und Offenlegung blieben menschengeführt |
CVE-2026-53075: Linux-CNA-CVE-Datensatz · CVSS 3.1 · 8.8 Hoch · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:HDie 16 Regressionstests konzentrieren sich nicht auf einen Benchmark zur Genauigkeit der Sicherheitserkennung, sondern auf Softwareverträge und Bereitstellbarkeit.
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 führt Regressionstests unter Python 3.11 und 3.12 aus, installiert das Wheel und führt einen Smoke-Test der 6 paketierten Profile und des Standard-Scans durch. Das obige öffentliche Beispiel ist ein betriebliches Ergebnis aus einer realen Untersuchung, aber kein Benchmark für Precision, Recall, Ausnutzbarkeit oder CVE-Entdeckungsrate, gemessen an einem repräsentativen Linux-Baum-Korpus.
read-only und es wird empfohlen, ihn beizubehalten.doctor die Option --require-clean-tree.--dangerously-bypass-approvals-and-sandbox sollte nur in isolierten Experimentierumgebungen verwendet werden.new_candidate als auch known_issue sind keine endgültigen Neuheitsurteile.v1 (Repository) konzentrierte sich auf das Problem der Verteilung der LLM-Aufmerksamkeit durch externe Signale und wurde in einer realen v1-gestützten Untersuchung verwendet, um CVE-2026-31720 zu finden. v2 führt dieselbe Forschungshilosophie fort und erweitert sie so, dass auch nach einem starken Befund des Modells Repository-Zustand und antwortabgeleitete Referenzen gemeinsam protokolliert werden. In einer Folgeuntersuchung mit dieser Struktur wurde CVE-2026-53075 gefunden.
v1: Quellbeobachtungen → Rangfolge → fokussiertes Review
v2: Quellbeobachtungen → Rangfolge → fokussiertes Review → Provenienz-bewusstes Triage
Zwei Prinzipien dieser Entwicklung müssen beibehalten werden.
Wenn man es jetzt erneut erweitern würde, hätten Clang-/tree-sitter-Call-Graphen, Punktzahl-Normalisierung, versionierte Manifeste mit Interprozess-Zustandssperrung, autoritative CVE-/Fix-Datenbank-Adapter sowie die Trennung von Runner, Triage und Artefakt-Schreiber Priorität. Der aktuelle Zustandsschreibvorgang selbst verwendet temporäre Dateien und atomares Ersetzen.
Kernel Codex Harness v2 ersetzt keine Schwachstellenerkennung. Vor dem Modellaufruf verteilen externe Signale das Untersuchungsbudget auf erklärbare Kandidaten; nach dem Modellaufruf organisieren Provenienzsignale starke Befunde in überprüfbare Warteschlangen. Diese Struktur wurde in einer realen Untersuchung zur Entdeckung von CVE-2026-53075 verwendet. Das Kernresultat des Projekts ist kein Algorithmus zur automatischen Neuheitsbestimmung, sondern ein praxiserprobter LLM-Sicherheitsreview-Workflow, der Aufmerksamkeitsverteilung und Provenienz-bewusstes Triage explizit trennt.
.
├── .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
Detaillierte manuelle Betriebsabläufe finden Sie im Codex-CLI-Leitfaden, automatische Ausführung und Triage im Autopilot-Leitfaden und Crash-Intelligenz im syzbot-Leitfaden.
[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/
Lizenziert unter der Apache License 2.0.