
Harness de pesquisa de vulnerabilidades no kernel Linux orientado por evidências, utilizado na investigação da CVE-2026-31720
Ferramenta de Pesquisa · Importação Original: 3 de abril de 2026 · Revisão da Documentação: 11 de julho de 2026
Filosofia Central — Sinal Externo
Deixe que observações reproduzíveis fora da inferência do modelo orientem a atenção; nunca confunda prioridade com prova.
Status do projeto. Este repositório é uma versão inicial de um harness de pesquisa assistido por LLM que foi construído e usado para investigação real de vulnerabilidades no kernel Linux. Esta versão foi usada para descobrir a vulnerabilidade divulgada como CVE-2026-31720. O harness prioriza alvos de investigação, mas não prova vulnerabilidades automaticamente nem garante a segurança do kernel; a validação final e a divulgação são conduzidas por humanos.
Resumo— Explorar uma base de código tão grande quanto o kernel Linux diretamente com um LLM dispersa rapidamente o contexto e confunde facilmente a existência de APIs perigosas com a real explorabilidade. O Kernel Codex Harness define esse problema não como detecção automática de vulnerabilidades, mas como . Este projeto chama de o princípio de controlar a atenção do modelo com observações reproduzíveis calculadas fora da inferência do LLM. Ele combina caminhos do kernel, fronteiras de userspace e sinais estáticos relacionados a lifetime, usercopy, refcount e tamanho, com inteligência opcional de crashes do syzbot, para ranquear arquivos candidatos e converter cada candidato em pacotes de prompt estreitos. A revisão manual e o autopilot baseado em orçamento de tempo usam o mesmo contrato de resposta e estado de sessão. Este harness foi usado em uma investigação real do kernel Linux para descobrir uma escrita fora dos limites (stack out-of-bounds write) no caminho de áudio do gadget USB, e essa falha foi divulgada como . Esta implementação não é um analisador estático preciso, mas sim um workflow de pesquisa que usa heurísticas explicáveis para limitar o escopo da investigação do LLM; todos os achados exigem revalidação humana de reachability, quebra de invariante e impacto concreto.
Termos de Índice— kernel Linux, pesquisa de vulnerabilidades, sinal externo, orquestração de LLM, priorização heurística, syzbot, análise de programas, Codex.
A revisão de segurança do kernel Linux enfrenta dois tipos de problemas de escala. Primeiro, a árvore de fontes completa é grande demais para caber em um único contexto de LLM. Segundo, sinais como copy_from_user, alocadores, refcount e locks são comuns, mas não significam vulnerabilidades por si só. O analista deve primeiro decidir "onde olhar" e, em seguida, provar separadamente a reachability de userspace e as transições de estado concretas.
A filosofia central deste projeto é o Sinal Externo.
Não deixamos o LLM decidir sozinho onde olhar. Sinais reproduzíveis fora da inferência do modelo alocam a atenção, mas as conclusões sobre vulnerabilidades são determinadas apenas por evidências de reachability e invariantes.
Portanto, o harness não faz o modelo explorar vagamente o kernel inteiro. Ele prioriza arquivos, fornece apenas um ramo de investigação por vez e exige estrutura de evidências antes de conclusões.
Sinal Externo não é um julgamento gerado pelo LLM; é uma observação determinada antes da execução do modelo e recalculável a partir da mesma árvore de fontes, perfil e JSON do syzbot armazenado. Pesos de caminho, hits de regex e sobreposição com syzbot em cache se enquadram nisso. Esses sinais são usados apenas para ranquear candidatos e fornecer contexto de prompt; nunca são promovidos a veredito ou prova.
Neste documento, Sinal Externo refere-se à filosofia geral do projeto. O modelo de dados ExternalSignal no código atualmente representa apenas os sinais derivados do syzbot, portanto o escopo dos dois termos é diferente.
Hits de regex, caminhos de alto risco e sobreposição com syzbot são todos sinais para ordenar a investigação. Uma pontuação alta não constitui um achado de segurança se o caminho de chamada real, privilégios, config do kernel, namespace ou disponibilidade de dispositivo não permitirem o alcance do atacante.
A auditoria primeiro verifica as fronteiras iniciadas em userspace, como syscall, ioctl, netlink, procfs, filesystem, BPF e hooks de driver. Somente depois avalia classes de bug como UAF, OOB, refcount, race, vazamento de informação e verificações de capability.
Uma unidade de investigação é limitada, por padrão, a um arquivo e seus callers, teardown e caminhos de free próximos. Follow-ups manuais recomendados pelo modelo são permitidos no máximo duas vezes. Essa limitação não visa reduzir a capacidade de exploração, mas manter as conclusões dentro de um escopo verificável.
O prompt exige que um achado forte explique pelo menos os seguintes itens:
Se a evidência for insuficiente, o modelo retorna um único alvo para verificação em seguida, em vez de afirmar fortemente uma vulnerabilidade. Este é um contrato de evidência em nível de prompt; o parser atual não valida automaticamente a completude de cada evidência. Como a ingestão normaliza o veredito e o próximo alvo, a validação final da evidência é responsabilidade humana.
O fluxo inicial de investigação partiu das ideias de análise por arquivo, expansão limitada de contexto e saídas estruturadas usadas pelo vulnhuntr da Protect AI [1]. Neste projeto, essas ideias não foram aplicadas diretamente à análise de aplicações Python, mas redesenhadas em torno da superfície do kernel alcançável por userspace, do lifetime de objetos do kernel, dos caminhos de teardown e da sobreposição com syzbot. Em particular, separar sinais de priorização da prova de vulnerabilidade e verificar reachability antes da classe de bug são as escolhas centrais de design do harness para kernel.
Fig. 1. A camada de Sinal Externo transforma observações calculadas antes da inferência do modelo em unidades de revisão ranqueadas. Ela aloca atenção, mas não estabelece prova de vulnerabilidade.
TABELA I — RESPONSABILIDADES DOS MÓDULOS PRINCIPAIS
| Módulo | Responsabilidade |
|---|---|
targeting.py | Exploração de arquivos do kernel e pontuação de sinais de caminho, padrão e syzbot |
models.py | Modelos de dados Candidate, Signal e ExternalSignal derivado do syzbot |
bundle.py | Geração de manifest, índice de sessão e pacotes de prompt/snippet |
prompting.py | Prompts de auditoria do kernel focados em reachability e invariantes |
session.py | Armazenamento de estado de revisão pendente, histórico e profundidade de follow-up |
ingest.py | Normalização estrita de veredito e próximo alvo |
autopilot.py | Gerenciamento de codex exec baseado em orçamento de tempo, logs, arquivamento e achados |
syzbot.py | Coleta de páginas públicas do syzbot e geração de cache JSON local |
cli.py | Conexão de comandos como scan, inspect, codex, loop, autopilot |
O scanner percorre arquivos .c e .h sob o diretório de includes do perfil. A pontuação de prioridade do arquivo f é conceitualmente composta da seguinte forma:
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
Essa pontuação não é uma medida de probabilidade ou explorabilidade. Cada item fornece apenas uma ordem relativa para o modelo decidir quais arquivos verificar primeiro. A implementação atual soma todas as correspondências em nível de linha e limita apenas os principais sinais exibidos no prompt. O recálculo do mesmo resultado pressupõe a mesma árvore de fontes, perfil e JSON do syzbot em cache. O peso do syzbot é aplicado posteriormente a arquivos que já se tornaram candidatos pelas heurísticas de caminho e linha; um hit do syzbot sozinho não gera novos arquivos candidatos.
Os principais sinais estáticos incluem:
ioctl, handlers compat, hooks de operações de arquivocopy_from_user, copy_to_user, __userkmalloc, kzalloc, kvmalloc, alocação de cache e caminhos de freeOs perfis integrados são default, net, fs, io_uring, bpf e drivers. Cada perfil define caminhos de include, padrões, pesos e o número de sinais preservados por arquivo. Em vez de aplicar uma única política de pontuação a todo o kernel, os perfis refletem a superfície de ataque e as características de lifetime de cada subsistema.
O syzbot-fetch extrai título, subsistema, tipo de bug e informações de arquivo:linha das páginas públicas de bugs do syzbot do projeto syzkaller [2] e as armazena em um cache JSON. A sobreposição exata de arquivo é um Sinal Externo forte; a sobreposição de subsistema é um Sinal Externo fraco. Como o dashboard ao vivo pode mudar, a unidade de reprodução é o JSON armazenado no momento da coleta. As informações de crash são apenas um ponto de partida para a caça de variantes, não evidência de novas vulnerabilidades.
O scan gera um manifest de candidatos ranqueados e os principais pacotes de prompt. Cada prompt inclui o caminho do alvo, o motivo da pontuação, sinais de linha, contexto do syzbot e o procedimento de auditoria.
A resposta do modelo é normalizada para um dos seguintes vereditos:
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextA resposta inclui um único Single best next target e um breve resumo. Respostas antigas sem alvo pendente são arquivadas separadamente e não são vinculadas a novos alvos.
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 .
Os JSONs de perfil integrados são incluídos no wheel. Regras JSON externas podem ser passadas com --config /path/to/profile.json.
# 1. Crie uma sessão ranqueada.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 2. Inspecione os candidatos de alta prioridade.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
# 3. Renderize um prompt focado.
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
--limit define o número de candidatos mantidos no manifest; --top define o número de pacotes de prompt pré-gerados inicialmente. Pacotes de ranks posteriores também podem ser gerados sob demanda.
kernel-harness autopilot artifacts/session-YYYYMMDDTHHMMSSZ \
--duration 30m \
--per-run-timeout 10m \
--include-snippet
O sandbox padrão é read-only. Use --sandbox workspace-write somente se a modificação de arquivos for estritamente necessária durante a análise.
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 # presente enquanto uma resposta está pendente
├── bundles/
│ ├── <rank>-<target>.md
│ └── <rank>-<target>.snippet.txt
├── responses/
└── autopilot/
├── AUTOPILOT_STATUS.txt
├── AUTOPILOT_PROGRESS.txt
├── AUTOPILOT_FINDINGS.txt
├── prompts/
├── exec/
└── findings/
Esta versão não permaneceu apenas como prova de conceito; foi usada em uma investigação real de vulnerabilidades no kernel Linux.
TABELA II — RESULTADO DE VULNERABILIDADE DIVULGADA
| Resultado público | Área afetada | Severidade / CVSS | Vulnerabilidade | Modelo de investigação |
|---|---|---|---|---|
| CVE-2026-31720 | Áudio de gadget USB · drivers/usb/gadget/function/f_uac1_legacy.c | O comprimento da solicitação controlado pelo host poderia estourar um objeto de pilha de quatro bytes | Achado surgiu durante uma investigação assistida pela v1; validação e divulgação permaneceram conduzidas por humanos |
CVE-2026-31720: NVD CVSS 3.1 · 7.8 Alta · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HA verificação não é um benchmark de precisão de detecção, mas sim um foco em regressões de implementação e capacidade de implantação.
TABELA III — ESCOPO DE VERIFICAÇÃO DE ENGENHARIA
| Item de verificação | Propriedade esperada |
|---|---|
| Regressão de alocadores | kmalloc e kvmalloc detectados como sinais de alocador |
| Recursos de perfil | Carregamento dos 6 perfis integrados a partir do checkout de fontes; smoke-test do perfil default a partir do wheel instalado |
| Contrato de veredito | not_cve_candidate não é confundido com um achado positivo |
| Política de follow-up | Permite dois follow-ups manuais; bloqueia a terceira solicitação |
| Tratamento de respostas obsoletas | Respostas sem alvo pendente são arquivadas e não reutilizadas |
| Padrão seguro | O sandbox padrão do autopilot é read-only |
| Matriz de CI | Suíte de regressão executada em Python 3.11 e 3.12 |
python -m unittest discover -s tests -v
O GitHub Actions executa regressões unitárias, instala o wheel em um novo ambiente e faz smoke-test do scan com o perfil default. O caso divulgado acima é um resultado operacional obtido em investigação real, mas não é um benchmark de precisão, recall ou taxa de descoberta de CVEs medido em um corpus representativo de árvores Linux.
read-only.--dangerously-bypass-approvals-and-sandbox em ambientes sem sandbox externo.Desde a primeira versão registrada no histórico do Git, o objetivo esteve mais próximo de "controlar qual código revisar primeiro e quais evidências exigir" do que de "fazer o LLM encontrar vulnerabilidades sozinho". A investigação assistida pela v1 que descobriu o CVE-2026-31720 forneceu um caso de aplicação real da unidade de investigação estreita e do contrato de evidências. A v2 estendeu esse workflow para triagem ciente de proveniência, preservando o estado do repositório e referências conhecidas. Se eu fosse reimplementar agora, priorizaria:
review e runner para eliminar duplicação entre CLI e autopilot,Ainda assim, o princípio central que quero manter é o Sinal Externo. Não deixar o LLM explorar vagamente toda a base de código; em vez disso, repetir unidades de investigação estreitas, guiadas por sinais externos ao modelo, com foco em reachability e invariantes.
O Kernel Codex Harness não substitui a detecção de vulnerabilidades no kernel Linux. Em vez disso, transforma o Sinal Externo em um ranqueamento explicável e limita a revisão do LLM a um processo de investigação curto e com estado. Essa estrutura foi usada em investigação real para descobrir o CVE-2026-31720. O principal resultado do projeto não está em reivindicar um novo algoritmo de análise, mas em definir a revisão de segurança com LLM como um problema de alocação de atenção por sinal externo, contrato de evidências e orquestração reproduzível, aplicado a um workflow de pesquisa real.
.
├── .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
Procedimentos operacionais detalhados podem ser encontrados em docs/.
[1] Protect AI, "vulnhuntr," repositório GitHub. https://github.com/protectai/vulnhuntr
[2] Google, "syzkaller and syzbot," repositório GitHub. https://github.com/google/syzkaller
[3] OpenAI, "Codex CLI." https://developers.openai.com/codex/cli/
Licenciado sob a Apache License 2.0.