Contexte et portée
La vulnérabilité concerne le paquet openssh-server fourni par Alpine Linux lorsqu’il est compilé sans PAM, ainsi que openssh-server-pam avec UsePAM no. Elle se manifeste uniquement si PasswordAuthentication est laissé à yes (valeur par défaut) et si le système possède au moins un compte dont le champ mot de passe dans /etc/shadow vaut *. Cette configuration existe sur les images de base depuis Alpine 3.16 (ex. root:*) et sur les utilisateurs créés sans mot de passe (clé‑only). La présence d’un compte avec un hachage $5$ ou $6$ suffit à déclencher le problème.
Les versions testées, de 3.16 à 3.24 et la branche edge, sont toutes affectées. Les conteneurs Docker qui n’exécutent pas sshd, les systèmes désactivant PasswordAuthentication, ou ceux utilisant openssh-server-pam avec UsePAM yes ne le sont pas.
Mécanisme de la faille
Lorsqu’un compte n’a pas de mot de passe, le champ * est trop court pour contenir un sel de hachage. Le démon sshd, construit sans PAM, recourt alors au sel d’un autre compte. La fonction crypt() de la libc musl renvoie la chaîne * comme indicateur d’erreur dès que le mot de passe fourni dépasse 256 octets. Un attaquant envoie donc un mot de passe de 257 à 1024 octets. Le résultat de crypt() est *, identique au champ stocké, et l’authentification aboutit sans aucune connaissance du secret.
Le scénario nécessite une seule connexion, fonctionne à chaque tentative et ne requiert aucun rebond. Un compte disposant d’un hachage $5$ ou $6$ suffit pour rendre tous les comptes * accessibles, y compris root si PermitRootLogin yes est activé ou si un autre compte peut escalader via doas.
Correction et mesures d’atténuation
Alpine a publié des paquets corrigés dans les versions 3.21.10, 3.22.8, 3.23.8 et 3.24.4. La mise à jour s’effectue avec :
apk upgrade -U -a
rc-service sshd restartLe redémarrage du démon est indispensable ; la simple mise à jour du paquet ne remplace pas le processus en cours.
En l’absence de mise à jour, la désactivation de l’authentification par mot de passe bloque la faille :
mkdir -p /etc/ssh/sshd_config.d
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/00-no-passwords.conf
sed -i.bak -e '1i PasswordAuthentication no' \
-e 's/^\(\s*PasswordAuthentication[^y#]*\)yes/\1no/i' \
/etc/ssh/sshd_config
sshd -t && rc-service sshd restart
sshd -T | grep -i passwordauthenticationLe dernier grep doit afficher passwordauthentication no. La suppression du fichier de configuration additionnel et la restauration du fichier d’origine permettent de revenir en arrière.
Détection d’éventuelles compromissions
Une compromission laisse typiquement une entrée du type :
Accepted password for alpine from 203.0.113.5 port 54321 ssh2dans /var/log/messages, où le compte indiqué possède le champ *. Il convient de vérifier les usages récents de doas, les comptes nouvellement créés et les clés autorisées. En l’absence de certitude, le système doit être considéré comme compromis.