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 restart

Le 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 passwordauthentication

Le 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 ssh2

dans /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.