
Analiza CVE-2026-31431, una vulnerabilidad AF_ALG AEAD del kernel de Linux, proporcionando un detector seguro, un exploit LPE de laboratorio y un laboratorio de kernels A/B basado en QEMU para su verificación.
algif_aead del kernel Linux: AnálisisInvestigación de seguridad sobre CVE-2026-31431 (CVSS 3.1 7.8 ALTO,
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H): tres fallos de diseño
componibles en la cadena AF_ALG AEAD se combinan en una escritura
determinista y sin condiciones de carrera de 4 bytes en la caché de páginas en cualquier desplazamiento de cualquier archivo legible — la copia en disco permanece limpia, por lo que las sumas de verificación en disco no ven nada.
El exploit público ("Copy Fail", Theori/Xint) lo convierte en root
local (LPE) con 732 bytes de Python; el fallo estuvo presente en todos los kernels
de 2017 a 2026.
72548b093ee3 (2017) hizo que _aead_recvmsg descifrara in situ,
encadenando las páginas de etiqueta de la solicitud en el SGL de destino escribible.splice(archivo → pipe → socket) alimenta esas ranuras de etiqueta con las
páginas de caché de páginas de cualquier archivo legible (copia cero).authencesn escribe su scratch ESN de 4 bytes — el valor viaja en
de la carga útil de sendmsg — exactamente en
, es decir, el primer byte de etiqueta: el desplazamiento
de archivo que elijas. Se dispara de la verificación de etiqueta, por lo que incluso una
solicitud realiza la escritura.AAD[4..8)dst[assoclen + cryptlen]-EBADMSG| Afirmación | Evidencia |
|---|---|
| Causa raíz derivada de los commits de corrección y las fuentes del kernel, no de blogs | finding-sheet |
| Decodificación del PoC público verificada de extremo a extremo contra la secuencia de syscalls | finding-sheet |
| Kernels A/B de laboratorio con delta = exactamente el commit de corrección, ambos arrancan | lab/scripts/build.sh + lab/out/ab-diffstat.txt |
El kernel vulnerable ejecuta el descifrado AEAD authencesn vía AF_ALG (smoke) | lab/scripts/run.sh vuln → SMOKE=ok |
Reversión sin acompañante provoca panic en crypto_authenc_esn_decrypt (hallazgo original) | lab/scripts/run.sh patched → NULL deref, reproducible |
| Detector seguro: VULNERABLE en vuln (la escritura se dispara a pesar de EBADMSG, el disco permanece LIMPIO), NO-DETECTADO en corrección completa | poc/detector.c en el laboratorio → líneas DETECTOR-RESULT |
| Cierre de LPE en laboratorio: uid 1000 parchea 4 bytes de caché de páginas de un binario SUID y lee el flag solo-root; copia en disco probada pristina mediante lectura debugfs a nivel de bloque | poc/lpe.c + lab/rootfs/tools/secretgate.c → LPE-RESULT: ROOT-FLAG-CAPTURED, DISKCLEAN=ok |
| Reproducir la escritura pública en caché de páginas en un laboratorio fijado, con atribución | salida del detector anterior + lab README |
| Estrés SGL: 5 formas en ambos kernels — sin crash, sin cuelgue del kernel (negativo honesto) + dos peculiaridades documentadas del contrato AF_ALG | poc/sgl-stress.c en el laboratorio → líneas SGL-STRESS |
# compilar los tres kernels + herramientas + disco de sonda en Docker (~15 min la primera vez)
lab/scripts/build.sh
# arrancar el oráculo A/B/C (QEMU en Docker, KVM si está disponible)
lab/scripts/run.sh vuln # DETECTOR VULNERABLE + LPE ROOT-FLAG-CAPTURED + DISKCLEAN=ok
lab/scripts/run.sh patchedfull # DETECTOR NO-DETECTADO + LPE NO-VULNERABLE
lab/scripts/run.sh patched # NULL deref de authencesn (brecha de corrección acompañante)
La cadena completa de escritura en caché de páginas sigue el enfoque publicado de
Theori / Xint Code ("Copy Fail", los reporteros acreditados) con
atribución — ver la sección de trabajo previo del finding-sheet. Trabajo original en este repositorio: el mapa de mecánica anclado al commit de corrección,
el hallazgo de la serie de corrección incompleta (el panic de authencesn
por reversión sin acompañante y su ventana de release estable), el
detector diferencial seguro caché-de-páginas-vs-disco que nunca toca archivos que no
poseemos, el cierre de LPE en laboratorio contra un objetivo SUID construido
específicamente (secretgate — nunca se ataca ningún binario del mundo real), la exploración
de bordes SGL (resultado negativo honesto más dos peculiaridades documentadas del
contrato AF_ALG), y la atribución de rama verificada de los ocho commits
de corrección.
| Doc | Qué es |
|---|---|
| docs/finding-sheet.md | Hoja de datos de una página: versiones, CVSS, causa raíz, commits de corrección, superficie de ataque |
| docs/report-ptes.md | Informe estructurado PTES (7 fases) con evidencia de laboratorio |
| docs/research-writeup.md | La narrativa de la investigación — metodología, callejones sin salida, lecciones portables, comparación con trabajo previo |
docs/ hoja de hallazgos · informe PTES · writeup de investigación
poc/ detector.c (oráculo seguro) · lpe.c (LPE en laboratorio) · sgl-stress.c (exploración SGL)
lab/ laboratorio de kernels QEMU: 5.15.203 ± corrección (A/B) + post-acompañante 5.15.y (C)
lab/rootfs/ secretgate.c — objetivo SUID construido específicamente (lo único que se ataca jamás)
72548b093ee3 "crypto: algif_aead - copy AAD from src to dst" (2017)a664bf3d603d "crypto: algif_aead - Revert to operating out-of-place"
(+ 8 backports estables — ver finding-sheet)Artefacto de investigación educativa. Ejecutar solo contra sistemas que poseas o para los que estés explícitamente autorizado a probar. La vulnerabilidad está parcheada — ejecuta un kernel actualizado de las ramas estables de 2026 o posteriores.