جميع الأدلة

DEVOMNITOOLS / أدلة المطورين

تدقيق تسريب أسرار خادم تطوير Vitest (CVE-2026-112948)

تحليل أمني لثغرة CVE-2026-112948 في خادم Vitest 5 وكيفية تدوير الرموز المسربة بأمان.

DevOmniTools Research نُشر: حُدّث: 3 دقائق للقراءة
مخطط بنية تجاوز قواعد server.fs.deny في خادم تطوير Vitest مع إظهار طلبات HTTP التي تسرب ملفات .env

النقاط الأساسية

  • تجاوزت ثغرة CVE-2026-112948 في خوادم تطوير Vitest 5 القواعد الافتراضية لـ server.fs.deny، مما كشف ملفات .env والمفاتيح الخاصة عبر بروتوكول HTTP العادي.
  • كان بإمكان أي عملية محلية أو عميل على نفس الشبكة يستعلم منفذ واجهة Vite سحب الأسرار ورموز المصادقة الداخلية.
  • يجب إلغاء جميع بيانات الاعتماد الموجودة في ملفات .env أثناء جلسات Vitest UI النشطة فوراً وتدويرها باستخدام CSPRNG محلياً.

الملخص التنفيذي وسياق الثغرة الأمنية

في 21 أكتوبر 2026، نشرت قاعدة بيانات GitHub الأمنية تحذيراً حول CVE-2026-112948 (GHSA-p458-7748-mcp3)، كاشفة عن خطأ فادح في صلاحيات الوصول إلى الملفات في خوادم تطوير Vitest 5.

في ظل تكوينات تطوير محددة—خاصة عند تشغيل الواجهة التفاعلية (vitest --ui) أو وضع المتصفح (@vitest/browser) أو تمكين خاصية api عن بُعد—فشل خادم HTTP الداخلي في Vitest في تطبيق قواعد الحظر الافتراضية server.fs.deny التابعة لـ Vite.

النتيجة: أصول المشروع الحساسة التي يحميها Vite افتراضياً—بما في ذلك .env و .env.local و .npmrc وشهادات SSL الخاصة وبيانات .git وملف المصادقة الداخلي لـ Vitest (.vitest-secret-token)—أصبح بالإمكان تنزيلها عبر طلبات HTTP عادية بواسطة أي عميل على الشبكة المحلية أو عبر علامات تبويب متصفح خبيثة.

مخطط بنية تجاوز قواعد server.fs.deny في خادم تطوير Vitest مع إظهار طلبات HTTP التي تسرب ملفات .env والمفاتيح الخاصة (CVE-2026-112948)

السبب الجذري الفني: لماذا تم تجاوز server.fs.deny

في تكوين Vite القياسي، تحمي خاصية server.fs.deny المسارات الحساسة باستخدام أنماط مضمنة:

// أنماط الحظر الافتراضية في Vite:
['.env', '.env.*', '*.{crt,pem}', '**/.git/**', '**/.npmrc']

عندما أضاف Vitest 5 خادم API الداخلي ومصادقة الرموز للواجهة (.vitest-secret-token)، قام بإدراج ملف الرموز السري في قائمة الحظر برمجياً. ولكن حدث خطأ أمني غير متوقع نتيجة سببين:

  1. إعادة كتابة المصفوفة بالكامل: يقوم Vite بحقن قائمة الحظر الافتراضية فقط إذا كانت قيمة server.fs.deny غير معرفة (undefined). عندما قام Vitest بتعيين مصفوفة تحتوي فقط على ['.vitest-secret-token']، تم تجاهل قواعد Vite الافتراضية بدلاً من دمجها.
  2. الترجمة المسبقة لقواعد الفحص: يقوم Vite بترجمة قائمة الحظر إلى تعبير نمطي (regex) أثناء معالجة الإعدادات الأولية. التعديلات اللاحقة أثناء التشغيل لم يكن لها أي تأثير على خط تسليم ملفات HTTP النشط.

خطوات المعالجة وتدوير الرموز الأمنية

1. ترقية حزم Vitest فوراً

أصدر مطورو Vitest إصدارات مصححة تعالج هذا الخلل. قم بتحديث حزم المشروع فوراً:

npm install -D vitest@latest @vitest/ui@latest @vitest/browser@latest
# أو عبر pnpm:
pnpm update vitest @vitest/ui @vitest/browser

2. إلغاء وإعادة إصدار بيانات الاعتماد المسربة

تعامل مع جميع المفاتيح السرية في ملفات .env على أنها مخترقة إذا تم تشغيل Vitest UI على شبكات مشتركة:

  • رموز الوصول إلى الخدمات السحابية (AWS، GCP، Cloudflare)
  • بيانات اعتماد قواعد البيانات (Postgres، Redis، سلاسل اتصال MongoDB)
  • أسرار عميل OAuth 2.0 ومفاتيح توقيع JWT
  • مفاتيح واجهات برمجة التطبيقات التابعة لجهات خارجية (Stripe، GitHub PATs)
مخطط سير عمل تدوير الرموز التشفيرية: إلغاء رموز .env المخترقة وإنشاء مفاتيح CSPRNG آمنة بحجم 256 بت ورموز Base32 دون اتصال

3. إنشاء أسرار تشفير عالية القوة من جانب المتصفح

عند إنشاء رموز بديلة، تجنب الأدوات التي تسجل المدخلات على خوادم بعيدة. استخدم Web Crypto API (crypto.getRandomValues) لتوليد أرقام عشوائية آمنة تشفيرياً (CSPRNG):

function generateSecureToken(byteLength = 32): string {
  const bytes = new Uint8Array(byteLength);
  crypto.getRandomValues(bytes);
  return Array.from(bytes)
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

لإجراء عملية تدوير فورية دون كتابة تعليمات برمجية:


الحماية الدفاعية والتأمين الإضافي

عزز إعدادات vitest.config.ts أو vite.config.ts بإضافة server.fs.strict وأنماط حظر يدوية صريحة:

import { defineConfig } from 'vitest/config';

export default defineConfig({
  server: {
    fs: {
      strict: true,
      deny: [
        '**/.env*',
        '**/*.pem',
        '**/*.key',
        '**/.git/**',
        '**/.npmrc',
        '**/.vitest-secret-token'
      ]
    }
  }
});

FAQ

ما هو السبب الجذري الرئيسي لثغرة CVE-2026-112948 في Vitest 5؟

أضاف Vitest ملف الرموز السري الداخلي إلى server.fs.deny كمصفوفة صريحة، مما جعل Vite يتجاهل أنماط الحظر الافتراضية بدلاً من دمجها، مما سمح بقراءات HTTP غير مصرح بها لملفات .env.

هل تتأثر اختبارات سطر الأوامر بهذه الثغرة؟

لا. الاختبارات التلقائية (vitest run) لا تشغل خادم HTTP. الثغرة تؤثر فقط على الجلسات التي تستخدم --ui أو @vitest/browser أو خيار api: true.

كيف يتم تدوير رموز .env المسربة بأمان؟

قم بإلغاء مفاتيح السحابة وقواعد البيانات فوراً من لوحات التحكم، ثم قم بإنشاء رموز عشوائية آمنة تشفيرياً (CSPRNG) بحجم 256 بت باستخدام أدوات تعمل داخل المتصفح دون إرسال البيانات عبر الإنترنت.