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.
sshdsin PAM — el paqueteopenssh-serverde Alpine se compila sin PAM;openssh-server-pamconUsePAM notambién. ConUsePAM yes, no está afectado.PasswordAuthentication yes— es el valor por defecto de OpenSSH. Si lo ha cambiado ano, 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 usuarioalpinede 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` | No | La autenticación pasa por PAM, no por `crypt()` en `sshd` |
| Alpine con `PasswordAuthentication no` | No | No se intenta ninguna autenticación por contraseña |
| Debian, Ubuntu, AlmaLinux, Rocky (glibc) | No | La comparación no recibe el valor de error `*` |
| Contenedor Alpine sin `sshd` | No | No 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 definida | No en el primer arranque | El 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
Confirmar que el sistema usa musl
Ejecute
ls /lib/ld-musl*oldd --version 2>&1 | head -1. En Alpine, la respuesta menciona musl. En glibc, no hay nada que hacer para este fallo.Anotar la versión de OpenSSH y la variante PAM
apk info -vv | grep '^openssh'lista los paquetes instalados. Anote siopenssh-server-pamestá presente y reviseUsePAMen/etc/ssh/sshd_config.Leer la configuración realmente aplicada
sshd -T | grep -i -E 'passwordauthentication|usepam|permitrootlogin'muestra los valores efectivos, incluidos los de los bloquesMatchy los archivos incluidos. Una línea leída en el archivo no sustituye este control.Listar las cuentas con `*` y las cuentas con contraseña real
awk -F: '$2=="*" {print $1}' /etc/shadowda las cuentas sin contraseña;awk -F: '$2 ~ /^\$[56]\$/ {print $1}' /etc/shadowda las que tienen un hash. Si ninguna de las dos listas está vacía, se cumplen las condiciones 4 y 5.Actualizar el paquete
apk upgrade -U -ainstala la versión corregida. Alpine ha publicado paquetes corregidos para todas sus ramas, hasta la 3.16, incluidas las que ya no tienen soporte.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.Comprobar el resultado
Vuelva a leer
apk info -vv | grep '^openssh'y despuéssshd -T | grep -i passwordauthentication. A continuación, abra una conexión con clave desde otro equipo para verificar que el acceso funciona.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
| Rama | Paquete openssh corregido | Versión de la rama |
|---|---|---|
| edge | 10.6_p2-r0 | — |
| 3.24 | 10.3_p1-r2 | 3.24.4 |
| 3.23 | 10.2_p1-r1 | 3.23.8 |
| 3.22 | 10.0_p1-r11 | 3.22.8 |
| 3.21 | 9.9_p2-r1 | 3.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_keysde la cuenta (permisos600, directorio700) y vuelva a leersshd -T | grep -i pubkeyauthentication. No cierre la sesión de origen antes de tener una segunda conexión que funcione.Bad configuration optionseguido 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 -tla 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 conssh-keygen -Ay vuelva a lanzar el servicio.- El demonio sigue respondiendo con la versión antigua — actualizó el paquete sin reiniciar.
rc-service sshd restarty 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.