ssh-keysign-pwn: Root-Dateien durch ptrace-Logikfehler auslesen
ssh-keysign-pwn: Ein sechs Jahre alter Logikfehler in
__ptrace_may_access(), gemeldet von Qualys und repariert von Linus Torvalds am 14. Mai 2026. Nicht-privilegierte Benutzer können Root-Dateien lesen, einschließlich SSH-Host-Privatschlüssel und/etc/shadow. Alle Kernel vor31e62c2ebbfdsind betroffen.
Noch Eine
Der Mai 2026 war nicht gnädig mit dem Linux-Kernel. Dirty Frag, Fragnesia, und jetzt—ssh-keysign-pwn—offengelegt von Qualys am 14. Mai und repariert von Linus Torvalds am selben Tag.
Diese unterscheidet sich von der Familie “etwas in den Page Cache kopieren”. Es ist ein reiner Logikfehler in __ptrace_may_access(), der Kernel-Funktion, die entscheidet, ob ein Prozess einen anderen inspizieren darf.
| Metrik | Wert |
|---|---|
| Gemeldet von | Qualys Security Advisory |
| Repariert von | Linus Torvalds |
| Fix-Commit | 31e62c2ebbfd |
| Versteckt seit | ~6 Jahren |
| Erstmals entdeckt von | Jann Horn (Google), Oktober 2020 |
| PoC veröffentlicht von | _SiCk |
| Auswirkung | Root-Dateien als nicht-privilegierter Benutzer lesen |
| Exploit-Komplexität | 100–2000 Versuche pro erfolgreichem Diebstahl |
Wie Es Funktioniert
Der Fehler liegt in __ptrace_may_access(). Diese Funktion ist der Gatekeeper für Prozess-Introspection—sie prüft, ob ein Prozess in einem anderen Prozess herumschnüffeln darf.
Es gibt einen Spezialfall: Wenn task->mm == NULL (der Zielprozess hat keinen Speicherdeskriptor — passiert, wenn ein Thread beendet wird, oder bei Kernel-Threads), überspringt die Funktion die gesamte Dumpable-Prüfung.
Der ausnutzbare Codepfad:
- Ein Prozess ruft
do_exit()auf, um zu terminieren do_exit()führt zuerstexit_mm()aus — zerstört den Speicherdeskriptor (mm)- Dann führt es
exit_files()aus — aber die Dateideskriptoren leben noch - Mit
task->mm == NULLaber noch offenen fds kannpidfd_getfd(2)diese stehlen, wenn die uid des Aufrufers übereinstimmt
Normalerweise würden ptrace-Zugriffsprüfungen einen weniger privilegierten Prozess davon abhalten, an die offenen Dateihandles eines Root-Prozesses zu gelangen. Aber der mm == NULL-Bypass überspringt die Dumpable-Prüfung, und pidfd_getfd(2) erledigt den Rest.
Dies ist eine klassische TOCTOU-Race-Condition, aber das Fenster ist breit genug—der PoC trifft in 100–2000 Versuchen.
Exploit-Ziele
Zwei Werkzeuge wurden veröffentlicht:
sshkeysign_pwn — greift ssh-keysign an, ein Hilfsbinary, das Host-Authentifizierungs-Herausforderungen signiert. Es öffnet die SSH-Hostschlüsseldateien (/etc/ssh/ssh_host_{ecdsa,ed25519,rsa}_key, Modus 0600), bevor es permanently_set_uid() aufruft, um Privilegien abzugeben. Dann prüft es, ob EnableSSHKeysign in sshd_config gesetzt ist — wenn nicht, beendet es sich mit noch offenen Schlüssel-fds. Dieses Design existiert in OpenSSH seit 2002.
chage_pwn — greift chage -l <user> an. Es öffnet /etc/shadow via spw_open(O_RDONLY), ruft dann setreuid(ruid, ruid) auf — gibt alle Privilegien ab. Im Fenster zwischen Privilegienabgabe und Dateischließung ist der fd stehlbar.
Zeitleiste
| Datum | Ereignis |
|---|---|
| ~2020 | Jann Horn identifiziert das FD-Diebstahlmuster und schlägt einen Patch vor (nicht gemerged) |
| 2026-05-14 | Qualys meldet die Schwachstelle; Linus Torvalds committed den Fix (31e62c2ebbfd) |
| 2026-05-14 | Brad Spengler (@spendergrsec) veröffentlicht Analyse |
| 2026-05-14 | _SiCk veröffentlicht PoC-Exploits auf GitHub |
| 2026-05-15 | Qualys sendet Offenlegung an oss-security |
Die Lücke zwischen Jann Horns Patch-Vorschlag von 2020 und Qualys’ Bericht von 2026 ist bemerkenswert. Der Fix war vor fünf Jahren formuliert worden, wurde aber nie upstream gemerged.
Der Fix
Linus wendete den Fix als Commit 31e62c2ebbfd an. Seine Commit-Nachricht merkte an:
“wir haben einen seltsamen Spezialfall: ptrace_may_access() verwendet ‘dumpable’, um verschiedene Dinge völlig unabhängig von MM zu prüfen (typischerweise mit Flags wie
PTRACE_MODE_READ_FSCREDS), einschließlich Threads, die keine VM mehr haben (und vielleicht nie hatten, wie die meisten Kernel-Threads). Es ist nicht das, wofür dieses Flag entwickelt wurde, aber es ist, wie es ist.”
Der Patch passt das ptrace-Verhalten an, um den mm == NULL-Fall korrekt zu behandeln. Er schließt effektiv das Bypass-Fenster.
Prüfe Deinen Kernel
uname -r
# Reparierte Kernel enthalten Commit 31e62c2ebbfd
# Alle Kernel vor 2026-05-14 sind verwundbar
Was Dies Interessant Macht
Drei Dinge stechen hervor:
-
Am selben Tag gemeldet und repariert. Linus erledigte es in Stunden. Das ist ungewöhnlich schnell für einen Kernel-Fix und deutet darauf hin, dass der Patch direkt war, sobald der Fehler verstanden wurde.
-
Jann Horn fand es 2020. Die Community hatte seit fünf Jahren einen Patch-Vorschlag in den Mailinglisten-Archiven. Das FD-Diebstahlmuster war bekannt, aber niemand trieb es voran.
-
Die Ziele sind uralt.
ssh-keysigns fd-Offenlassen-Muster stammt von 2002.chagesspw_open+setreuid-Sequenz ist ebenso langlebig. Dies ist kein Fehler in SSH oder shadow-utils — es ist ein Kernel-Fehler, der bestehende fd-Handhabungsmuster in privilegierten Binaries bewaffnet.
Dies ist die dritte große Linux-Kernel-Sicherheitslücke im Mai 2026, nach Copy Fail und Dirty Frag. Das Tempo der Offenlegung beschleunigt sich — teils weil KI-gestützte Audit-Werkzeuge alte Fehler schneller finden, teils weil sich das Offenlegungs-Ökosystem fragmentiert.
Referenzen
- Kernel-Fix-Commit: 31e62c2ebbfd
- Phoronix: Linux-Sicherheitslücke erlaubt Lesen von Root-Dateien
- GitHub PoC: 0xdeadbeefnetwork/ssh-keysign-pwn
- 9to5Linux: Sechs Jahre alter Kernel-Fehler
- Qualys oss-security: Logikfehler in __ptrace_may_access()
- Jann Horns Patch von 2020: lore.kernel.org