Cómo proteger tu servidor Linux frente a CVE-2026-46333 (carrera de salida en ptrace / ssh-keysign-pwn)

¿Qué es CVE-2026-46333?

CVE-2026-46333, conocido como ptrace exit-race o ssh-keysign-pwn, es una vulnerabilidad de divulgación de información en el kernel de Linux que en la práctica equivale a una escalación de privilegios. Fue divulgada el 15 de mayo de 2026.

El fallo está en la comprobación de acceso de ptrace durante el camino de salida de procesos. Entre el momento en que el descriptor de memoria de la tarea se desvincula y el momento en que se cierra su tabla de descriptores de archivo, la comprobación de ptrace omite la salvaguarda dumpable porque el descriptor de memoria ya es NULL. Durante esa ventana un atacante local sin privilegios usa pidfd_getfd(2) (disponible en kernels 5.6 o superiores) para copiar descriptores de archivo desde procesos privilegiados que están saliendo.

Los objetivos principales son binarios SUID que abren archivos sensibles en su rutina de salida: ssh-keysign (claves privadas del host SSH) y chage (base de datos de contraseñas /etc/shadow). Con esos contenidos un atacante puede impersonar al host SSH o crackear hashes de root.

Existe prueba de concepto pública. Los parches están en desarrollo activo en el árbol upstream (commit 31e62c2ebbfd).

¿Te afecta?

La vulnerabilidad existe en cualquier kernel con el bug, pero solo es explotable en la práctica sobre kernels que incluyan pidfd_getfd(2) (Linux 5.6 o superior):

  • Explotable: CloudLinux 8 LTS, CloudLinux 9, CloudLinux 10, AlmaLinux 9, AlmaLinux 10, Rocky Linux 9/10, RHEL 9/10, Ubuntu y Debian modernos.
  • Vulnerable pero no explotable (kernel 4.18 sin pidfd_getfd): CloudLinux 7h, CloudLinux 8 base.
  • No afectado: CloudLinux 7.

Los entornos con CageFS activo están protegidos para sus inquilinos enjaulados (los binarios SUID objetivo no existen dentro del jaula). La mitigación a nivel de host sigue siendo necesaria.

Cómo comprobar si tu servidor está vulnerable

Verifica la versión del kernel:

uname -r

Confirma si pidfd_getfd está expuesto al espacio de usuario (sin él, el exploit público no funciona):

grep -w __NR_pidfd_getfd /usr/include/asm-generic/unistd.h 2>/dev/null || \
  grep -w __NR_pidfd_getfd /usr/include/x86_64-linux-gnu/asm/unistd_64.h 2>/dev/null

Cómo mitigar

Opción Ideal para ¿Reinicio? ¿Duradero?
Instalar kernel parcheado del vendor Todos, solución a largo plazo
Livepatch de KernelCare Servidores con KernelCare No
Sysctl kernel.user_ptrace=0 Servidores CloudLinux mientras esperan el parche No Temporal
Quitar SUID de ssh-keysign y chage Defensa en profundidad No

Opción A: kernel parcheado del vendor

Versiones mínimas con la corrección (las restantes ramas están en desarrollo al momento de publicar este artículo):

  • AlmaLinux / CloudLinux / Rocky 9: kernel-5.14.0-611.54.6.el9_7
  • AlmaLinux / CloudLinux / Rocky 10: kernel-6.12.0-124.56.5.el10_1
  • CloudLinux 8 LTS, CloudLinux 7h y CloudLinux 8: parches en desarrollo, sigue el aviso del fabricante.

Aplica la actualización y reinicia:

dnf -y update 'kernel*'
reboot

Opción B: livepatch de KernelCare

El livepatch está en construcción al momento de publicar este artículo. Cuando esté disponible:

kcarectl --update
kcarectl --patch-info | grep CVE-2026-46333

Opción C: sysctl kernel.user_ptrace=0 (servidores CloudLinux)

Este sysctl específico de CloudLinux deshabilita la capacidad de los usuarios sin privilegios de adjuntar ptrace a sus propios procesos, bloqueando el camino de explotación a nivel del kernel:

sysctl -w kernel.user_ptrace=0

Para persistir el ajuste tras un reinicio:

echo 'kernel.user_ptrace = 0' > /etc/sysctl.d/99-ptracenull.conf
sysctl --system

Coste: los usuarios sin privilegios no podrán usar gdb -p, strace -p ni herramientas similares sobre sus propios procesos. Para la mayoría de servidores de producción esto es aceptable.

Opción D: quitar SUID a los binarios objetivo (defensa en profundidad)

Reduce la superficie de ataque eliminando el bit SUID de los binarios que abren archivos sensibles en su salida:

chmod u-s /usr/libexec/openssh/ssh-keysign 2>/dev/null
chmod u-s /usr/bin/chage

No cubre todos los binarios SUID-root del sistema, pero corta los dos vectores conocidos del PoC público. Es complementario, no sustituye al kernel parcheado.

Después de mitigar

  1. Confirma el kernel en ejecución con uname -r.
  2. Si aplicaste el sysctl, verifica:
    sysctl kernel.user_ptrace
  3. Si tu servidor estuvo expuesto a usuarios no privilegiados sin parche, rota las claves del host SSH y fuerza el cambio de contraseñas de root y de cuentas con privilegios:
    rm /etc/ssh/ssh_host_*
    dpkg-reconfigure openssh-server   # Debian/Ubuntu
    sshd-keygen                       # familia RHEL
    systemctl restart sshd
  4. Distribuye las nuevas huellas del host (ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub) a tus usuarios y herramientas de monitorización.

¿Necesitas ayuda?

Abre un ticket en soporte.telecu.cloud y menciona la referencia: CVE-2026-46333.

Fuentes

Etiquetas