
cve-2025-32433-erlang_ssh_rce_reproduction の再現
CVSS スコア: 10.0 (CRITICAL)
ステータス: 実環境で活発に悪用中
開示: 2025年6月
CVE-2025-32433 は、Erlang/OTP に同梱されている SSH サーバー実装 (ssh アプリケーション) における、認証を必要としない重大なリモートコード実行の脆弱性です。この欠陥は SSH 接続処理ロジックの 認証が完了する前 の段階に存在するため、悪用には有効な認証情報が一切必要ありません。脆弱な Erlang SSH ポート (通常は 22、または RabbitMQ、Riak、CouchDB などが使用するカスタムポート) に到達できる攻撃者は、対象システム上で任意のシェルコマンドを実行できます。
この脆弱性はセキュリティ研究者 Felix "xcz" Lange によって発見され、OTP のセキュリティ開示プロセスを通じて報告されました。公開 PoC コードはアドバイザリの公開から 72 時間以内に登場し、開示直後から複数の脅威アクターが脆弱な SSH バナー (SSH-2.0-Erlang/OTP-*) をスキャンしているのが観測されました。
この脆弱性は、OTP の ssh アプリケーションにある Erlang の SSH 実装に存在します。具体的には、SSH デーモンが認証フェーズ前に 鍵交換開始メッセージ を処理する方法にバグがあります。
ssh_bind.erl および ssh_connection_handler.erl モジュールは、特定の順序異常または不正な SSH プロトコルメッセージを処理する際に、ステートマシンの遷移を適切に検証できません。鍵交換フェーズ中に細工された SSH_MSG_KEXINIT パケットまたは特別に構築された サービス要求 メッセージを送信することで、攻撃者は Erlang VM に以下を実行させることができます:
これは根本的に、ステートマシンのバイパス と組み合わされた 安全でない Erlang タームのデシリアライゼーション の脆弱性です。Erlang の binary_to_term/1 関数が、safe モードを有効にせずに攻撃者が制御する入力に対して使用されるため、任意のアトムのインスタンス化や、登録済みプロセスの呼び出しが可能になります。
Attacker Vulnerable Erlang SSH Server
│ │
│──── TCP Connect (port 22) ──────────→│
│ │
│←── SSH-2.0-Erlang/OTP-26.x banner ──│
│ │
│──── SSH_MSG_KEXINIT (crafted) ──────→│
│ │
│──── [malformed service request] ────→│ ← State machine confused
│ │
│──── [binary_to_term payload] ───────→│ ← Unsafe deserialization
│ │
│←── Remote shell / cmd execution ────│
重要な点は、SSH 接続ハンドラーがセキュリティハンドシェイク完了前に受信データに対して binary_to_term を呼び出す予期しない状態に入ることです。コマンド実行ペイロードをエンコードした悪意のある Erlang ターム (例: spawn を伴う erlang:open_port/2 の使用) を埋め込むことで、攻撃者は Erlang VM プロセスの権限でコード実行を獲得します。
典型的なペイロードは、Erlang の外部ターム形式を使用して以下をエンコードします:
{run, "cmd.exe /c <command>"}
-- or --
{spawn, "<command>"}
これらのタームは、binary_to_term/1 によってデコードされると、SSH 接続ステートマシンと相互作用し、システムコマンドを実行します。
通常、バナー取得で十分です:
# A vulnerable service responds with:
SSH-2.0-Erlang/OTP-26.1
SSH-2.0-Erlang/OTP-25.2
SSH-2.0-Erlang/OTP-27.0
# A patched service responds with:
SSH-2.0-Erlang/OTP-26.2.6
SSH-2.0-Erlang/OTP-27.3.2
上記の修正済みバージョン番号より低い Erlang/OTP はすべて脆弱です。
paramiko または生のソケットアクセス (PoC は生のソケットを使用)# Build a vulnerable Erlang container
FROM erlang:26.1-alpine
RUN echo "root:toor" | chpasswd && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
CMD ["erlexec", "ssh:daemon(8222)"]
または、ネットワーク上に既に存在する脆弱なサービスを使用してください。
バナー取得による 脆弱なターゲットの特定:
nc -w 3 <target> 22
# Look for: SSH-2.0-Erlang/OTP-
PoC エクスプロイトの実行:
python exploit.py --target 192.168.1.100 --port 22 --command "whoami"
実行の検証:
[+] CVE-2025-32433 Erlang/OTP SSH Pre-Auth RCE
[+] Target: 192.168.1.100:22
[+] Banner: SSH-2.0-Erlang/OTP-26.1
[+] Triggering vulnerability...
[+] Payload sent.
[+] Response: root
[!] Exploit succeeded
提供されている exploit.py は、以下を実行する動作する PoC を実装しています:
このエクスプロイトは、以下の 3 つの主要コンポーネントを利用します:
ssh_bind.erl および ssh_transport.erl ソースからリバースエンジニアリングされましたErlang/OTP のパッチ適用 (最優先):
# On Debian/Ubuntu
sudo apt-get update && sudo apt-get install erlang-base=1:27.3.2-1
# On RHEL/CentOS
sudo yum update erlang
# Source build
wget https://github.com/erlang/otp/releases/download/OTP-27.3.2/otp_src_27.3.2.tar.gz
tar xzf otp_src_27.3.2.tar.gz
cd otp_src_27.3.2
./configure && make && sudo make install
SSH アクセスの制限 (一時的な回避策):
# Firewall rules to limit SSH source IPs
iptables -A INPUT -p tcp --dport 22 -s <trusted_networks> -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
未使用の場合の Erlang SSH の無効化:
% In sys.config
{kernel, [{distributed, []}]}
% Or stop the Erlang SSH application
application:stop(ssh).
異常な SSH ハンドシェイクパターンを探します:
131、104 など) を送信する接続epmd、beam.smp) によって生成された説明できない子プロセスこの情報は、教育目的および許可されたセキュリティテストのみ を目的として提供されています。所有していない、または明示的な書面によるテスト許可を得ていないシステムに対する、このエクスプロイトの不正使用は違法です。著作者は誤用について一切の責任を負いません。
リポジトリ構造:
cve-2025-32433-erlang_ssh_rce_reproduction/
├── README.md # This file
├── exploit.py # Python PoC exploit
└── LICENSE # MIT (for PoC code only)
| 製品 | 影響を受けるバージョン | 修正済みバージョン |
|---|
| Erlang/OTP | < 27.3.2, < 26.2.6, < 25.3.3 | 27.3.2+, 26.2.6+, 25.3.3+ |
| Elixir (Erlang 経由) | 脆弱な OTP で動作するすべてのバージョン | パッチ適用済み OTP で再コンパイル |
| RabbitMQ | < 3.12.14, < 3.13.7 (脆弱な OTP 上) | パッチ適用済み OTP を使用した 3.12.14+, 3.13.7+ |
| Riak KV/TS | < KV 2.9.6, < TS 1.5.5 (脆弱な OTP 上) | パッチ適用済み OTP を含む更新パッケージ |
| CouchDB | < 3.3.3 (Erlang SSH 使用時) | 3.3.3+ または SSH の無効化 |
| Ejabberd | < 24.06 (脆弱な OTP 上) | パッチ適用済み OTP を使用した 24.06+ |