Unter Alpine Linux und anderen Systemen, auf denen OpenSSH mit der C-Bibliothek musl und ohne PAM läuft, meldet ein Passwort mit mehr als 256 Bytes bei Konten an, die gar kein Passwort haben. Die Lücke CVE-2026-123158, genannt SSHole, wurde am 5. November behoben, und weniger als einen Tag später hatten Angreifer root auf einem Honeypot. Wer sshd unter Alpine betreibt, sollte jetzt aktualisieren und sshd neu starten.
Was passiert
Konten, die sich nur mit Schlüssel anmelden, haben im Passwortfeld oft einen einzelnen Stern. Nach einer Konvention, die so alt ist wie Unix, ist * nie ein gültiger Hash, also kann kein Passwort dazu passen. Unter Alpine wird root seit etwa Version 3.16 so ausgeliefert, ebenso Benutzer, die mit adduser ohne Passwort angelegt wurden, und der Benutzer alpine der offiziellen Cloud-Images.
Ist sshd ohne PAM gebaut, wie das Paket openssh-server von Alpine, prüft er Passwörter selbst: Er hasht den Versuch mit crypt() und vergleicht das Ergebnis mit dem gespeicherten Feld. Für ein Feld wie *, das kein Salt enthält, leiht er sich das Salt eines anderen Kontos. musls crypt() lehnt bei SHA-256 und SHA-512 Schlüssel mit mehr als 256 Bytes ab und gibt dann als Fehlerzeichen * zurück. Genau das ist für das Konto gespeichert, also geht der Vergleich auf. Gefunden und dem OpenSSH-Projekt gemeldet hat die Lücke Özgün Kültekin von Wakefield.
Der Angreifer braucht den Namen eines solchen Kontos, Zugang zum SSH-Port und auf der Maschine mindestens ein weiteres Konto mit echtem $5$- oder $6$-Hash, weil es sonst kein SHA-Salt zum Ausleihen gibt. Alpine sagt es deutlich: Ein einziger Benutzer mit Passwort genügt, damit jedes Konto ohne Passwort erreichbar ist. Es braucht eine Verbindung, klappt jedes Mal und ohne Raten. Passwörter über 1024 Bytes lehnt sshd selbst ab, daher das Fenster von 257 bis 1024 Bytes.
Der Angreifer bekommt eine Shell mit den Rechten dieses Kontos. root ist durch die OpenSSH-Voreinstellung PermitRootLogin prohibit-password vor Passwort-Logins geschützt und nur mit PermitRootLogin yes direkt erreichbar. Das hilft nichts, wenn ein anderes Konto root werden kann. Die Tiny-Cloud-Images von Alpine von 3.18.11 bis 3.24.3 liefern einen Benutzer alpine mit * und doas ohne Passwort aus. Beim ersten Start sind sie sicher, angreifbar werden sie, sobald irgendein $6$-Hash existiert, etwa weil ein Admin ein Konsolen-Passwort gesetzt oder die User-Data einen Benutzer mit gehashtem Passwort angelegt hat.
Wer betroffen ist
Das ist keine Lücke in OpenSSH überall. glibc-Distributionen wie Debian, Ubuntu oder RHEL hashen anders, und mit PAM läuft die Passwortprüfung gar nicht durch diesen Code. Betroffen sind Linux-Systeme, auf denen sshd mit musl läuft und Passwörter selbst prüft. Alpine ist der bekannteste Fall, weil das Standardpaket ohne PAM gebaut ist und OpenSSH Passwort-Logins standardmässig erlaubt. Alpine hat jede Version von 3.16 bis 3.24 und edge geprüft, alle sind betroffen.
musl steckt nicht nur in Alpine. Es ist auch die C-Bibliothek von OpenWrt und eine häufige Wahl in Firmware, die mit Buildroot oder Yocto gebaut wird, also in Routern, Appliances und eingebetteten Geräten. OpenWrt nutzt standardmässig Dropbear, das nicht betroffen ist, aber jedes Gerät, das OpenSSH mit musl und ohne PAM mitbringt, verdient einen Blick. Container auf Basis von Alpine sind nur gefährdet, wenn darin sshd läuft, was bei den meisten nicht der Fall ist.
Wie es dazu kam
Das OpenSSH-Projekt sieht die eigentliche Ursache ausserhalb von sshd, umgeht sie mit Version 10.6p2 aber dort. Interessant an dem Fehler ist, dass jedes Teil für sich ein vernünftiger Entscheid war. musl entschied 2012, statt NULL einen Hash zurückzugeben, der zu nichts passt, damit Programme ohne Fehlerprüfung nicht abstürzen. OpenSSH hasht seit 2016 jeden Versuch mit echtem Salt, nachdem ein Forscher gezeigt hatte, dass lange Passwörter bei existierenden Benutzern messbar länger brauchten als bei unbekannten. Und Alpine gab root 2022 einen * statt eines gesperrten Felds, damit Logins mit Schlüssel weiter funktionieren. Erst zusammen machen sie aus einem Fehlerzeichen ein gültiges Passwort.
Angegriffen innert Stunden
OpenSSH 10.6p2 und das Advisory von Alpine erschienen am 5. November, mit korrigierten Paketen für jeden Alpine-Zweig bis zurück zu 3.16, auch für die nicht mehr unterstützten. Am Nachmittag folgte das CVE, keine zwei Stunden später der erste öffentliche Proof of Concept. Laut der Threat-Intelligence-Firma Previdian sahen ihre Sensoren die ersten Angriffsversuche weniger als neun Stunden nach der Veröffentlichung des CVE. Gegenüber The Hacker News sagte Previdian, sie habe Root-Zugriff auf einem Honeypot mit Alpine und OpenSSH bestätigt: Eine Adresse in Japan schickte überlange Passwörter und führte danach in nicht interaktiven Sitzungen id, uname und hostname aus. Angriffe auf echte Opfer sind bisher nicht bekannt, und Safe Security schrieb am 6. November noch, Angriffe in freier Wildbahn seien nicht bestätigt.
Der Angriff ist trivial. Keine Speicherkorruption, keine Race Condition, nur eine Verbindung mit einem langen String, und wer ohnehin SSH-Ports scannt, kann es ausprobieren. Die üblichen sshd-Logs halten die Länge eines Passworts nicht fest, ein erfolgreicher Angriff sieht also aus wie ein gewöhnlicher Passwort-Login. Genau das ist auch der Hinweis: ein Passwort-Login bei einem Konto, das gar kein Passwort hat.
Was jetzt zu tun ist
- Aktualisieren und sshd neu starten. Unter Alpine
apk upgrade -U -aund danachrc-service sshd restart. Das Paket-Update allein ersetzt den laufenden Daemon nicht. Behoben ist der Fehler in OpenSSH 10.6p2 und in den Alpine-Paketen aus dem Advisory, zum Beispiel 10.3_p1-r2 unter 3.24, 10.2_p1-r1 unter 3.23 und 10.0_p1-r11 unter 3.22; die Point-Releases 3.21.10, 3.22.8, 3.23.8 und 3.24.4 enthalten sie. - Wer noch nicht aktualisieren kann, schaltet Passwort-Logins ab.
PasswordAuthentication nosetzen, sshd neu starten und die wirksame Einstellung mitsshd -T | grep -i passwordauthenticationprüfen. Vorher sicherstellen, dass der Login mit Schlüssel funktioniert, und die laufende Sitzung offen lassen, bis eine neue getestet ist. Das Advisory von Alpine hat Befehle, die auch Versionen vor 3.19 abdecken, diesshd_config.dignorieren. - Images und laufende Instanzen nicht vergessen. Cloud-Images und Golden Images, die vor den korrigierten Point-Releases gebaut wurden, enthalten den Fehler. Baue sie neu und aktualisiere jede Instanz, die schon läuft.
- Über Alpine hinausschauen. Erstelle eine Liste der Geräte und Systeme, auf denen OpenSSH mit musl läuft: Appliances, Router, Firmware aus Buildroot oder Yocto, Container mit sshd. Auf einem laufenden System zeigt
ldd /usr/sbin/sshdden Eintragld-musl, wenn sshd musl verwendet. Frag deine Hersteller, ob sie einen Fix ausliefern. - Prüfen, ob jemand drin war. Durchsuche
/var/log/messagesnachAccepted password forund vergleiche die Konten mit denen ohne Passwort, etwaalpine,rootoder Benutzer nur mit Schlüssel. Schau dir die Nutzung vondoas, neue Benutzer, geänderte Dateien undauthorized_keysan. Lässt sich ein Login nicht ausschliessen, behandle die Maschine als kompromittiert, setze sie neu auf und tausche die Schlüssel und Geheimnisse aus, die darauf lagen. - Konten nur mit Schlüssel nicht als Schnellschuss sperren.
*durch!zu ersetzen, schliesst die Lücke für dieses Konto zwar, aber sshd verweigert dann auch den Login mit Schlüssel. Die richtigen Massnahmen sind das Update oderPasswordAuthentication no. - SSH vom offenen Internet fernhalten. Ein Port, den nur ein VPN oder ein Bastion-Host erreicht, macht aus der nächsten Lücke vor der Anmeldung eine Wartungsaufgabe statt eines Notfalls.
Weisst du, auf welchen eurer Systeme sshd mit musl läuft? Pentesting und Beratung →