Tutorial

Seguridad y monitorización

OpenSSH 10.6p2: evasión de contraseña en Alpine

El 5 de noviembre de 2026, OpenSSH 10.6p2 corrigió una evasión de la autenticación por contraseña que afecta a los sistemas Linux con musl cuyo `sshd` está compilado sin PAM, empezando por Alpine. Una contraseña de 257 a 1024 bytes basta para entrar en una cuenta que no tiene ninguna, si otra cuenta de la máquina sí la tiene. Los sistemas Debian, Ubuntu y AlmaLinux no están afectados. Aquí tiene las cinco condiciones, el procedimiento de comprobación, los paquetes corregidos por rama de Alpine y los rastros que conviene buscar en los registros, incluidos sus contenedores y sus imágenes.

9 min de lectura8 pasos
Contenido· Lo que dicen OpenSSH y Alpine, y lo que no dicen1/11
  1. 01Lo que dicen OpenSSH y Alpine, y lo que no dicen
  2. 02Las cinco condiciones, todas necesarias
  3. 03Por qué basta una contraseña de 257 bytes
  4. 04Quién está afectado y quién no
  5. 05«Uso Debian o Ubuntu: ¿me afecta?»
  6. 06Comprobar su exposición y después corregir
  7. 07Los paquetes corregidos por rama de Alpine
  8. 08Buscar rastros antes de concluir que todo está en orden
  9. 09Solución de problemas: lo que puede ver al aplicar la corrección
  10. 10Mensajes y remedios
  11. 11Lo que este fallo dice de su parque

Lo que dicen OpenSSH y Alpine, y lo que no dicen

OpenSSH 10.6p2 se publicó el 5 de noviembre de 2026. Sus notas de versión anuncian la corrección de una evasión de la autenticación por contraseña, explotable a través de sshd, en ciertos sistemas Linux compilados sin PAM. Ese mismo día, Alpine Linux publicó un aviso que detalla el mecanismo, las condiciones y los paquetes corregidos. El fallo fue comunicado por Özgün Kültekin, de Wakefield.

Dos precisiones útiles antes de actuar. Primero, no se había asignado ningún identificador CVE en la fecha del aviso de Alpine; algunos artículos de prensa citan uno, y no lo recogemos por falta de fuente primaria. Segundo, los mantenedores de OpenSSH consideran que la causa raíz está fuera de sshd y han esquivado el problema dentro de sshd: la corrección está, por tanto, en el paquete OpenSSH, no en la biblioteca C. En el momento de escribir, no conocemos ningún informe público de explotación, pero el detalle técnico es público: dé por hecho que habrá escaneos.

Las cinco condiciones, todas necesarias

  • Una biblioteca C musl — es el caso de Alpine y de otros sistemas embebidos que usan musl, como OpenWrt. Debian, Ubuntu, Fedora y AlmaLinux usan glibc y no están afectados.
  • sshd sin PAM — el paquete openssh-server de Alpine se compila sin PAM; openssh-server-pam con UsePAM no también. Con UsePAM yes, no está afectado.
  • PasswordAuthentication yes — es el valor por defecto de OpenSSH. Si lo ha cambiado a no, el fallo no es alcanzable.
  • Una cuenta cuyo campo de contraseña vale * — un usuario creado sin contraseña para conectarse con clave, un usuario de directorio gestionado por musl-nscd, o el usuario alpine de las imágenes cloud oficiales.
  • Al menos otra cuenta con una contraseña real (un hash $5$ o $6$) — basta una sola para exponer todas las cuentas sin contraseña.

Por qué basta una contraseña de 257 bytes

Sin PAM, sshd calcula el hash de la contraseña introducida con crypt() y compara el resultado con el campo almacenado en /etc/shadow. Para las cuentas cuyo campo es demasiado corto para contener una sal, sshd toma prestada la de otra cuenta, para no revelar por el tiempo de respuesta que un nombre de usuario no tiene contraseña.

En musl, crypt() devuelve la cadena * como valor de error cuando la clave supera los 256 bytes. Pues bien, * es también, en /etc/shadow, el valor de una cuenta sin contraseña. La comparación tiene éxito: la conexión pasa sin que nadie haya adivinado nada. El aviso de Alpine indica la ventana explotable: una contraseña de 257 a 1024 bytes. No es un defecto criptográfico ni una corrupción de memoria, es un error de lógica: un valor de error tomado por un resultado.

