
Kit educativo y defensivo para dos LPE de Linux por corrupción de page-cache (DirtyClone CVE-2026-43503, pedit COW CVE-2026-46331): endurecimiento, detección, verificación, seccomp + harness de validación. Solo detección y prevención — sin código de explotación. TLP:CLEAR.
Detecta, contiene y verifica defensas contra dos escaladas locales de privilegios por corrupción del caché de páginas (page cache) de Linux — DirtyClone (CVE-2026-43503) and pedit COW (CVE-2026-46331) — en hosts y contenedores.
Este es un kit de seguridad educativo y defensivo. Explica cómo funcionan ambas vulnerabilidades a nivel de llamadas al sistema (syscalls) e incluye herramientas de endurecimiento, detección, verificación y seccomp — además de un banco de pruebas de validación que demuestra que las herramientas funcionan en kernels reales. No contiene exploits, shellcode ni offsets de objetivo, por diseño.
Ambos CVE permiten que un usuario local sin privilegios se convierta en root corrompiendo el caché de páginas (la copia en RAM)
de un binario setuid-root como /usr/bin/su — sin tocar jamás el archivo en disco. Eso los hace
sigilosos: el monitoreo de integridad de archivos permanece en verde, la forensia de disco no encuentra nada y la
corrupción desaparece al reiniciar.
Parchear el kernel es la solución real. Pero durante la ventana de implementación — y como defensa en profundidad después — necesitas cerrar las vías de ataque, vigilar la cadena de ataque y verificar tu postura. Eso es lo que proporciona este kit, con cada control mapeado de vuelta a un paso documentado de la cadena de explotación para que puedas ver por qué funciona.
Ambos fallos son de la misma clase de defecto: el kernel escribe en un buffer que cree privado mientras ese buffer sigue respaldado por memoria de caché de páginas compartida y respaldada por archivos. Dos compuertas estructurales gobiernan cada variante de ambas cadenas:
| Compuerta | Qué es | Fortaleza como control |
|---|---|---|
| 1. Ruta de capacidades | CAP_NET_ADMIN obtenida mediante espacios de nombres de usuario sin privilegios (unshare(CLONE_NEWUSER|CLONE_NEWNET)) | Punto de estrangulamiento robusto — todas las variantes deben pasar por aquí, conocidas y desconocidas. Ciérralo primero. |
| 2. Superficie de módulos | Módulos vulnerables: act_pedit, esp4/esp6, rxrpc, xt_TEE, nf_dup_ipv4/nf_dup_ipv6 | Defensa en profundidad — elimina solo las primitivas conocidas; un sumidero novedoso lo evadiría. |
Corregido upstream en versiones puntuales estables (DirtyClone ≥ 6.12.91 / 7.0.10; pedit COW 6.12.94 / 7.0.13) además de backports de los proveedores; mainline 7.1 es la versión final. Confirma tu kernel contra el rastreador de tu distribución — consulta docs/analysis.md §8.
Solo hosts Linux. Estos scripts leen y escriben estado real del kernel. Ejecuta el endurecimiento en un host que controles; ejecuta el banco de pruebas destructivo de validación en una VM desechable. Consulta Requisitos.
# 1. Previsualiza los cambios de contención del host (no escribe nada)
sudo ./kit/harden-pagecache-lpe.sh --dry-run
# 2. Aplica restricciones de userns + bloqueo de módulos vulnerables
sudo ./kit/harden-pagecache-lpe.sh
# 3. Verifica la postura — ejecuta la sonda funcional como un usuario SIN privilegios
sudo -u nobody ./kit/verify-pagecache-lpe.sh # exit: 0=PASS 1=WARN 2=FAIL
# 4. (Opcional) Observa la cadena de ataque en vivo con eBPF
sudo bpftrace ./kit/detect-pagecache-lpe.bt
Para contenedores, aplica la superposición seccomp
(kit/seccomp-pagecache-lpe.json):
docker run --security-opt seccomp=kit/seccomp-pagecache-lpe.json <image>
¿Nuevo aquí? Lee START-HERE.md — un recorrido guiado, estilo clase magistral, desde la
causa raíz hasta una ejecución de validación completa.
.
├── START-HERE.md Recorrido guiado — el punto de entrada recomendado
├── docs/ El "por qué": análisis y orientación para operadores
│ ├── analysis.md Análisis de causa raíz, cadenas de ataque, ingeniería de detección
│ ├── HARDENING-GUIDE.md Guía de contención para operadores (host → systemd → Docker → Kubernetes)
│ └── plain-language-summary.md Resumen más sencillo, en lenguaje claro, de ambos fallos
├── kit/ El "qué ejecutas": cuatro artefactos autónomos
│ ├── harden-pagecache-lpe.sh Aplica contención en el host (sysctl + bloqueos de módulos)
│ ├── verify-pagecache-lpe.sh Comprobación de postura de solo lectura (PASS/WARN/FAIL)
│ ├── detect-pagecache-lpe.bt Telemetría bpftrace/eBPF para la cadena de preparación
│ └── seccomp-pagecache-lpe.json Superposición seccomp para contenedores que deniega las syscalls de la cadena
└── testkit/ La "prueba": banco de pruebas de validación + informe SHOWCASE.md
| Componente | Rol |
|---|---|
docs/analysis.md | Fuente de verdad: causa raíz, cadenas de ataque conductuales, ingeniería de detección, endurecimiento, tabla comparativa. |
docs/HARDENING-GUIDE.md | Contención en capas para hosts, unidades systemd, Docker/Podman y Kubernetes. |
kit/ | Los cuatro entregables. Copia este directorio a un host para defenderlo. |
testkit/ | Validación reproducible en kernels reales (Docker local + EC2 desechable), y SHOWCASE.md — una evaluación honesta de qué demuestran y qué no demuestran las pruebas. |
harden, verify): un host Linux con bash, sysctl, modprobe
y unshare. Root para el endurecimiento; ejecuta la sonda de verificación como usuario no root.detect-pagecache-lpe.bt): root, bpftrace ≥ 0.16 y BTF del kernel
(/sys/kernel/btf/vmlinux). Algunas kprobes pueden estar inline en un kernel determinado — el encabezado del script
explica cómo adaptarse.testkit/): una VM Linux desechable — escribe configuración real y descarga
módulos del kernel. El lanzador de EC2 necesita la CLI de AWS v2 y jq; no se usa SSH (el transporte es AWS
SSM). Los usuarios de macOS pueden ejecutar la prueba de humo local con Docker, pero la validación completa requiere Linux.TLP:CLEAR — distribución pública y sin restricciones. Este repositorio es solo detección y prevención. Incluye deliberadamente: