
Herramienta de investigación de vulnerabilidades del kernel de Linux basada en evidencia, utilizada en la investigación de CVE-2026-31720
Herramienta de investigación · Importación original: 3 de abril de 2026 · Revisión de documentación: 11 de julio de 2026
Filosofía central — Señal externa
Deja que las observaciones reproducibles fuera de la inferencia del modelo guíen la atención; nunca confundas prioridad con prueba.
Estado del proyecto. Este repositorio es una versión inicial de un harness de investigación asistido por LLM que construí y usé para la investigación real de vulnerabilidades del kernel de Linux. Esta versión se utilizó para descubrir la vulnerabilidad publicada como CVE-2026-31720. El harness prioriza los objetivos de investigación, pero no prueba vulnerabilidades automáticamente ni garantiza la seguridad del kernel; la validación final y la divulgación las realiza un humano.
Abstract— Explorar una base de código tan grande como el kernel de Linux directamente con un LLM dispersa rápidamente el contexto y confunde fácilmente la existencia de APIs peligrosas con la explotabilidad real. Kernel Codex Harness define este problema no como detección automática de vulnerabilidades, sino como . Este proyecto denomina al principio de controlar la atención del modelo mediante observaciones reproducibles calculadas fuera de la inferencia del LLM. Combina rutas del kernel, límites de userspace, señales estáticas relacionadas con lifetime·usercopy·refcount·size e inteligencia opcional de crashes de syzbot para clasificar archivos candidatos y convertir cada candidato en un paquete de prompts reducido. La revisión manual y el autopilot basado en presupuesto de tiempo utilizan el mismo contrato de respuesta y estado de sesión. Este harness se usó en una investigación real del kernel de Linux para descubrir un stack out-of-bounds write en la ruta de audio del gadget USB; ese defecto se publicó como . Esta implementación no es un analizador estático de precisión, sino un workflow de investigación que limita el alcance del LLM mediante heurísticas explicables; todos los hallazgos requieren revalidación humana de reachability, invariantes rotas e impacto concreto.
Index Terms— Linux kernel, vulnerability research, external signal, LLM orchestration, heuristic prioritization, syzbot, program analysis, Codex.
La revisión de seguridad del kernel de Linux tiene dos tipos de problemas de escala. Primero, todo el árbol fuente es demasiado grande para manejarlo en un solo contexto de LLM. Segundo, señales como copy_from_user, allocators, refcount y locks son comunes, pero por sí solas no implican una vulnerabilidad. El analista primero debe decidir “dónde mirar” y luego probar por separado la reachability desde userspace y las transiciones de estado concretas.
La filosofía central de este proyecto es External Signal.
No dejamos que el LLM decida por sí mismo dónde mirar. Las señales reproducibles fuera de la inferencia del modelo asignan la atención, pero las conclusiones sobre vulnerabilidades se determinan únicamente con evidencia de reachability e invariantes.
Por lo tanto, el harness no hace que el modelo explore vagamente todo el kernel. Prioriza archivos, presenta una sola rama de investigación a la vez y exige primero estructura de evidencia en lugar de conclusiones.
External Signal no es un juicio generado por el LLM, sino una observación determinada antes de la ejecución del modelo y recalculable a partir del mismo árbol fuente, perfil y JSON de syzbot almacenado. Los pesos de ruta, los hits de expresiones regulares y el solapamiento cacheado con syzbot entran en esta categoría. Esta señal se usa solo para clasificar candidatos y para el contexto del prompt; no se promueve a veredicto ni a prueba.
En este documento, External Signal se refiere a toda la filosofía del proyecto. El modelo de datos ExternalSignal en el código representa actualmente solo las señales derivadas de syzbot, por lo que el alcance de ambos términos es diferente.
Los hits de expresiones regulares, las rutas de alto riesgo y el solapamiento con syzbot son señales para el orden de investigación. Una puntuación alta no constituye un hallazgo de seguridad si la ruta de llamada real, los privilegios, la configuración del kernel, el namespace o la disponibilidad del dispositivo no permiten el acceso del atacante.
La auditoría primero verifica los límites que se originan en userspace, como syscall, ioctl, netlink, procfs, filesystems, BPF y hooks de drivers. Solo después evalúa clases de bugs como UAF, OOB, refcount, race, info leak y comprobaciones de capabilities.
Una unidad de investigación se limita, por defecto, a un archivo y sus callers, teardown y rutas de free cercanos. Los follow-ups manuales recomendados por el modelo se permiten como máximo dos veces. Esta limitación no busca reducir la capacidad de exploración, sino mantener las conclusiones dentro de un alcance verificable.
El prompt exige que un hallazgo fuerte explique al menos los siguientes elementos:
Si la evidencia es insuficiente, el modelo devuelve un único objetivo para verificar a continuación en lugar de afirmar con fuerza una vulnerabilidad. Este es un contrato de evidencia a nivel de prompt; el parser actual no verifica automáticamente la completitud de cada evidencia. La ingesta normaliza el veredicto y el siguiente objetivo, por lo que la verificación final de la evidencia es responsabilidad humana.
El flujo de investigación inicial partió de las ideas de análisis por archivo, expansión limitada de contexto y resultados estructurados utilizadas por vulnhuntr de Protect AI [1]. En este proyecto no se aplicó tal cual al análisis de aplicaciones Python, sino que se rediseñó en torno a la superficie del kernel alcanzable desde userspace, el lifetime de objetos del kernel, las rutas de teardown y el solapamiento con syzbot. En particular, separar las señales de priorización de la prueba de vulnerabilidad y verificar la reachability antes que la clase de bug es la decisión de diseño central del harness para kernel.
Fig. 1. La capa de External Signal convierte observaciones calculadas antes de la inferencia del modelo en unidades de revisión clasificadas. Asigna atención, pero no establece prueba de vulnerabilidad.
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·patrón·syzbot |
models.py | Modelos de datos Candidate, Signal y ExternalSignal derivado de syzbot |
bundle.py | Generación de manifest, índice de sesión y bundles de prompt/snippet |
prompting.py | Prompts de auditoría del kernel centrados en reachability e invariantes |
session.py | Almacenamiento de estado de review pendiente, historial y profundidad de follow-up |
ingest.py | Normalización estricta de veredictos y siguiente objetivo |
autopilot.py | codex exec basado en presupuesto de tiempo, logs, archive y gestión de hallazgos |
syzbot.py | Recolección de páginas públicas de syzbot y generación de caché JSON local |
cli.py | Conexión de comandos como scan, inspect, codex, loop, autopilot |
El escáner recorre los archivos .c y .h bajo el directorio include del perfil. La puntuación de prioridad del archivo f se compone conceptualmente de la siguiente manera:
Score(f) = Σ path_weight(f)
+ Σ line_signal_weight(f)
+ Σ syzbot_overlap_weight(f)
Esta puntuación no es una medida de probabilidad ni de explotabilidad. Cada término solo proporciona un orden relativo para que el modelo decida qué archivo revisar primero. La implementación actual suma todas las coincidencias a nivel de línea y limita las señales principales que se muestran en el prompt. El recálculo del mismo resultado presupone el mismo árbol fuente, perfil y JSON de syzbot cacheado. El peso de syzbot se aplica a posteriori a los archivos que ya fueron candidatos mediante las heurísticas de ruta·línea; un hit de syzbot por sí solo no genera nuevos archivos candidatos.
Las principales señales estáticas son:
ioctl, handlers compat, hooks de file operationcopy_from_user, copy_to_user, __userkmalloc, kzalloc, kvmalloc, asignación de caché y rutas de freeLos perfiles integrados son default, net, fs, io_uring, bpf y drivers. El perfil define rutas include, patrones, pesos y la cantidad de señales a conservar por archivo. En lugar de aplicar una única política de puntuación a todo el kernel, se reflejan la superficie de ataque y las características de lifetime de cada subsistema.
syzbot-fetch extrae de las páginas públicas de bugs de syzbot del proyecto syzkaller [2] el título, subsistema, tipo de bug e información de file:line, y lo guarda en una caché JSON. El solapamiento exacto de archivos es una External Signal fuerte; el solapamiento de subsistema es una External Signal débil. Como el dashboard en vivo puede cambiar, la unidad de reproducción es el JSON guardado en el momento de la descarga. La información de crashes es solo un punto de partida para la búsqueda de variantes, no se trata como prueba de una nueva vulnerabilidad.
scan genera un manifest de candidatos clasificados y un bundle de prompts principales. Cada prompt incluye la ruta objetivo, la razón de la puntuación, las señales de línea, el contexto de syzbot y el procedimiento de auditoría.
La respuesta del modelo se normaliza a uno de los siguientes veredictos:
cve_candidateplausible_security_buglatent_bugnot_cve_candidateneeds_more_contextLa respuesta incluye un único Single best next target y un resumen breve. Las respuestas antiguas sin objetivo pendiente se archivan por separado y no se conectan a nuevos objetivos.
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 .
Los JSON de perfiles integrados se incluyen en el wheel. Las reglas JSON externas se pueden pasar 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 es la cantidad de candidatos que se mantienen en el manifest; --top es la cantidad de bundles de prompt que se generan por adelantado. Los bundles de rangos posteriores también se pueden generar bajo demanda.
kernel-harness autopilot artifacts/session-YYYYMMDDTHHMMSSZ \
--duration 30m \
--per-run-timeout 10m \
--include-snippet
El sandbox por defecto es read-only. Solo se debe especificar --sandbox workspace-write si la modificación de archivos es estrictamente necesaria durante el análisis.
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/
Esta versión no se quedó en una prueba de concepto; se usó en 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-31720 | Audio de gadget USB · drivers/usb/gadget/function/f_uac1_legacy.c | La longitud de solicitud controlada por el host podía desbordar un objeto de pila de cuatro bytes | Hallazgo surgido durante una investigación asistida por v1; la validación y la divulgación siguieron siendo lideradas por humanos |
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 verificación no es un benchmark de precisión de detección, sino que se centra en la regresión de la implementación y su capacidad de despliegue.
TABLA III — ALCANCE DE VERIFICACIÓN DE INGENIERÍA
| Elemento de verificación | Propiedad esperada |
|---|---|
| Regresión de allocator | Detección de kmalloc y kvmalloc como señal de allocator |
| Recursos de perfil | Carga de los 6 perfiles integrados desde el checkout del código fuente; smoke-test del perfil default desde el wheel instalado |
| Contrato de veredicto | No confundir not_cve_candidate con un hallazgo positivo |
| Política de follow-up | Permitir dos follow-ups manuales; bloquear la tercera solicitud |
| Manejo de respuestas obsoletas | Archivar respuestas sin objetivo pendiente y no reutilizarlas |
| Valor seguro por defecto | El sandbox de autopilot por defecto es read-only |
| Matriz de CI | Ejecución de la suite de regresión en Python 3.11 y 3.12 |
python -m unittest discover -s tests -v
GitHub Actions ejecuta las regresiones unitarias, luego instala el wheel en un entorno nuevo y hace un smoke-test del escaneo con el perfil default. El caso público anterior es un resultado operativo obtenido en una investigación real, pero no es un benchmark de precisión, recall ni tasa de descubrimiento de CVEs medido sobre un corpus representativo de árboles de Linux.
read-only por defecto.--dangerously-bypass-approvals-and-sandbox.Desde la primera versión registrada en el historial de Git, el objetivo estuvo más cerca de “controlar qué código revisar primero y qué evidencia exigir” que de “hacer que el LLM encuentre vulnerabilidades por sí solo”. La investigación asistida por v1 que descubrió CVE-2026-31720 proporcionó un caso de aplicación real de la unidad de investigación reducida y el contrato de evidencia. v2 extendió este workflow hasta un triage consciente de procedencia que conserva el estado del repositorio junto con referencias conocidas. Si lo reimplementara hoy, priorizaría lo siguiente:
review y runner para eliminar la duplicación entre CLI y autopilot,Aun así, el principio central que quiero conservar es External Signal. No dejar que el LLM explore vagamente toda la base de código; repetir unidades de investigación reducidas por señales externas al modelo, centradas en reachability e invariantes.
Kernel Codex Harness no reemplaza la detección de vulnerabilidades del kernel de Linux. En cambio, convierte External Signal en una clasificación explicable y limita la revisión del LLM a un proceso de investigación corto y con estado. Esta estructura se usó en una investigación real para descubrir CVE-2026-31720. El resultado central del proyecto no es afirmar un nuevo algoritmo de análisis, sino definir la revisión de seguridad con LLM como un problema de asignación de atención por señal externa, contrato de evidencia y orquestación reproducible, y aplicarlo a un workflow de investigación 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
Los procedimientos operativos detallados están disponibles en docs/.
[1] Protect AI, “vulnhuntr,” GitHub repository. https://github.com/protectai/vulnhuntr
[2] Google, “syzkaller and syzbot,” GitHub repository. https://github.com/google/syzkaller
[3] OpenAI, “Codex CLI.” https://developers.openai.com/codex/cli/
Licenciado bajo la Apache License 2.0.