概要
セキュリティ研究者たちは、OpenSSHのProxyCommand機能に存在する重大な脆弱性を発見しました。この脆弱性は、クライアントシステム上でリモートコード実行を達成するために悪用される可能性があります。CVE-2025-61984として追跡されているこの脆弱性は、ProxyCommand文字列を展開する際にユーザー名に含まれる制御文字のフィルタリングが不十分であることに起因します。Bashおよびその他のシェルでこの欠陥を実証する概念実証(PoC)エクスプロイトが公開され、複雑なSSHプロキシ設定を使用する管理者にとって緊急の懸念事項となっています。
脆弱性の詳細
この問題は、ssh(1)
が~/.ssh/config
内のProxyCommand
ディレクティブを処理する方法に起因します。リモートユーザー名を含めるために%r
トークンを使用する場合、改行などの制御文字が除去されないため、攻撃者は改行を挿入してexec
呼び出しを中断させ、クライアント側で任意のコマンドを実行できるようになります。シェル組み込みコマンドで構文エラーをトリガーすることにより、不正な形式のexec
行が中断され、実行は次の行で再開され、悪意のあるペイロードが実行される可能性があります。
影響とCVSSスコア
- 影響を受ける製品: OpenSSH ≤ 10.0p1 (クライアント)
- 影響: リモートコード実行
- 悪用の前提条件:
%r
を使用するProxyCommand
を含むユーザーのSSH設定 - CVSS 3.1スコア: 8.1 (高)
概念実証と悪用方法
公開された概念実証は、Bash、fish、およびcshシェルでの悪用を実証しています。Bashでは、exec
呼び出し内に$[*]
を挿入すると、構文エラーが発生し、exec
は停止しますが、後続のコマンドが実行されます。例えば、bash -xc "$(printf 'exec $[*]\necho compromised')"
は、初期エラーの後に「compromised」と出力します。fish (exec cat \$p[0]
) およびcsh (exec $[
) でも同様の動作により、攻撃者が制御するスクリプトの実行が可能になります。Zshは、非対話型シェルがデフォルトで解析エラーで中断するため、この特定の技術の影響を受けません。
一般的な攻撃ベクトルは、%r
展開を利用する悪意のあるGitサブモジュールURLです。ユーザーが細工された.gitmodules
エントリと一致するSSHプロキシ設定を持つリポジトリをクローンすると、挿入された制御文字により、接続前にプロキシコマンドが任意のコードを実行します。
緩和策と推奨事項
主要な修正策は、OpenSSHをバージョン10.1p1以降にアップグレードすることです。このバージョンでは、ユーザー名内の制御文字が明示的に許可されていません。直ちにアップグレードできない管理者は、SSHクライアント設定で%r
トークンを引用符で囲むことでリスクを軽減できます。
ProxyCommand /usr/bin/nc -X connect -x proxy:8080 '%r @%h:%p'
これにより、改行の挿入が防止されます。追加の多層防御策として、git config --global protocol.ssh.allow user
を使用してGitサブモジュールに対するSSHトランスポートを制限し、フィルタリングされていないSSHユーザー名を渡すURLハンドラーを避けることが挙げられます。
この脆弱性に対する認識は、Teleportのようなクラウドゲートウェイソリューションを含む、%r
を含むプロキシコマンドを生成するSSHプロキシを使用する環境にとって特に重要です。適切なフィルタリングとバージョン更新は、この巧妙なリモートコード実行方法から保護するために不可欠です。
元記事: https://gbhackers.com/openssh-proxycommand-flaw-poc-released/