
テスト
本ドキュメントでは、Erlang/OTP プラットフォームに組み込まれているSSHサーバの実装に影響を与える脆弱性 CVE-2025-32433 に関する調査を紹介します。
この脆弱性は、認証を必要とせずにリモートで任意のコードを実行可能(Remote Code Execution, RCE)とするもので、パッチがリリースされる前の複数のErlang/OTPブランチに影響します。
Erlang/OTP は、スケーラブルな分散システムの基盤として広く使用されており、多くの有名プロジェクト(例えば、メッセンジャー、メッセージブローカー、高負荷Webサービス)のスタックに含まれています。
SSH の基本ライブラリに重大なRCE脆弱性が存在することにより、Erlang/OTP をサーバとして、またはSSHアクセスが開放されたコンポーネントとして使用しているインフラストラクチャが危険にさらされます。
脆弱性を段階的に調査し、完全な調査サイクルを示します。
資料の収集と整理:
CVE-2025-32433 に関する公開データを検索・体系化し、その概要と潜在的な影響を説明します。
CPE と設定条件の特定:
脆弱性が該当するCPEと設定条件のリストを提示します。
PoC/Exploit の開発:
テスト環境で動作するプロトタイプのエクスプロイトを作成・実演します。
安全な一斉確認の手法:
脆弱なホストを確認する3つの方法を説明します。
本調査は 教育および倫理的な目的のみ で行われ、管理されたテスト環境でのみ実施されています。
著者は、提示された情報の不正使用について 一切の責任を負いません。
この情報は、自身のシステムのセキュリティを向上させるための学習目的でのみ使用してください。
Erlang は、高並行性と耐障害性に優れたシステムを構築するために開発されたプログラミング言語です。
そのプラットフォーム Open Telecom Platform (OTP) は、長年にわたり、通信から金融セクターに至るまで、重要なインフラストラクチャで使用されています。
OT(運用技術)環境や 5G ネットワークでは、Erlang/OTP はそのスケーラビリティと、最小限のダウンタイムでシステムの継続的な運用を保証する能力が評価されています。
遠隔管理のために、これらのネットワークは Erlang/OTP に組み込まれた SSH 実装を頻繁に使用します。
このため、CVE-2025-32433 は、このような環境にとって特に危険です。
Erlang/OTP における安全な通信は、独自の SSH 実装によって提供され、以下の機能を担当します。
この実装の脆弱性により、ネットワークアクセスを持つ攻撃者は 認証なしに任意のコードを実行 することが可能となり、脆弱な資産に直接的な脅威をもたらします。
世界的なインターネットスキャン(Cortex Xpanse、2025年4月)によると、脆弱な Erlang/OTP SSH サービスは インターネット上で広くアクセス可能 であり、標準ポートだけでなく、例えば TCP ポート 2222 でも動作しています。
このポートは、古い産業用自動化コンポーネントや暗黙的なメッセージ転送プロトコル Ethernet/IP によっても使用されることが多く、攻撃ベクトルを拡大しています。
この脆弱性は、Erlang/OTP リリースに含まれる SSH のバージョンに関連しています。
脆弱なサービスがさまざまな業界に特徴的なポートで広がっていることから、世界的な攻撃対象領域は大きくなっています。
テレメトリデータによると、エクスプロイト試行の 85% 以上 が、以下の分野の OTセグメント のファイアウォールで記録されました。
一方で、OT への依存度が高いにもかかわらず、以下のセクターでは、
この脅威の活発な拡散に寄与する要因は確認されていません。
CVE-2025-32433 は NVD データベースに以下の一般的な CPE(Common Platform Enumeration)で登録されています。
cpe:2.3:a:erlang:otp:25:*:*:*:*:*:*:*cpe:2.3:a:erlang:otp:26:*:*:*:*:*:*:*cpe:2.3:a:erlang:otp:27:*:*:*:*:*:*:*以下のパッチバージョンより前のマイナーリリース が脆弱とみなされます。
- 25.x — 25.3.2.20 までを含む
- 26.x — 26.2.5.11 までを含む
- 27.x — 27.3.3 までを含む
openssh ではなく、組み込みの Erlang/OTP SSH デーモン(ssh:daemon/2)が実行されている必要があります。22 またはカスタム、例 2222)が攻撃者のネットワークからリモート接続可能である必要があります。ssh:daemon/2 の特定のオプションによるものではありません。⚠️ Erlang/OTP がクライアントライブラリとしてのみ使用され、SSH サーバが起動されていない場合、またはサーバが隔離されたネットワークに閉じられている場合、脆弱性は悪用できません。
この脆弱性は、Erlang/OTP の組み込み SSH サーバが 事前認証プロセス を適切に処理しないために発生します。
重要な役割を果たすのは、接続プロトコルの 2 種類のメッセージ、SSH_MSG_CHANNEL_OPEN と SSH_MSG_CHANNEL_REQUEST です。
RFC 4254 によれば、これらのメッセージは ユーザー認証が成功した後にのみ 受け入れられるべきです。
それ以前に送信しようとする試みは、直ちに接続を切断する必要があります。
CVE-2025-32433 の場合、SSH デーモンはこのルールを強制しないため、攻撃者は 有効な認証情報を提示することなく、セッションチャネルを開き、任意のコマンドを含む exec リクエストを送信できます。
言い換えれば、これは 認証されていないリモートコード実行(RCE) につながります。攻撃者は、ユーザー名、パスワード、鍵を知らなくてもサーバの制御を奪取できます。

