أمان العقد الذكي: فهم ومنع ثغرات إعادة الدخول

تمثل هجمات إعادة الدخول واحدة من أكبر تهديدات الأمان في تطوير العقود الذكية. يوضح هذا التحليل الفني الآليات وراء ثغرات إعادة الدخول ويقدم استراتيجيات دفاع شاملة لحماية عقودك.

ما هو هجوم إعادة الدخول؟

تحدث إعادة الدخول عندما يمكن مقاطعة دالة في عقد ذكي أثناء تنفيذها واستدعائها مرة أخرى قبل اكتمال الاستدعاء الأول. من الناحية التقنية، تستغل إعادة الدخول سياق تنفيذ عقد ذكي من خلال التلاعب بتدفق التحكم عبر المكالمات الخارجية.

عندما يتفاعل العقد A مع العقد B، تنشأ الثغرة لأن العقد B يمكنه استدعاء العقد A مرة أخرى بينما لا يزال تنفيذ العقد A جارياً. يمكن استغلال نمط الاستدعاء التكراري هذا للتلاعب بحالة العقد واستنزاف الأموال.

آليات الهجوم: كيفية عمل إعادة الدخول

افترض سيناريو يتضمن عقدين:

  • العقد أ: عقد ضعيف يحتفظ بـ 10 ETH
  • العقد B: عقد خبيث مع إيداع 1 ETH في العقد A

تتبع تدفق الهجوم هذا النمط:

  1. العقد B يستدعي وظيفة السحب() في العقد A
  2. العقد A يتحقق من أن رصيد العقد B أكبر من 0 (يمر بالتحقق)
  3. العقد A يرسل 1 ETH إلى العقد B قبل تحديث سجل رصيده
  4. نقل ETH ينبه وظيفة الاسترجاع في العقد B
  5. داخل دالة الاسترجاع، يقوم العقد B باستدعاء دالة السحب في العقد A مرة أخرى (
  6. بما أن العقد A لم يحدث بعد رصيد العقد B، فإن الفحص يمر مرة أخرى
  7. العقد A يرسل ETH آخر إلى العقد B
  8. تتكرر هذه الدورة حتى يتم استنزاف الأموال من العقد A

تكمن الثغرة الحرجة في ترتيب تنفيذ العقد A: حيث يقوم بإجراء الاتصال الخارجي ) وإرسال ETH( قبل تحديث حالته الداخلية ) مما يؤدي إلى تعيين الرصيد إلى صفر(.

ثلاث تقنيات دفاع ضد إعادة الدخول

) 1. حماية على مستوى الوظيفة مع المعدل noReentrant

يطبق المعدل noReentrant آلية قفل تمنع استدعاء دالة بشكل متكرر:

صلابة // متغير حالة لتتبع إعادة الدخول bool خاص مقفل = false;

// مُعدل لمنع إعادة الدخول المعدل noReentrant###( { require)!locked, "استدعاء متكرر"(; مقفلة = صحيح; _; مقفلة = خاطئة; }

// دالة محمية وظيفة withdraw)( noReentrant العام { // منطق الدالة هنا }

تقوم هذه الطريقة بحظر محاولات إعادة الدخول من خلال الحفاظ على متغير حالة على مستوى العقد يمنع التنفيذ المتزامن للدوال المحمية.

) 2. نمط التفاعل التحقق

هذا النمط يعيد هيكلة الشيفرة لتتبع تسلسل محدد من العمليات:

  1. تحقق: تحقق من الشروط ###مثل، الرصيد > 0(
  2. التأثير: تحديث متغيرات الحالة )مثال، تعيين الرصيد = 0(
  3. التفاعل: قم بإجراء مكالمات خارجية )مثل، نقل ETH(

مقارنة الكود المعرض للخطر مقابل الكود المحمي:

عرضة: الصلابة وظيفة withdraw)( خارجية { uint bal = أرصدة [msg.sender]; require)bal > 0(.

// التفاعل قبل التأثير )vulnerable(
)bool تم إرسالها ، ( = msg.sender.call {value: bal})""(;
require)sent, "فشل في إرسال الإيثر"(;

balances[msg.sender] = 0; // قد لا يتم الوصول إليها أبدًا إذا حدث تداخل

}

محمي: صلابة وظيفة withdraw)( خارجية { uint bal = أرصدة [msg.sender]; require)bal > 0(.

// التأثير قبل التفاعل )secure(
الأرصدة [msg.sender] = 0 ؛

)bool تم إرسالها ، ( = msg.sender.call {value: bal})""(;
require)sent, "فشل في إرسال الإيثر"(;

}

من خلال تحديث الحالة قبل التفاعلات الخارجية، يبقى العقد آمناً حتى لو أدى الاستدعاء الخارجي إلى استدعاء دالة متكررة.

) 3. حماية عبر العقود مع GlobalReentrancyGuard

للمشاريع التي تحتوي على عقود متعددة تتفاعل مع بعضها البعض، يوفر حارس إعادة الدخول المشترك حماية شاملة:

صلابة // العقد المركزي لحماية إعادة الدخول عقد GlobalReentrancyGuard { mapping###address = > bool( _status خاص ؛

الدالة _beforeNonReentrant)( الداخلية {
    require)_status[msg.sender] == false, "ReentrancyGuard: rearrivalrant call"(;
    _status[msg.sender] = صحيح ؛
}

وظيفة _afterNonReentrant)( داخلية {
    _status[msg.sender] = خطأ ؛
}

}

// استخدام الحارس في عقد عقد ProtectedContract هو GlobalReentrancyGuard { وظيفة protectedFunction)( خارجية { _قبل غير قابل لإعادة الدخول)(;

    // منطق الوظيفة المحمية هنا
    
    _بعد عدم إعادة الدخول)(;
}

}

تمنع هذه التقنية إعادة الدخول المتقاطعة للعقود من خلال الحفاظ على سجل حالة عالمي يتتبع حالة التنفيذ عبر عدة عقود في نظامك البيئي.

أفضل ممارسات الأمان

لضمان حماية شاملة ضد هجمات إعادة الدخول:

  1. تطبيق طبقات دفاع متعددة: دمج نمط التحقق-التأثير-التفاعل مع حراس إعادة الدخول لأقصى درجات الأمان
  2. إجراء اختبارات شاملة: استخدم أدوات متخصصة مثل Mythril لاكتشاف الثغرات المحتملة في إعادة الدخول
  3. اتبع الأنماط المت established: نفذ تدابير الأمان بشكل متسق عبر جميع العقود في مشروعك
  4. استخدم التبعيات المدققة: دمج المكتبات المجربة التي تتمتع بسجلات أمان مثبتة
  5. تحديث الأرصدة أولاً: يجب دائماً تعديل الحالة قبل إجراء المكالمات الخارجية أو التحويلات

من خلال تنفيذ هذه الآليات الدفاعية، يمكنك حماية عقودك الذكية بفعالية ضد واحدة من أخطر أساليب الهجوم في أمان البلوكشين.

ETH5.89%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • تعليق
  • إعادة النشر
  • مشاركة
تعليق
0/400
لا توجد تعليقات
  • تثبيت