Quién está afectado y quién no

Desplace la tabla

Configuración¿Afectado?Por qué
Alpine, `openssh-server`, contraseñas activadas, una cuenta con `*` y una cuenta con `$6$`SíSe cumplen las cinco condiciones
Alpine, `openssh-server-pam` con `UsePAM yes`NoLa autenticación pasa por PAM, no por `crypt()` en `sshd`
Alpine con `PasswordAuthentication no`NoNo se intenta ninguna autenticación por contraseña
Debian, Ubuntu, AlmaLinux, Rocky (glibc)NoLa comparación no recibe el valor de error `*`
Contenedor Alpine sin `sshd`NoNo hay ningún servicio SSH que atacar
Cuenta bloqueada con `!` en lugar de `*`No para esa cuenta`!` no coincide con el valor de error
Imagen cloud oficial de Alpine, sin contraseña definidaNo en el primer arranqueEl aviso la da por explotable en cuanto aparece un hash `$6$`, por ejemplo una contraseña definida desde la consola

«Uso Debian o Ubuntu: ¿me afecta?»

No, no por este fallo: exige musl. Aun así, la objeción merece plantearse, porque la pregunta útil para un parque de servidores está en otra parte: ¿dónde hay Alpine sin haberlo elegido? Una imagen de contenedor que incluye un sshd para depuración, un equipo de red, un router con OpenWrt, una imagen construida con Buildroot o Yocto: todos pueden apoyarse en musl, según cómo se hayan construido. En un VPS con sistema Debian o Ubuntu, la exposición procede de un contenedor Alpine con sshd que usted ejecute en él, no del sistema anfitrión.

Un inventario cabe en dos comandos por máquina: ls /lib/ld-musl* indica si el sistema usa musl, y ps aux | grep sshd indica si hay un servicio SSH en marcha. Hágalo también en sus contenedores, porque una imagen reconstruida el año pasado puede incluir todavía el paquete antiguo.

Comprobar su exposición y después corregir

  1. Confirmar que el sistema usa musl

    Ejecute ls /lib/ld-musl* o ldd --version 2>&1 | head -1. En Alpine, la respuesta menciona musl. En glibc, no hay nada que hacer para este fallo.

  2. Anotar la versión de OpenSSH y la variante PAM

    apk info -vv | grep '^openssh' lista los paquetes instalados. Anote si openssh-server-pam está presente y revise UsePAM en /etc/ssh/sshd_config.

  3. Leer la configuración realmente aplicada

    sshd -T | grep -i -E 'passwordauthentication|usepam|permitrootlogin' muestra los valores efectivos, incluidos los de los bloques Match y los archivos incluidos. Una línea leída en el archivo no sustituye este control.

  4. Listar las cuentas con `*` y las cuentas con contraseña real

    awk -F: '$2=="*" {print $1}' /etc/shadow da las cuentas sin contraseña; awk -F: '$2 ~ /^\$[56]\$/ {print $1}' /etc/shadow da las que tienen un hash. Si ninguna de las dos listas está vacía, se cumplen las condiciones 4 y 5.

  5. Actualizar el paquete

    apk upgrade -U -a instala la versión corregida. Alpine ha publicado paquetes corregidos para todas sus ramas, hasta la 3.16, incluidas las que ya no tienen soporte.

  6. Reiniciar el servicio; sin ello, nada queda corregido

    rc-service sshd restart. La actualización del paquete no sustituye al demonio en ejecución: mientras no se reinicie, responde el código antiguo. Mantenga una sesión abierta durante el reinicio y pruebe una segunda conexión antes de cerrarla.

  7. Comprobar el resultado

    Vuelva a leer apk info -vv | grep '^openssh' y después sshd -T | grep -i passwordauthentication. A continuación, abra una conexión con clave desde otro equipo para verificar que el acceso funciona.

  8. Reconstruir las imágenes

    Una imagen de contenedor o una imagen de VM no se corrige sobre el terreno: reconstrúyala a partir de una base corregida y vuelva a desplegarla. Anote la fecha de la corrección en el expediente del entorno.

