
Harness de pesquisa de vulnerabilidades do kernel Linux com ciência de proveniência, utilizado na investigação da CVE-2026-53075
Ferramenta de Pesquisa · Importação Original: 3 de Abril de 2026 · Revisão da Documentação v2: 11 de Julho de 2026
Sinal Externo: Da Alocação de Atenção à Triagem Ciente de Proveniência
Use observações reproduzíveis para orientar a atenção do modelo e, em seguida, use a proveniência do repositório para organizar filas de revisão—nunca para reivindicar prova.
Linhagem do Projeto— Kernel Codex Harness v1 · Alocação de Atenção → Kernel Codex Harness v2 · Triagem Ciente de Proveniência
Status do projeto. Este repositório é um harness de pesquisa assistido por LLM que evoluiu o workflow de alocação de atenção do v1 para a triagem ciente de proveniência, destinado à investigação real de vulnerabilidades no kernel Linux. Esta versão foi usada para descobrir a vulnerabilidade divulgada como CVE-2026-53075. Não é um detector automático de vulnerabilidades, um avaliador de novidade, um validador de exploits ou uma ferramenta de garantia de segurança do kernel; a validação final e a divulgação são realizadas por humanos.
Abstract— Fazer um LLM explorar diretamente uma base de código tão grande quanto o kernel Linux dispersa o contexto e facilmente confunde a presença de APIs perigosas com a real explorabilidade. O Kernel Codex Harness v2 define esse problema em dois estágios de processamento de Sinal Externo. Antes da chamada do modelo, pesos de caminho, correspondências lexicais e sobreposição em cache com syzbot classificam arquivos candidatos para alocar atenção. Após a resposta do modelo, branch·HEAD·estado sujo do Git e referências CVE·commit·marcador conhecido extraídas da resposta são combinados para classificar achados fortes em buckets de revisão cientes de proveniência. Este harness foi usado em uma investigação real do kernel Linux que encontrou uma falha de verificação de permissão do namespace de rede alvo do PPP, divulgada como CVE-2026-53075. A triagem é uma heurística para organizar a fila de investigação; em particular, new_candidate significa apenas que nenhuma pista conhecida ou problema de proveniência foi encontrado, não é uma prova de novidade. Todos os achados exigem revalidação humana de alcançabilidade no espaço do usuário, quebra de invariante e impacto concreto.
Termos de Indexação— kernel Linux, pesquisa de vulnerabilidades, sinal externo, proveniência, triagem heurística, orquestração de LLM, syzbot, Codex.
A revisão de segurança do kernel envolve dois tipos distintos de incerteza.
O problema central do v1 era o primeiro: a alocação de atenção. O v2 mantém esse princípio e estende o segundo problema com a triagem ciente de proveniência. Ambas as versões foram usadas em investigações reais; a investigação assistida pelo v1 levou à CVE-2026-31720, e a assistida pelo v2, à CVE-2026-53075.
Observações fora do modelo estreitam o escopo da investigação; após a resposta do modelo, anexa-se proveniência verificável do repositório. Nenhum sinal em qualquer estágio prova uma vulnerabilidade ou novidade.
O Sinal Externo pré-inferência não é um julgamento do LLM, mas uma observação calculada antes da execução do modelo.
Usando a mesma árvore de fontes, perfil e JSON do syzbot em cache, a classificação dos candidatos pode ser recalculada. Essa pontuação não é probabilidade ou explorabilidade, mas uma ordem relativa para decidir por onde começar.
O estágio pós-inferência combina veredictos fortes do modelo com as seguintes informações.
Neste documento, Sinal Externo pós-inferência refere-se apenas à proveniência coletada independentemente do modelo, como repositório/status Git, branch, HEAD, estado sujo e ancestralidade de commits locais. CVEs, commits e marcadores conhecidos são referências derivadas do modelo extraídas da resposta, não Sinal Externo ou fato autoritativo. A triagem combina os dois tipos de entrada, mas registra suas origens separadamente.
Achados fortes são organizados operacionalmente em um dos seguintes buckets de revisão.
| Bucket | Significado |
|---|---|
new_candidate | Candidato com proveniência confirmada e sem sinais de bloqueio por estado sujo/conhecido |
known_issue | Candidato com referência conhecida não negada, ou commit apontado pela resposta como correção/relação upstream e confirmado como ancestral do HEAD atual |
dirty_tree_suspect | Candidato cuja influência de repositório sujo ou alvo sujo não pode ser descartada |
provenance_unknown | Candidato cujo repositório Git, status ou HEAD não pôde ser confirmado de forma confiável |
novelty_proven é false para todos os resultados de classificação. new_candidate não significa “nova vulnerabilidade”, mas sim uma fila para o humano continuar a investigação de novidade primeiro.
A auditoria verifica primeiro as fronteiras iniciadas no espaço do usuário, 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ção de capability.
Uma unidade de investigação é limitada a um arquivo e seus callers, teardown e caminhos de free próximos. Follow-ups manuais propostos pelo modelo são limitados a no máximo dois, mantendo caminhos curtos e verificáveis em vez de exploração ampla.
Um achado forte deve explicar, no mínimo, o seguinte.
O parser normaliza apenas o veredicto e o próximo alvo; ele não prova automaticamente a completude dessas evidências.
O fluxo inicial partiu das ideias de análise por arquivo, expansão limitada de contexto e saída estruturada usadas pelo vulnhuntr da Protect AI [1]. Neste projeto, isso foi redesenhado para a superfície do kernel alcançável pelo espaço do usuário, lifetime de objetos do kernel, caminhos de teardown e sobreposição com syzbot. A contribuição adicional do v2 é colocar um estágio de triagem de achados usando proveniência do repositório após a alocação de atenção.
Fig. 1. O Sinal Externo pré-inferência classifica unidades de revisão reproduzíveis. A triagem pós-inferência combina proveniência Git independente do modelo com referências da resposta derivadas do modelo, sem tratar estas últimas como Sinal Externo ou fato autoritativo. A validação humana permanece fora de ambos os estágios automatizados.
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·léxico·syzbot |
models.py | Candidate, Signal, 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 alcançabilidade e invariantes |
session.py | Armazenamento de estado de revisão pendente, histórico e profundidade de follow-up |
ingest.py | Normalização de veredicto estrito e único próximo alvo |
repo_state.py | Coleta de branch Git, HEAD, status, caminhos sujos e ancestralidade |
finding_triage.py | Classificação heurística em buckets com base em proveniência e referências conhecidas |
autopilot.py | Execução do Codex com orçamento de tempo, ingest, arquivamento e registro de achados |
syzbot.py | Coleta de HTML público do syzbot e geração de cache JSON local |
cli.py | Conexão dos comandos scan/review/doctor/autopilot |
O scanner percorre arquivos .c e .h sob o diretório de includes do perfil.
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
A implementação atual soma correspondências em nível de linha e limita apenas o número de sinais principais exibidos no prompt. A pontuação determina a ordem de investigação do modelo, mas não é uma estatística calibrada de probabilidade de vulnerabilidade.
Os principais sinais estáticos são os seguintes.
__user| Perfil | Foco |
|---|---|
default | Pontos de partida em kernel/mm/net/fs/security/io_uring/lib/drivers |
net | netlink, socket, skb, XDP |
fs | ioctl, procfs, seq_file, debugfs |
io_uring | Lifetime e teardown de requests assíncronos |
bpf | Verifier, lifetime de map/program, BTF |
drivers | ioctl, DMA, MMIO e teardown de drivers |
O syzbot-fetch extrai título, subsistema, tipo de bug e file:line de páginas públicas de bugs do syzbot e os salva em JSON. Sobreposição exata de arquivo é um sinal forte de classificação; sobreposição de subsistema é um sinal fraco. O dashboard ao vivo pode mudar, então a unidade de reprodução é o JSON salvo no momento da coleta. Sobreposição de crash é uma dica para caça de variantes, não evidência de vulnerabilidade.
O scan gera um manifest completo de candidatos classificados e um pacote de prompts principais. --limit define o número de candidatos mantidos no manifest, e --top o número de pacotes pré-gerados. Classificações posteriores podem ser geradas sob demanda.
As respostas do modelo são normalizadas para um dos seguintes veredictos.
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextRevisão manual e autopilot usam o mesmo review_state.json, caminho fixo de resposta e parser de veredicto.
O doctor e o autopilot verificam se é um repositório Git, se a coleta de status foi bem-sucedida, branch, HEAD e caminhos sujos. Um estado em que a proveniência não pode ser confirmada não é tratado como limpo; é preservado como provenance_unknown.
A triagem de veredictos fortes segue aproximadamente esta prioridade.
provenance_unknown,dirty_tree_suspect,known_issue,new_candidate.Expressões de negação ou não relacionamento, como “not a known issue” ou “unrelated to CVE-…”, não são usadas como base para conhecido. A decisão final registra o veredicto original junto com branch, HEAD, status, estado sujo, referência correspondida e motivo.
Atualmente, a classificação em buckets cientes de proveniência e o escritor JSONL são aplicados ao caminho de ingest do autopilot. O loop e o ingest manuais usam o mesmo estado básico de sessão e parser de veredicto, mas não geram artefatos de bucket.
As dependências de runtime do Python são apenas a biblioteca padrão.
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
Os perfis JSON embutidos são incluídos no wheel. Regras adicionais podem ser passadas com --config /path/to/profile.json.
# 1. Verifique a proveniência do repositório.
kernel-harness doctor /path/to/linux
# 2. Crie uma sessão classificada.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 3. Inspecione e renderize uma revisão focada.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
Respostas manuais do Codex devem ser salvas em codex_response.txt, conforme especificado no runbook, e podem ser ingeridas com o seguinte comando.
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
O padrão do sandbox do Codex é read-only. --require-clean-tree permite a execução somente quando o repositório Git, status e HEAD são confirmados e a árvore de trabalho está limpa. --stop-on-finding interrompe somente quando o resultado da triagem heurística é 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 # existe quando há resposta pendente
├── 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 veredicto, bucket, motivo, branch, HEAD, estado de proveniência, referência correspondida e caminhos de achado/arquivo em um formato processável.
O v2 aplicou a estrutura estendida a 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-53075 | PPP · drivers/net/ppp/ppp_generic.c | Ioctls administrativos não anexados não possuíam verificação de CAP_NET_ADMIN contra o namespace de usuário dono do namespace de rede alvo | Achado surgiu durante investigação assistida pelo v2; validação e divulgação permaneceram conduzidas por humanos |
CVE-2026-53075: Registro CVE do 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:HOs 16 testes de regressão não são um benchmark de precisão de detecção de segurança, mas focam no contrato de software e na capacidade de distribuição.
python -m unittest discover -s tests -v
python -m pip wheel . --no-deps --wheel-dir dist
python -m pip install --force-reinstall dist/*.whl
O GitHub Actions executa testes de regressão em Python 3.11 e 3.12, instala o wheel e faz smoke-test dos 6 perfis empacotados e da varredura padrão. O caso público acima é um resultado operacional obtido em investigação real, mas não é um benchmark de precisão, recall, explorabilidade ou taxa de descoberta de CVEs medido em um corpus representativo de árvores Linux.
read-only e recomenda-se mantê-lo.doctor seguido de --require-clean-tree.--dangerously-bypass-approvals-and-sandbox não deve ser usado fora de um ambiente experimental isolado.new_candidate quanto known_issue não são determinações finais de novidade.O v1 (repositório) focou no problema de alocar atenção do LLM com Sinal Externo e foi usado em uma investigação real assistida pelo v1 que descobriu a CVE-2026-31720. O v2 dá continuidade à mesma filosofia de pesquisa e a estende para registrar o estado do repositório e referências derivadas da resposta mesmo após o modelo produzir um achado forte. Uma investigação subsequente usando essa estrutura descobriu a CVE-2026-53075.
v1: observações da fonte → classificação → revisão focada
v2: observações da fonte → classificação → revisão focada → triagem ciente de proveniência
Dois princípios devem ser mantidos nessa evolução.
Se fosse estendido novamente, priorizaria grafo de chamadas Clang/tree-sitter, normalização de pontuação, manifest versionado com bloqueio de estado entre processos, adaptador de banco de dados autoritativo de CVE/correção e separação de runner·triagem·escritor de artefatos. A escrita de estado atual usa arquivo temporário e substituição atômica.
O Kernel Codex Harness v2 não substitui a detecção de vulnerabilidades. Antes da chamada do modelo, o Sinal Externo aloca o orçamento de investigação para candidatos explicáveis; após a chamada, o sinal de proveniência organiza achados fortes em filas revisáveis. Essa estrutura foi usada em uma investigação real que descobriu a CVE-2026-53075, e o principal resultado do projeto não é um algoritmo de determinação automática de novidade, mas sim um workflow prático de revisão de segurança com LLM que separa explicitamente alocação de atenção e triagem ciente de proveniência.
.
├── .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
Operação manual detalhada pode ser consultada no guia do Codex CLI, execução automática e triagem no guia do Autopilot e inteligência de crash no guia do syzbot.
[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.