
Detector y prueba de concepto para una vulnerabilidad de escritura en la caché de páginas del kernel de Linux (CVE-2026-31431) en algif_aead, que incluye un escáner no destructivo y un exploit de escalada de privilegios local.
Este repositorio contiene el detector y el PoC para la vulnerabilidad de scratch-write en la caché de páginas de algif_aead / authencesn de Linux, CVE-2026-31431.
Artículo de divulgación: https://xint.io/blog/copy-fail-linux-distributions
Úselo únicamente en máquinas que le pertenezcan o para las que tenga autorización explícita. El detector no es destructivo y solo opera con archivos centinela en directorios temporales; el PoC y el LPE modifican el estado de la caché de páginas en memoria, lo que constituye una técnica real de escalada de privilegios local, y su ejecución sin autorización suele ser ilegal.
algif_aead ejecuta operaciones AEAD in situ, es decir, req->src == req->dst. Cuando los datos de entrada se envían desde un archivo normal mediante splice(), el scatterlist de destino incluye referencias a las páginas de caché de ese archivo, lo que permite que el kernel pueda escribir en la copia de la caché de páginas del archivo.
authencesn(hmac(sha256),cbc(aes)) realiza un scratch-write de 4 bytes en el campo seqno_lo del AAD (bytes 4 a 7 del AAD). Combinado con el AEAD in situ y la ruta de splice() mencionados, un atacante puede hacer que esos 4 bytes caigan en la página de caché de un archivo legible.
Esta modificación no se escribe de vuelta al disco; solo afecta a la caché de páginas actual del kernel. Por lo tanto, el contenido del archivo en disco no cambia, pero los lectores que compartan esa caché de páginas verán el contenido contaminado. Archivos legibles por todos como /etc/passwd y /usr/bin/su pueden ser objetivos.
Se requiere tener instalado el toolchain de Rust y Cargo en la máquina.
Compilar todos los binarios Rust:
cargo build --release --bins
Al finalizar la compilación se generará:
target/release/cve_2026_31431_detector
target/release/cve_2026_31431_poc
Si el repositorio requiere enviar archivos precompilados, colóquelos en:
dist/linux-x86_64/cve_2026_31431_detector
dist/linux-x86_64/cve_2026_31431_poc
dist/linux-x86_64/SHA256SUMS
No envíe todo el directorio target/; contiene artefactos intermedios de Cargo y caché local.
Compilar solo el detector no destructivo:
cargo build --release --bin cve_2026_31431_detector
Compilar solo la versión Rust de poc.py:
cargo build --release --bin cve_2026_31431_poc
Se recomienda el detector Rust no destructivo:
./target/release/cve_2026_31431_detector
echo $?
También se puede ejecutar directamente con Cargo:
cargo run --release --bin cve_2026_31431_detector
echo $?
Uso del detector Python:
python3 test_cve_2026_31431.py
echo $?
Significado de los códigos de salida:
| Código de salida | Significado |
|---|---|
0 | No se detectó la vulnerabilidad, o no se cumplen las condiciones previas, por ejemplo, / no está disponible. |
Interpretación común de la salida:
Operaciones que realiza el detector:
AF_ALG y authencesn(hmac(sha256),cbc(aes)) están disponibles.sendmsg y establece el seqno_lo del AAD al marcador PWND.splice(), envía la página de caché del archivo centinela al op socket de AF_ALG.recv() para impulsar la ejecución del algoritmo.El detector no modifica /usr/bin/su, /etc/passwd ni otros archivos del sistema. El archivo centinela temporal se elimina al salir.
Versión Rust de poc.py:
./target/release/cve_2026_31431_poc
o:
cargo run --release --bin cve_2026_31431_poc
Nota: este PoC abre /usr/bin/su según la lógica de poc.py, contamina su copia en la caché de páginas mediante la primitiva de la vulnerabilidad y luego ejecuta su. No es un flujo de detección no destructivo; solo debe ejecutarse en entornos de prueba autorizados.
python3 exploit_cve_2026_31431.py
python3 exploit_cve_2026_31431.py --shell
Este script busca el campo UID del usuario actual en /etc/passwd e intenta cambiar el UID en la caché de páginas a 0000. El /etc/passwd en disco no se modifica, pero los procesos del sistema que lean la caché de páginas pueden ver el contenido contaminado.
Limitaciones:
1000 a 9999.nscd, sssd y systemd-userdbd, pueden enmascarar los cambios en la caché de páginas de /etc/passwd./etc/passwd debe permanecer presente entre el parche y la ejecución de su.Limpiar la caché de páginas:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
Si ya se obtuvo una shell root, también se puede ejecutar:
echo 3 > /proc/sys/vm/drop_caches
Reiniciar también elimina el estado de la caché de páginas.
Hasta que el kernel de la distribución sea corregido, se puede deshabilitar algif_aead:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
Tras aplicar la mitigación, el detector normalmente debería mostrar 检测结论:未发现漏洞 e indicar que no se cumplen las condiciones previas de activación, con código de salida 0.
La idea de la corrección upstream es restaurar la operación AEAD de no in situ a in situ, evitando que las páginas de caché entren en un scatterlist de destino escribible.
| Archivo | Descripción |
|---|
test_cve_2026_31431.py | Detector Python no destructivo. Solo opera con archivos centinela temporales y no toca archivos del sistema. |
src/main.rs | Detector Rust no destructivo. La lógica de detección y los códigos de salida coinciden con el detector Python. |
src/bin/poc.rs | Versión Rust de poc.py. Contamina la caché de páginas de /usr/bin/su y ejecuta su. |
poc.py | PoC en Python. |
exploit_cve_2026_31431.py | LPE en Python. Intenta obtener una shell root contaminando la caché de páginas de /etc/passwd. |
AF_ALGauthencesn2 | Se detectó que es vulnerable a CVE-2026-31431. |
1 | Error durante el proceso de prueba; el resultado no puede usarse como criterio de vulnerabilidad. |
| Salida | Conclusión |
|---|
检测结论:未发现漏洞 | No se detectó la vulnerabilidad, o no se cumplen las condiciones previas de activación. |
检测结论:存在 CVE-2026-31431 漏洞 | El marcador PWND cayó correctamente en la página de caché spliced; existe la vulnerabilidad. |
检测结论:存在疑似 CVE-2026-31431 漏洞 | La caché de páginas fue modificada; incluso si el marcador no cayó en la posición esperada, debe considerarse afectado. |
测试过程出错,无法判断是否存在漏洞 | Fallo en la detección, código de salida 1; se debe investigar según el mensaje de error y volver a ejecutar. |