SSH Connection プロトコルは、SSH のトランスポート層と認証層の上で動作します。
これは、対話型ログイン、リモートコマンド実行、ポート転送の機能を提供します。
Erlang/OTP の脆弱な SSH 実装では、チャネルの開始とコマンドリクエストに必要な 2 つのメッセージ SSH_MSG_CHANNEL_OPEN と SSH_MSG_CHANNEL_REQUEST が攻撃のポイントになります。
攻撃者は、特別に細工したトラフィックを送信することで、認証を通過する前に システムを騙して任意のコードを実行させることができます。

本調査の一環として、CVE-2025-32433 用の実用的な Proof-of-Concept を作成しました。
CVE-2025-32433.py — Python スクリプト。SSH パケット(SSH_MSG_KEXINIT、SSH_MSG_CHANNEL_OPEN、SSH_MSG_CHANNEL_REQUEST)を手動で構築し、認証前に 送信します。
これにより、脆弱なバージョンの Erlang/OTP でサーバ側の任意のコマンドを実行できます。PoC では、cyberok というテキストを含む /lab.txt ファイルを作成します。
ssh_server.erl — 最小限の Erlang モジュール。ポート 2222 で組み込み OTP SSH デーモンを起動します。デモンストレーションのみを目的としており、Docker コンテナ内で実行されます。
Dockerfile — コンテナビルドのレシピ。指定されたバージョンの Erlang/OTP を自動的にコンパイルし、テスト用 SSH サーバを起動します。
⚠️ この PoC は、ローカルテストおよび教育目的でのみ 使用することを意図しています。本番環境や公開ネットワークでは使用しないでください。
イメージをビルドします。
git clone https://github.com/iteride/CVE-2025-32433.git && cd CVE-2025-32433/POC/ && docker build -t cve-ssh .

イメージを実行します。
docker run -d --name cve-ssh -p 2222:2222 cve-ssh
POC の動作確認

パッシブテンプレートは、実際の攻撃動作を実行せずに、間接的な脆弱性の兆候 を検索します。
サービスが自ら提供する「表面」情報のみを分析します。
脆弱なバージョン(例:OTP 25.3.2.19 や 26.2.5.10)が検出された場合、nuclei はそのホストを 潜在的に脆弱 とマークします。
⚠️ このアプローチは安全です。悪意のあるパケットやエクスプロイトの試行は一切行われません。
nuclei -u 127.0.0.1:2222 -t erlang-passive.yaml
アクティブテンプレートは、制御された攻撃の模倣 を実行します。
認証前に特別に細工した SSH パケットを送信し、脆弱性が発動するかどうかを確認します。
エクスプロイトの事実を記録するために Interactsh が使用されます。リモートサーバが悪意のあるリクエストを実行した場合、Interactsh パネルに DNS コールバックが表示されます。
✅ このテストは リモートコード実行(RCE)の実際の可能性 を確認しますが、隔離されたテスト環境でのみ実施されます。
nuclei -u 127.0.0.1:2222 -t erlang-active.yaml -code
nuclei-template との違い:
スクリプトの実行
⚠️ 実行前に、interactsh-client がインストールされ、起動されていることを確認してください。
python3 babyfon.py -f targets.txt -d your.interactsh_domain

実行後、interactsh-client で DNS インタラクションを確認します。 (例では 2 つのターゲットをスキャンしています。1 つは脆弱、もう 1 つは既にパッチが適用されています)



テストからの結論: