
Harness di ricerca sulle vulnerabilità del kernel Linux basato sulla provenienza, utilizzato nell'indagine su CVE-2026-53075
Strumento di Ricerca · Importazione Originale: 3 Aprile 2026 · Revisione Documentazione v2: 11 Luglio 2026
Segnale Esterno: Dall'Allocazione dell'Attenzione al Triage Basato sulla Provenienza
Usa osservazioni riproducibili per guidare l'attenzione del modello, poi usa la provenienza del repository per organizzare le code di revisione—mai per rivendicare una prova.
Lineaggio del Progetto— Kernel Codex Harness v1 · Allocazione dell'Attenzione → Kernel Codex Harness v2 · Triage Basato sulla Provenienza
Stato del progetto. Questo repository è un harness di ricerca assistito da LLM che fa evolvere il workflow di attention-allocation della v1 fino al triage basato sulla provenienza per l'analisi reale delle vulnerabilità del kernel Linux. Questa versione è stata utilizzata per scoprire la vulnerabilità pubblicata come CVE-2026-53075. Non è un rilevatore automatico di vulnerabilità, un giudice di novità, un validatore di exploit o uno strumento di garanzia della sicurezza del kernel; la validazione finale e la segnalazione sono eseguite da esseri umani.
Abstract— Lasciare che un LLM esplori direttamente un codebase grande come il kernel Linux disperde il contesto e confonde facilmente l'esistenza di API pericolose con l'effettiva sfruttabilità. Kernel Codex Harness v2 definisce questo problema come gestione di Segnale Esterno in due fasi. Prima della chiamata al modello, i pesi dei percorsi, i hit lessicali e la sovrapposizione con syzbot memorizzata nella cache classificano i file candidati per allocare l'attenzione. Dopo la risposta del modello, branch Git, HEAD e dirty state vengono combinati con CVE, commit e marker noti estratti dalla risposta per classificare i finding forti in bucket di revisione basati sulla provenienza. Questo harness è stato utilizzato in un'analisi reale del kernel Linux per scoprire un difetto nella verifica dei permessi del network namespace di destinazione di PPP, pubblicato come CVE-2026-53075. Il triage è un'euristica per organizzare la coda di analisi; in particolare, new_candidate significa solo che non sono stati trovati indizi noti o problemi di provenienza, non è una prova di novità. Tutti i finding richiedono una ri-validazione umana di raggiungibilità da userspace, rottura degli invariant e impatto concreto.
Termini di Indicizzazione— kernel Linux, ricerca di vulnerabilità, segnale esterno, provenienza, triage euristico, orchestrazione LLM, syzbot, Codex.
La revisione della sicurezza del kernel comporta due diversi tipi di incertezza.
Il problema centrale della v1 era il primo, cioè l'allocazione dell'attenzione. La v2 mantiene quel principio ed estende il secondo problema con il triage basato sulla provenienza. Entrambe le versioni sono state utilizzate in analisi reali: l'analisi assistita da v1 ha portato a CVE-2026-31720, quella assistita da v2 a CVE-2026-53075.
Le osservazioni esterne al modello restringono l'ambito dell'analisi e, dopo la risposta del modello, viene allegata una provenienza del repository verificabile. Nessun segnale in nessuna fase dimostra una vulnerabilità o una novità.
Il Segnale Esterno pre-inferenza non è un giudizio dell'LLM ma un'osservazione calcolata prima dell'esecuzione del modello.
Usando lo stesso albero dei sorgenti, profilo e JSON syzbot memorizzato nella cache, il ranking dei candidati può essere ricalcolato. Questo punteggio non è una probabilità o sfruttabilità ma un ordine relativo per decidere dove guardare per primo.
La fase post-inferenza combina un verdetto forte del modello con le seguenti informazioni.
In questo documento, il Segnale Esterno post-inferenza si riferisce solo alla provenienza raccolta indipendentemente dal modello, come repository/status Git, branch, HEAD, dirty state e ancestry dei commit locali. CVE, commit e marker noti sono riferimenti derivati dal modello estratti dalla risposta del modello, non Segnale Esterno né fatti autorevoli. Il triage combina i due tipi di input ma registra separatamente la loro origine.
I finding forti sono organizzati operativamente in uno dei seguenti bucket di revisione.
| Bucket | Significato |
|---|---|
new_candidate | Candidato con provenienza verificata e nessun segnale bloccante di dirty/known rilevato |
known_issue | Candidato con riferimento noto non negato o con commit indicato dalla risposta come fix/relazione upstream e confermato come ancestore del HEAD corrente |
dirty_tree_suspect | Candidato in cui non si può escludere l'influenza di un repository dirty o di un target dirty |
provenance_unknown | Candidato per cui non è stato possibile verificare in modo affidabile repository Git, status o HEAD |
novelty_proven è false per tutti i risultati di classificazione. new_candidate non significa "nuova vulnerabilità" ma una coda da dare priorità agli esseri umani per continuare l'indagine di novità.
L'audit verifica prima i confini raggiungibili da userspace come syscall, ioctl, netlink, procfs, filesystem, BPF e hook di driver. Solo dopo valuta classi di bug come UAF, OOB, refcount, race, info leak e controlli di capability.
Un'unità di indagine è limitata a un singolo file e ai suoi percorsi vicini di caller, teardown e free. I follow-up manuali proposti dal modello sono limitati a un massimo di due per mantenere percorsi brevi e verificabili piuttosto che un'esplorazione ampia.
Un finding forte deve spiegare almeno quanto segue.
Il parser normalizza solo verdetto e prossimo target; non dimostra automaticamente la completezza di queste evidenze.
Il flusso iniziale trae origine dall'idea di analisi per file, estensione limitata del contesto e output strutturato usata da vulnhuntr di Protect AI [1]. In questo progetto è stato riprogettato per la superficie del kernel raggiungibile da userspace, il lifetime degli oggetti del kernel, i percorsi di teardown e la sovrapposizione con syzbot. Il contributo aggiuntivo della v2 è l'inserimento di una fase di triage dei finding basata sulla provenienza del repository dopo l'allocazione dell'attenzione.
Fig. 1. Il Segnale Esterno pre-inferenza classifica unità di revisione riproducibili. Il triage post-inferenza combina la provenienza Git indipendente dal modello con i riferimenti della risposta derivati dal modello, senza trattare questi ultimi come Segnale Esterno o fatto autorevole. La validazione umana rimane esterna a entrambe le fasi automatizzate.
TABELLA I — RESPONSABILITÀ DEI MODULI PRINCIPALI
| Modulo | Responsabilità |
|---|---|
targeting.py | Esplorazione dei file del kernel e punteggio dei segnali path, lexical e syzbot |
models.py | Candidate, Signal, ExternalSignal derivato da syzbot |
bundle.py | Generazione di manifest, indice di sessione e bundle di prompt/snippet |
prompting.py | Prompt di audit del kernel incentrati su raggiungibilità e invariant |
session.py | Salvataggio dello stato di revisione in sospeso, cronologia e profondità dei follow-up |
ingest.py | Normalizzazione di verdetto rigoroso e singolo prossimo target |
repo_state.py | Raccolta di branch Git, HEAD, status, percorsi dirty e ancestry |
finding_triage.py | Classificazione euristica in bucket basata su provenienza e riferimenti noti |
autopilot.py | Esecuzione Codex con budget di tempo, ingest, archiviazione e registrazione dei finding |
syzbot.py | Raccolta di HTML syzbot pubblico e generazione di cache JSON locale |
cli.py | Collegamento dei comandi scan/review/doctor/autopilot |
Lo scanner itera i file .c e .h nelle directory incluse dal profilo.
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
L'implementazione attuale somma i match a livello di riga e limita solo il numero di segnali principali mostrati nel prompt. Il punteggio determina l'ordine di indagine del modello ma non è un valore statistico calibrato sulla probabilità di vulnerabilità.
I principali segnali statici sono i seguenti.
__user| Profilo | Focus |
|---|---|
default | Punti di partenza kernel/mm/net/fs/security/io_uring/lib/drivers |
net | netlink, socket, skb, XDP |
fs | ioctl, procfs, seq_file, debugfs |
io_uring | Lifetime delle request asincrone e teardown |
bpf | Verifier, lifetime di map/program, BTF |
drivers | ioctl, DMA, MMIO e teardown dei driver |
syzbot-fetch estrae titolo, sottosistema, tipo di bug e file:linea dalle pagine pubbliche dei bug di syzbot e li salva in JSON. La sovrapposizione esatta di file è un segnale di ranking forte, la sovrapposizione di sottosistema è un segnale debole. La dashboard live può cambiare, quindi l'unità riproducibile è il JSON salvato al momento del fetch. La sovrapposizione di crash è un suggerimento per la caccia alle varianti, non una prova di vulnerabilità.
scan genera un manifest completo di candidati classificati e i bundle di prompt principali. --limit è il numero di candidati da mantenere nel manifest e --top è il numero di bundle da generare in anticipo. I rank successivi possono essere generati su richiesta.
La risposta del modello viene normalizzata in uno dei seguenti verdetti.
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextLa revisione manuale e l'autopilot usano lo stesso review_state.json, lo stesso percorso fisso delle risposte e lo stesso parser di verdetto.
doctor e l'autopilot verificano la presenza di un repository Git, il successo della raccolta dello status, branch, HEAD e percorsi dirty. Uno stato in cui la provenienza non può essere determinata non viene considerato pulito ma preservato come provenance_unknown.
Il triage dei verdetti forti segue approssimativamente questa priorità.
provenance_unknown,dirty_tree_suspect,known_issue,new_candidate.Espressioni di negazione o non correlazione come "not a known issue", "unrelated to CVE-…" non vengono usate come base per known. Nel verdetto finale vengono registrati insieme il verdetto originale, branch, HEAD, status, dirty state, riferimento corrispondente e motivo.
L'attuale classificazione in bucket basata sulla provenienza e il writer JSONL si applicano al percorso di ingest dell'autopilot. loop e ingest manuali usano lo stesso stato di sessione di base e lo stesso parser di verdetto ma non generano artefatti di bucket.
Le dipendenze runtime di Python sono solo la libreria standard.
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
I profili JSON integrati sono inclusi nella wheel. Regole personalizzate possono essere passate con --config /path/to/profile.json.
# 1. Verifica la provenienza del repository.
kernel-harness doctor /path/to/linux
# 2. Crea una sessione classificata.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 3. Ispeziona e renderizza una revisione mirata.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
Le risposte manuali di Codex vengono salvate in codex_response.txt come indicato dal runbook e poi possono essere ingerite con il comando seguente.
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
La sandbox predefinita di Codex è read-only. --require-clean-tree consente l'esecuzione solo quando repository Git, status e HEAD sono verificati e l'albero di lavoro è pulito. --stop-on-finding si ferma solo quando il risultato del triage euristico è 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 # esiste quando la risposta è in sospeso
├── 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 preserva verdetto, bucket, motivo, branch, HEAD, stato della provenienza, riferimento corrispondente e percorsi di finding/archivio in una forma elaborabile.
La v2 ha applicato la struttura estesa a un'analisi reale delle vulnerabilità del kernel Linux.
TABELLA II — RISULTATO DI VULNERABILITÀ DIVULGATA
| Esito pubblico | Area interessata | Gravità / CVSS | Vulnerabilità | Modello di indagine |
|---|---|---|---|---|
| CVE-2026-53075 | PPP · drivers/net/ppp/ppp_generic.c | Gli ioctl amministrativi non collegati mancavano di un controllo CAP_NET_ADMIN sul namespace utente proprietario del network namespace di destinazione | Finding emerso durante un'indagine assistita da v2; validazione e divulgazione sono rimaste guidate da esseri umani |
CVE-2026-53075: Record CVE del CNA Linux · CVSS 3.1 · 8.8 High · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:HI 16 test di regressione non sono un benchmark di accuratezza del rilevamento di sicurezza ma si concentrano sul contratto software e sulla distribuibilità.
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 esegue i test di regressione su Python 3.11 e 3.12, installa la wheel e fa uno smoke-test dei 6 profili impacchettati e della scansione predefinita. Il caso divulgato sopra è un risultato operativo ottenuto da un'indagine reale, ma non è un benchmark di precision, recall, sfruttabilità o tasso di scoperta CVE misurato su un corpus rappresentativo di alberi Linux.
read-only e si raccomanda di mantenerla.doctor seguito da --require-clean-tree.--dangerously-bypass-approvals-and-sandbox non va usato al di fuori di ambienti sperimentali isolati.new_candidate che known_issue non sono giudizi finali di novità.La v1 (repository) si concentrava sul problema di allocare l'attenzione dell'LLM con Segnale Esterno ed è stata usata in un'indagine reale assistita da v1 che ha portato alla scoperta di CVE-2026-31720. La v2 prosegue la stessa filosofia di ricerca estendendola per registrare anche lo stato del repository e i riferimenti derivati dalla risposta dopo che il modello produce un finding forte. In un'indagine successiva che ha usato questa struttura è stato scoperto CVE-2026-53075.
v1: osservazioni sui sorgenti → ranking → revisione mirata
v2: osservazioni sui sorgenti → ranking → revisione mirata → triage basato sulla provenienza
Due principi devono essere mantenuti in questa evoluzione.
Se si dovesse estendere di nuovo, si darebbe priorità a call graph Clang/tree-sitter, normalizzazione dei punteggi, manifest versionati con locking dello stato tra processi, adapter per database CVE/fix autorevoli e separazione di runner, triage e writer degli artefatti. La scrittura dello stato attuale usa file temporanei e sostituzione atomica.
Kernel Codex Harness v2 non sostituisce il rilevamento delle vulnerabilità. Prima della chiamata al modello, il Segnale Esterno distribuisce il budget di indagine su candidati spiegabili; dopo la chiamata al modello, il segnale di provenienza organizza i finding forti in code revisionabili. Questa struttura è stata usata in un'indagine reale per la scoperta di CVE-2026-53075, e il risultato principale del progetto non è un algoritmo che determina automaticamente la novità, ma un workflow pratico di revisione della sicurezza con LLM che separa esplicitamente l'allocazione dell'attenzione dal triage basato sulla provenienza.
.
├── .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
Le operazioni manuali dettagliate sono disponibili nella guida CLI Codex, l'esecuzione automatica e il triage nella guida Autopilot e l'intelligenza dai crash nella guida syzbot.
[1] Protect AI, "vulnhuntr," repository GitHub. https://github.com/protectai/vulnhuntr
[2] Google, "syzkaller and syzbot," repository GitHub. https://github.com/google/syzkaller
[3] OpenAI, "Codex CLI." https://developers.openai.com/codex/cli/
Concesso in licenza sotto la Apache License 2.0.