
Herramienta de investigación de vulnerabilidades del kernel de Linux consciente de la procedencia, utilizada en la investigación de CVE-2026-53075
Herramienta de Investigación · Importación Original: 3 de abril de 2026 · Revisión de Documentación v2: 11 de julio de 2026
Señal Externa: De la Asignación de Atención al Triage Consciente de Procedencia
Usa observaciones reproducibles para guiar la atención del modelo, luego usa la procedencia del repositorio para organizar las colas de revisión—nunca para reclamar prueba.
Linaje del Proyecto— Kernel Codex Harness v1 · Asignación de Atención → Kernel Codex Harness v2 · Triage Consciente de Procedencia
Estado del proyecto. Este repositorio es un harness de investigación asistido por LLM que evoluciona el workflow de asignación de atención de v1 hasta el triage consciente de procedencia para la investigación real de vulnerabilidades del kernel de Linux. Esta versión se usó para descubrir la vulnerabilidad publicada como CVE-2026-53075. No es un detector automático de vulnerabilidades, un juez de novedad, un validador de exploits ni una herramienta de garantía de seguridad del kernel; la validación final y la divulgación las realiza un humano.
Abstract— Hacer que un LLM explore directamente una base de código tan grande como el kernel de Linux dispersa el contexto y confunde fácilmente la existencia de APIs peligrosas con la explotabilidad real. Kernel Codex Harness v2 define este problema como un procesamiento de Señal Externa en dos etapas. Antes de la llamada al modelo, los pesos de ruta, los aciertos léxicos y la superposición con syzbot en caché clasifican los archivos candidatos para asignar la atención. Después de la respuesta del modelo, se combinan la rama Git, el HEAD, el estado sucio y los marcadores CVE, commit y conocidos extraídos de la respuesta para clasificar los hallazgos fuertes en buckets de revisión conscientes de procedencia. Este harness se usó en una investigación real del kernel de Linux para descubrir una falla en la verificación de permisos del namespace de red objetivo de PPP, publicada como CVE-2026-53075. El triage es una heurística para organizar la cola de investigación; en particular, new_candidate solo significa que no se encontraron pistas conocidas ni problemas de procedencia, no es una prueba de novedad. Todos los hallazgos requieren revalidación humana de alcanzabilidad desde userspace, ruptura de invariantes e impacto concreto.
Términos de índice— kernel de Linux, investigación de vulnerabilidades, señal externa, procedencia, triage heurístico, orquestación de LLM, syzbot, Codex.
La revisión de seguridad del kernel tiene dos tipos diferentes de incertidumbre.
El problema central de v1 era el primero, la asignación de atención. v2 mantiene ese principio y extiende el segundo problema al triage consciente de procedencia. Ambas versiones se usaron en investigaciones reales: la investigación asistida por v1 condujo a CVE-2026-31720 y la asistida por v2 condujo a CVE-2026-53075.
Las observaciones fuera del modelo reducen el alcance de la investigación y, después de la respuesta del modelo, se adjunta procedencia verificable del repositorio. Ninguna señal en ninguna etapa prueba una vulnerabilidad o novedad.
La Señal Externa pre-inferencia no es un juicio del LLM, sino una observación calculada antes de la ejecución del modelo.
Con el mismo árbol fuente, perfil y JSON de syzbot en caché, el ranking de candidatos se puede recalcular. Esta puntuación no es probabilidad ni explotabilidad, sino un orden relativo para decidir dónde mirar primero.
La etapa post-inferencia combina un veredicto fuerte del modelo con la siguiente información.
En este documento, la Señal Externa post-inferencia se refiere únicamente a la procedencia recopilada independientemente del modelo, como el repositorio Git/estado, la rama, el HEAD, el estado sucio y la ascendencia de commits locales. Los marcadores CVE, commit y conocidos son referencias derivadas del modelo extraídas de la respuesta del modelo, no Señal Externa ni hechos autoritativos. El triage combina ambos tipos de entrada pero registra sus fuentes por separado.
Los hallazgos fuertes se organizan operativamente en uno de los siguientes buckets de revisión.
| Bucket | Significado |
|---|---|
new_candidate | Candidato con procedencia confirmada y sin señales de bloqueo por estado sucio o problemas conocidos |
known_issue | Candidato con referencia conocida no negada o un commit señalado por la respuesta como fix/relación upstream y confirmado como ancestro del HEAD actual |
dirty_tree_suspect | Candidato donde no se puede descartar la influencia de un repositorio sucio o un objetivo sucio |
provenance_unknown | Candidato donde no se pudo confirmar de forma fiable el repositorio Git, el estado o el HEAD |
El novelty_proven de todos los resultados de clasificación es false. new_candidate no significa "nueva vulnerabilidad", sino una cola prioritaria para que un humano continúe la investigación de novedad.
La auditoría verifica primero los límites que se inician desde userspace, como syscall, ioctl, netlink, procfs, filesystem, BPF y hooks de drivers. Solo después evalúa clases de bug como UAF, OOB, refcount, race, info leak y comprobaciones de capabilities.
Una unidad de investigación se limita a un archivo y sus rutas cercanas de caller, teardown y free. El seguimiento manual propuesto por el modelo se limita a un máximo de dos veces para mantener rutas cortas verificables en lugar de una exploración amplia.
Un hallazgo fuerte debe explicar como mínimo lo siguiente.
El parser normaliza el veredicto y el siguiente objetivo, pero no prueba automáticamente la completitud de esta evidencia.
El flujo inicial se inspiró en las ideas de análisis por archivo, extensión limitada de contexto y resultados estructurados utilizadas por vulnhuntr de Protect AI [1]. En este proyecto se rediseñó para la superficie del kernel alcanzable desde userspace, el lifetime de objetos del kernel, las rutas de teardown y la superposición con syzbot. La contribución adicional de v2 es colocar una etapa de triage de hallazgos basada en la procedencia del repositorio después de la asignación de atención.
Fig. 1. La Señal Externa pre-inferencia clasifica unidades de revisión reproducibles. El triage post-inferencia combina la procedencia Git independiente del modelo con las referencias de respuesta derivadas del modelo, sin tratar estas últimas como Señal Externa ni hecho autoritativo. La validación humana permanece fuera de ambas etapas automatizadas.
TABLA I — RESPONSABILIDADES DE LOS MÓDULOS PRINCIPALES
| Módulo | Responsabilidad |
|---|---|
targeting.py | Exploración de archivos del kernel y puntuación de señales de ruta, léxicas y de syzbot |
models.py | Candidate, Signal, ExternalSignal derivado de syzbot |
bundle.py | Generación de manifest, índice de sesión y bundle de prompts/snippets |
prompting.py | Prompts de auditoría del kernel centrados en alcanzabilidad e invariantes |
session.py | Almacenamiento de estado de revisión pendiente, historial y profundidad de seguimiento |
ingest.py | Normalización de veredictos estrictos y un único siguiente objetivo |
repo_state.py | Recopilación de rama Git, HEAD, estado, rutas sucias y ascendencia |
finding_triage.py | Clasificación heurística en buckets basada en procedencia y referencias conocidas |
autopilot.py | Ejecución de Codex con presupuesto de tiempo, ingest, archivado y registro de hallazgos |
syzbot.py | Recopilación de HTML público de syzbot y generación de caché JSON local |
cli.py | Conexión de comandos scan/review/doctor/autopilot |
El escáner recorre los archivos .c y .h bajo el directorio de includes del perfil.
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
La implementación actual suma las coincidencias a nivel de línea y solo limita el número de señales principales mostradas en el prompt. La puntuación ordena la secuencia de investigación del modelo, pero no es un valor estadístico calibrado de probabilidad de vulnerabilidad.
Las principales señales estáticas son las siguientes.
__user| Perfil | Enfoque |
|---|---|
default | Puntos de inicio en kernel/mm/net/fs/security/io_uring/lib/drivers |
net | netlink, socket, skb, XDP |
fs | ioctl, procfs, seq_file, debugfs |
io_uring | Lifetime de requests asíncronos y teardown |
bpf | Verifier, lifetime de maps/programs, BTF |
drivers | ioctl, DMA, MMIO y teardown de drivers |
syzbot-fetch extrae título, subsistema, tipo de bug y archivo:línea de las páginas públicas de bugs de syzbot y los guarda en JSON. La superposición exacta de archivos es una señal de ranking fuerte; la superposición de subsistemas es una señal débil. Como el dashboard en vivo puede cambiar, la unidad reproducible es el JSON almacenado en el momento de la descarga. La superposición de crashes es una pista para la caza de variantes, no evidencia de vulnerabilidad.
scan genera el manifest completo de candidatos clasificados y el bundle de prompts principales. --limit es el número de candidatos que se mantienen en el manifest y --top es el número de bundles generados por adelantado. Los rankings posteriores también se pueden generar bajo demanda.
La respuesta del modelo se normaliza a uno de los siguientes veredictos.
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextLa revisión manual y el autopilot usan el mismo review_state.json, la ruta de respuesta fija y el parser de veredictos.
doctor y el autopilot verifican si es un repositorio Git, si la recopilación de estado fue exitosa, la rama, el HEAD y las rutas sucias. Un estado donde no se puede confirmar la procedencia no se trata como limpio, sino que se conserva como provenance_unknown.
El triage de veredictos fuertes sigue aproximadamente esta prioridad.
provenance_unknown,dirty_tree_suspect,known_issue,new_candidate.Expresiones de negación o no relacionadas como "not a known issue" o "unrelated to CVE-…" no se usan como base de conocimiento. En el veredicto final se registran, junto con el veredicto original, la rama, el HEAD, el estado, el estado sucio, la referencia coincidente y el motivo.
Actualmente, la clasificación en buckets conscientes de procedencia y el escritor JSONL se aplican a la ruta de ingest del autopilot. El loop e ingest manuales usan el mismo estado de sesión base y el parser de veredictos, pero no generan artefactos de buckets.
Las dependencias de runtime de Python son solo la biblioteca estándar.
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
Los perfiles JSON integrados se incluyen en la wheel. Se pueden pasar reglas adicionales con --config /path/to/profile.json.
# 1. Verificar la procedencia del repositorio.
kernel-harness doctor /path/to/linux
# 2. Crear una sesión clasificada.
kernel-harness scan /path/to/linux \
--profile net \
--limit 80 \
--top 20 \
--out artifacts
# 3. Inspeccionar y renderizar una revisión enfocada.
kernel-harness inspect artifacts/session-YYYYMMDDTHHMMSSZ --top 10
kernel-harness codex artifacts/session-YYYYMMDDTHHMMSSZ \
--rank 1 \
--include-snippet
La respuesta manual de Codex se guarda en codex_response.txt según lo especifica el runbook y luego se puede ingerir con el siguiente 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
El sandbox de Codex tiene como valor predeterminado read-only. --require-clean-tree solo permite la ejecución cuando se confirman el repositorio Git, el estado y el HEAD, y el árbol de trabajo está limpio. --stop-on-finding se detiene solo cuando el resultado del triage heurístico es 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 cuando hay una respuesta pendiente
├── 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 conserva el veredicto, el bucket, el motivo, la rama, el HEAD, el estado de procedencia, la referencia coincidente y las rutas de hallazgo/archivo en un formato procesable.
v2 aplicó la estructura extendida a una investigación real de vulnerabilidades del kernel de Linux.
TABLA II — RESULTADO DE VULNERABILIDAD DIVULGADA
| Resultado público | Área afectada | Severidad / CVSS | Vulnerabilidad | Modelo de investigación |
|---|---|---|---|---|
| CVE-2026-53075 | PPP · drivers/net/ppp/ppp_generic.c | Los ioctls administrativos no adjuntos carecían de una comprobación de CAP_NET_ADMIN contra el namespace de usuario propietario del namespace de red objetivo | Hallazgo surgido durante una investigación asistida por v2; la validación y la divulgación siguieron siendo lideradas por humanos |
CVE-2026-53075: Registro CVE del CNA de 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:HLas 16 pruebas de regresión no son un benchmark de precisión de detección de seguridad, sino que se centran en el contrato de software y la capacidad de distribución.
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 ejecuta las pruebas de regresión en Python 3.11 y 3.12, instala la wheel y hace smoke-test de los 6 perfiles empaquetados y del escaneo predeterminado. El caso público anterior es un resultado operativo obtenido en una investigación real, pero no es un benchmark de precisión, recall, explotabilidad o tasa de descubrimiento de CVEs medido sobre un corpus representativo de árboles de Linux.
read-only y se recomienda mantenerlo.--require-clean-tree después de doctor.--dangerously-bypass-approvals-and-sandbox no debe usarse fuera de un entorno experimental aislado.new_candidate como known_issue no son un veredicto final de novedad.v1 (repositorio) se centró en el problema de asignar la atención del LLM mediante Señal Externa y se usó en una investigación real asistida por v1 que descubrió CVE-2026-31720. v2 continúa la misma filosofía de investigación y la extiende para registrar el estado del repositorio y las referencias derivadas de la respuesta incluso después de que el modelo emite un hallazgo fuerte. En una investigación posterior que usó esta estructura se descubrió CVE-2026-53075.
v1: observaciones del código fuente → ranking → revisión enfocada
v2: observaciones del código fuente → ranking → revisión enfocada → triage consciente de procedencia
Hay dos principios que deben mantenerse en esta evolución.
Si se extendiera de nuevo, se priorizarían el grafo de llamadas de Clang/tree-sitter, la normalización de puntuaciones, el manifest versionado con bloqueo de estado entre procesos, un adaptador de base de datos autoritativa de CVE/fixes y la separación de runner, triage y escritor de artefactos. La escritura de estado actual usa archivos temporales y reemplazo atómico.
Kernel Codex Harness v2 no reemplaza la detección de vulnerabilidades. Antes de la llamada al modelo, la Señal Externa distribuye el presupuesto de investigación entre candidatos explicables; después de la llamada al modelo, la señal de procedencia organiza los hallazgos fuertes en colas revisables. Esta estructura se usó en una investigación real para descubrir CVE-2026-53075, y el resultado central del proyecto no es un algoritmo que determine automáticamente la novedad, sino un workflow práctico de revisión de seguridad con LLM que separa explícitamente la asignación de atención y el triage consciente de procedencia.
.
├── .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
La operación manual detallada se puede consultar en la guía de Codex CLI, la ejecución automática y el triage en la guía de Autopilot y la inteligencia de crashes en la guía de syzbot.
[1] Protect AI, "vulnhuntr," repositorio de GitHub. https://github.com/protectai/vulnhuntr
[2] Google, "syzkaller and syzbot," repositorio de GitHub. https://github.com/google/syzkaller
[3] OpenAI, "Codex CLI." https://developers.openai.com/codex/cli/
Licenciado bajo la Apache License 2.0.