Los paquetes corregidos por rama de Alpine

Desplace la tabla

RamaPaquete openssh corregidoVersión de la rama
edge10.6_p2-r0—
3.2410.3_p1-r23.24.4
3.2310.2_p1-r13.23.8
3.2210.0_p1-r113.22.8
3.219.9_p2-r13.21.10
3.20 y anteriores (hasta la 3.16)9.7_p1-r6 (3.20) ; 9.0_p1-r6 (3.16)Ramas sin soporte

Buscar rastros antes de concluir que todo está en orden

Una corrección suprime el fallo; no borra lo que un atacante haya hecho antes. El aviso de Alpine recomienda buscar, en /var/log/messages, las líneas Accepted password for que afecten a cuentas que se supone que no tienen contraseña: alpine, root o un usuario reservado a las conexiones con clave. Una línea así es un indicio fuerte, ya que esas cuentas nunca deberían conectarse con contraseña.

Para las cuentas que aparezcan, revise después el uso de doas, los usuarios creados recientemente, los archivos modificados y el contenido de cada authorized_keys. El aviso no deja dudas sobre la conducta a seguir: si no puede descartar una conexión, trate la máquina como comprometida, reconstrúyala y renueve los secretos que contenía. En las imágenes cloud oficiales el riesgo es mayor: el usuario alpine dispone allí de doas sin contraseña, lo que permite pasar a root una vez dentro.

¿No puede actualizar de inmediato? Desactive la autenticación por contraseña, tras comprobar que una conexión con clave funciona y manteniendo abierta la sesión actual. Alpine propone un archivo en /etc/ssh/sshd_config.d/ con PasswordAuthentication no (el directorio se lee por defecto desde la 3.19), siempre que no quede ninguna línea PasswordAuthentication yes en un bloque Match. Termine con sshd -t, un reinicio y después sshd -T | grep -i passwordauthentication, que debe mostrar passwordauthentication no. Para deshacerlo, elimine ese archivo.

Solución de problemas: lo que puede ver al aplicar la corrección

Los mensajes siguientes son los de OpenSSH; aparecen en el cliente, en el terminal, y en el servidor, en el registro del servicio.

Mensajes y remedios

  • Permission denied (publickey). — tras cortar las contraseñas, su clave no es aceptada. Mantenga la sesión abierta, revise ~/.ssh/authorized_keys de la cuenta (permisos 600, directorio 700) y vuelva a leer sshd -T | grep -i pubkeyauthentication. No cierre la sesión de origen antes de tener una segunda conexión que funcione.
  • Bad configuration option seguido de un nombre, con un número de línea de /etc/ssh/sshd_config — una errata en el archivo o en el archivo incluido. sshd -t la señala antes del reinicio: no reinicie nunca sin ese control.
  • sshd: no hostkeys available -- exiting. — faltan las claves de host, por ejemplo en una imagen donde no se generaron. Genérelas con ssh-keygen -A y vuelva a lanzar el servicio.
  • El demonio sigue respondiendo con la versión antigua — actualizó el paquete sin reiniciar. rc-service sshd restart y después vuelva a leer la versión anunciada al conectar.

Lo que este fallo dice de su parque

No procede de una mala práctica espectacular: una cuenta sin contraseña, otra con contraseña, un valor por defecto. Cada una de esas decisiones es habitual, y es su combinación en un sistema poco frecuente lo que crea la exposición. La respuesta duradera es la misma de antes del fallo: en todo servidor accesible desde Internet, autentíquese con clave, desactive las contraseñas y sepa qué imágenes y qué contenedores incluyen un sshd.

Si ya ha reforzado sus accesos, esta alerta se resuelve en diez minutos por máquina. Si no, es la ocasión de hacerlo: el procedimiento completo se describe en nuestra guía del primer acceso SSH, y la actualización de OpenSSH 10.6 sin perder el acceso, en el artículo dedicado a esa versión. Un VPS ServOrbit le da acceso root y la elección del sistema, lo que le deja el control de estos parámetros.

Un servidor cuyos accesos controla usted

En un VPS ServOrbit tiene el acceso root, la elección del sistema y el control de la configuración SSH: claves, contraseñas desactivadas y actualizaciones a su ritmo.