تخطَّ إلى المحتوى

Resource Exhaustion

استنزاف الموارد عبر استثناء غير معالَج Resource Exhaustion

استنزاف الموارد يحدث عندما يفشل الكود في تحرير مورد محجوز (قفل، اتصال، ذاكرة مؤقّتة) عند حدوث استثناء أثناء استخدامه، فتتراكم الموارد المحجوزة مع كل محاولة فاشلة حتى يُحجب النظام عن الجميع.

عملية تحجز موردًا (قفل ملفّ، اتصال قاعدة بيانات، مساحة مؤقّتة) ثم تعالج بيانات قد تفشل معالجتها. لو حُرِّر المورد بسطر كود بعد المعالجة مباشرة (لا داخل `finally`)، فإن أي استثناء يقاطع التنفيذ **قبل** الوصول لسطر التحرير — فيبقى المورد محجوزًا للأبد.

مهاجم لا يحتاج ثغرة تقليدية هنا: مجرّد تكرار نفس الطلب الذي يسبّب الاستثناء (رفع ملفّ تالف، مثلًا) عدّة مرات كافٍ لاستنزاف كل الموارد المتاحة (أقفال، اتصالات) وحجب الخدمة عن مستخدمين شرعيين — حجب خدمة (DoS) دون أي حمل زائر غير طبيعي.

الصياغة

acquireLock(id); processFile(file); releaseLock(id); // ❌ استثناء قبل السطر الأخير = تسريب مورد

📄 مثال

// ✅ آمن: التحرير مضمون بغضّ النظر عن نجاح المعالجة أو فشلها
function handleUpload(file) {
  const lock = acquireLock(file.id);
  try {
    processFile(file);
  } finally {
    releaseLock(lock); // ينفَّذ دائمًا، حتى مع استثناء
  }
}

أهم النقاط

النقطةالوظيفة
السبب الجذريتحرير مورد بسطر كود عادي بعد عملية قد ترمي استثناءً، لا داخل finally
الأثرتراكم موارد محجوزة (أقفال، اتصالات) حتى حجب الخدمة عن الجميع
الدفاع الأساسيتحرير أي مورد محجوز داخل finally (أو ما يعادلها) لا كسطر تالٍ للمعالجة

💡 نصائح عملية

  • طبّق نفس المبدأ على أي 'حجز ثم استخدام ثم تحرير': أقفال، اتصالات شبكة، ملفّات مفتوحة، مساحات مؤقّتة

⚠️ أخطاء شائعة

  • الاعتماد على أن 'الاستثناء نادر الحدوث' بدل ضمان التحرير بنيويًّا — مهاجم يستطيع تكرار نفس الحالة عمدًا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CYBERSECURITY الكامل بالعربي.