
Harness di ricerca sulle vulnerabilità del kernel Linux basato su prove concrete, utilizzato nell'indagine sulla CVE-2026-31720
Strumento di Ricerca · Importazione Originale: 3 Aprile 2026 · Revisione Documentazione: 11 Luglio 2026
Filosofia Fondamentale — Segnale Esterno
Lascia che osservazioni riproducibili al di fuori dell'inferenza del modello guidino l'attenzione; non scambiare mai la priorità per una prova.
Stato del progetto. Questo repository è una versione iniziale di un harness di ricerca assistito da LLM costruito e utilizzato per l'indagine di vulnerabilità reali del kernel Linux. Questa versione è stata utilizzata per scoprire la vulnerabilità pubblicata come CVE-2026-31720. L'harness dà priorità ai bersagli di indagine ma non dimostra automaticamente le vulnerabilità né garantisce la sicurezza del kernel; la verifica finale e la segnalazione sono svolte da esseri umani.
Abstract— Lasciare che un LLM esplori direttamente un codebase delle dimensioni del kernel Linux disperde rapidamente il contesto e confonde facilmente l'esistenza di API pericolose con la reale sfruttabilità. Kernel Codex Harness definisce questo problema non come rilevamento automatico di vulnerabilità, ma come . Questo progetto chiama il principio di controllare l'attenzione del modello con osservazioni riproducibili calcolate al di fuori del ragionamento LLM. Combina percorsi del kernel, confini userspace, segnali statici relativi a lifetime·usercopy·refcount·size e intelligence opzionale sui crash di syzbot per classificare i file candidati, trasformando ciascun candidato in un bundle di prompt ristretto. La revisione manuale e l'autopilot basato su budget di tempo utilizzano lo stesso contratto di risposta e lo stesso stato di sessione. Questo harness è stato utilizzato in un'indagine reale sul kernel Linux per scoprire una scrittura out-of-bounds nello stack nel percorso audio del gadget USB; il difetto è stato pubblicato come . Questa implementazione non è un analizzatore statico di precisione, ma un workflow di ricerca che limita l'ambito dell'indagine LLM con euristiche spiegabili; ogni finding richiede una ri-verifica umana di raggiungibilità, violazione di invarianti e impatto concreto.
Termini di Indicizzazione— kernel Linux, ricerca di vulnerabilità, segnale esterno, orchestrazione LLM, prioritizzazione euristica, syzbot, analisi di programmi, Codex.
La revisione di sicurezza del kernel Linux presenta due tipi di problemi di scala. In primo luogo, l'intero albero dei sorgenti è troppo grande per essere gestito in un unico contesto LLM. In secondo luogo, segnali come copy_from_user, allocator, refcount e lock sono comuni ma non implicano di per sé una vulnerabilità. L'analista deve prima decidere "dove guardare" e poi dimostrare separatamente la raggiungibilità da userspace e le transizioni di stato concrete.
La filosofia fondamentale di questo progetto è External Signal.
Non lasciamo che l'LLM decida da solo dove guardare. Segnali riproducibili al di fuori del ragionamento del modello allocano l'attenzione, ma le conclusioni sulle vulnerabilità sono determinate solo da prove di raggiungibilità e invarianti.
Pertanto, l'harness non fa esplorare vagamente l'intero kernel al modello. Prioritizza i file, fornisce un solo ramo di indagine alla volta e richiede prima la struttura delle prove, non le conclusioni.
External Signal non è un giudizio generato dall'LLM, ma un'osservazione determinata prima dell'esecuzione del modello e ricalcolabile dallo stesso albero dei sorgenti, profilo e JSON syzbot salvato. Pesi dei percorsi, hit di espressioni regolari e overlap syzbot memorizzato nella cache rientrano in questa categoria. Questo segnale viene utilizzato solo per la classificazione dei candidati e il contesto dei prompt; non viene promosso a verdetto o prova.
In questo documento, External Signal si riferisce all'intera filosofia del progetto. Il modello dati ExternalSignal nel codice rappresenta attualmente solo i segnali derivati da syzbot, quindi l'ambito dei due termini è diverso.
Gli hit di espressioni regolari, i percorsi ad alto rischio e l'overlap syzbot sono tutti segnali per l'ordine di indagine. Un punteggio elevato non costituisce un finding di sicurezza se il percorso di chiamata effettivo, i privilegi, la configurazione del kernel, il namespace o la disponibilità del dispositivo non consentono l'accesso all'attaccante.
L'audit verifica prima i confini che iniziano da userspace, come syscall, ioctl, netlink, procfs, filesystem, BPF e hook di driver. Solo successivamente valuta classi di bug come UAF, OOB, refcount, race, info leak e controlli di capability.
Un'unità di indagine è limitata per impostazione predefinita a un singolo file e ai suoi caller, teardown e percorsi di free vicini. I follow-up manuali raccomandati dal modello sono consentiti al massimo due volte. Questa limitazione non mira a ridurre la capacità di esplorazione, ma a mantenere le conclusioni entro un ambito verificabile.
Il prompt richiede che un finding forte descriva almeno i seguenti elementi.
Se le prove sono insufficienti, il modello restituisce un singolo target successivo da verificare invece di affermare con forza una vulnerabilità. Questo è un contratto di prove a livello di prompt; l'attuale parser non verifica automaticamente la completezza di ciascuna prova. Poiché l'ingestion normalizza verdetto e target successivo, la verifica finale delle prove è responsabilità umana.
Il flusso di indagine iniziale trae origine dalle idee di analisi per file, espansione limitata del contesto e output strutturato utilizzate da vulnhuntr di Protect AI [1]. In questo progetto non è stato applicato direttamente all'analisi di applicazioni Python, ma è stato riprogettato attorno alla superficie del kernel raggiungibile da userspace, al lifetime degli oggetti del kernel, ai percorsi di teardown e all'overlap syzbot. In particolare, separare i segnali di priorità dalla prova della vulnerabilità e verificare la raggiungibilità prima della classe di bug è la scelta progettuale centrale dell'harness per il kernel.
Fig. 1. Il livello External Signal trasforma le osservazioni calcolate prima dell'inferenza del modello in unità di revisione classificate. Alloca l'attenzione ma non stabilisce la prova della vulnerabilità.
TABELLA I — RESPONSABILITÀ DEI MODULI PRINCIPALI
| Modulo | Responsabilità |
|---|---|
targeting.py | Esplorazione dei file del kernel e punteggio di percorsi, pattern e segnali syzbot |
models.py | Modelli dati Candidate, Signal e 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 invarianti |
session.py | Salvataggio dello stato di revisione in sospeso, cronologia e profondità di follow-up |
ingest.py | Normalizzazione rigorosa di verdetto e target successivo |
autopilot.py | Gestione di codex exec basata su budget di tempo, log, archiviazione e finding |
syzbot.py | Raccolta di pagine pubbliche syzbot e creazione di cache JSON locale |
cli.py | Collegamento dei comandi scan, inspect, codex, loop, autopilot, ecc. |
Lo scanner itera i file .c e .h nelle directory di inclusione del profilo. Il punteggio di priorità del file f è concettualmente composto come segue.
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
Questo punteggio non è una misura di probabilità o sfruttabilità. Ogni elemento fornisce solo un ordine relativo per decidere quali file il modello deve esaminare per primo. L'implementazione attuale somma tutti i match a livello di riga e limita solo i segnali principali mostrati nel prompt. Il ricalcolo dello stesso risultato presuppone lo stesso albero dei sorgenti, profilo e JSON syzbot memorizzato nella cache. Il peso syzbot viene applicato a posteriori ai file già candidati tramite le euristiche di percorso e riga; un hit syzbot da solo non genera nuovi file candidati.
I principali segnali statici sono i seguenti.
ioctl, handler compat, hook di operazioni sui filecopy_from_user, copy_to_user, __userkmalloc, kzalloc, kvmalloc, allocazione di cache e percorsi di freeI profili integrati sono default, net, fs, io_uring, bpf e drivers. Il profilo definisce include path, pattern, pesi e il numero di segnali da conservare per file. Invece di applicare un'unica policy di punteggio all'intero kernel, riflette la superficie di attacco e le caratteristiche di lifetime specifiche di ciascun sottosistema.
syzbot-fetch estrae titolo, sottosistema, tipo di bug e informazioni file:riga dalle pagine pubbliche dei bug syzbot del progetto syzkaller [2], creando una cache JSON. L'overlap esatto dei file è un External Signal forte; l'overlap del sottosistema è un External Signal debole. Poiché la dashboard live può cambiare, l'unità di riproduzione è il JSON salvato al momento del fetch. Le informazioni sui crash sono solo un punto di partenza per la caccia alle varianti e non vengono trattate come prova di nuove vulnerabilità.
scan genera un manifest dei candidati classificati e i bundle di prompt principali. Ogni prompt include il percorso del target, il motivo del punteggio, i segnali di riga, il contesto syzbot e la procedura di audit.
La risposta del modello viene normalizzata in uno dei seguenti verdetti.
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextLa risposta include un Single best next target e un breve riepilogo. Le risposte obsolete senza target in sospeso vengono archiviate separatamente e non collegate a nuovi target.
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 .
I JSON dei profili integrati sono inclusi nella wheel. Le regole JSON esterne possono essere passate con --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 è il numero di candidati da mantenere nel manifest; --top è il numero di bundle di prompt da pre-generare inizialmente. I bundle per i rank successivi possono essere generati su richiesta.
kernel-harness autopilot artifacts/session-YYYYMMDDTHHMMSSZ \
--duration 30m \
--per-run-timeout 10m \
--include-snippet
La sandbox predefinita è read-only. --sandbox workspace-write deve essere specificato solo se la modifica dei file è strettamente necessaria durante l'analisi.
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/
Questa versione non è rimasta una prova di concetto, ma è stata utilizzata in un'indagine reale su una vulnerabilità del kernel Linux.
TABELLA II — ESITO DELLA VULNERABILITÀ DIVULGATA
| Esito pubblico | Area interessata | Gravità / CVSS | Vulnerabilità | Modello di indagine |
|---|---|---|---|---|
| CVE-2026-31720 | Audio gadget USB · drivers/usb/gadget/function/f_uac1_legacy.c | La lunghezza della richiesta controllata dall'host poteva far overfloware un oggetto stack di quattro byte | Finding emerso durante un'indagine assistita da v1; la validazione e la divulgazione sono rimaste guidate da esseri umani |
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:HLa verifica non è un benchmark di accuratezza del rilevamento, ma si concentra sulla regressione dell'implementazione e sulla distribuibilità.
TABELLA III — AMBITO DI VERIFICA INGEGNERISTICA
| Elemento di verifica | Proprietà attesa |
|---|---|
| Regressione allocator | Rilevamento di kmalloc e kvmalloc come segnali di allocator |
| Risorse del profilo | Caricamento dei 6 profili integrati da un checkout dei sorgenti, smoke-test del profilo default dalla wheel installata |
| Contratto di verdetto | not_cve_candidate non scambiato per un finding positivo |
| Policy di follow-up | Due follow-up manuali consentiti, terza richiesta bloccata |
| Gestione risposte obsolete | Risposte senza target in sospeso archiviate e non riutilizzate |
| Default sicuro | Sandbox autopilot predefinita read-only |
| Matrice CI | Suite di regressione eseguita su Python 3.11 e 3.12 |
python -m unittest discover -s tests -v
GitHub Actions esegue le regressioni unitarie, quindi installa la wheel in un nuovo ambiente e fa uno smoke-test della scansione con il profilo default. Il caso pubblico sopra è un risultato operativo ottenuto da un'indagine reale, ma non è un benchmark di precisione, recall o tasso di scoperta di CVE misurato su un corpus rappresentativo di alberi Linux.
read-only.--dangerously-bypass-approvals-and-sandbox in ambienti senza sandbox esterna.Dalla prima versione registrata nella cronologia Git, l'obiettivo è stato più vicino a "controllare quale codice guardare per primo e quali prove richiedere" che a "far trovare le vulnerabilità all'LLM da solo". L'indagine assistita da v1 che ha scoperto CVE-2026-31720 ha fornito un caso di applicazione reale di unità di indagine ristrette e contratto di prove. La v2 estende questo workflow al triage consapevole della provenienza, preservando insieme lo stato del repository e i riferimenti noti. Se lo reimplementassi oggi, darei priorità a quanto segue.
review e runner,Tuttavia, il principio centrale che vorrei mantenere è External Signal. Non lasciare che l'LLM esplori vagamente l'intero codebase; ripetere unità di indagine ristrette da segnali esterni al modello, incentrate su raggiungibilità e invarianti.
Kernel Codex Harness non sostituisce il rilevamento di vulnerabilità del kernel Linux. Invece, trasforma External Signal in una classificazione spiegabile e limita la revisione LLM a un processo di indagine breve e con stato. Questa struttura è stata utilizzata in un'indagine reale per la scoperta di CVE-2026-31720. Il risultato fondamentale del progetto non è rivendicare un nuovo algoritmo di analisi, ma definire la revisione di sicurezza LLM come allocazione dell'attenzione tramite segnale esterno, contratto di prove e orchestrazione riproducibile e applicarla a un workflow di ricerca reale.
.
├── .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
Le procedure operative dettagliate sono disponibili in docs/.
[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.