فهم هجمات إعادة الدخول وكيفية منعها 🔐

robot
إنشاء الملخص قيد التقدم

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

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

إنها عندما يقوم ContractB بالاتصال مرة أخرى بـ ContractA بينما لا يزال ContractA قيد التشغيل. أشياء سيئة. يحب المهاجمون هذه الثغرة لاستنزاف الأموال من العقود 💸

تخيل هذا:

  • عقد يحمل 10 ETH
  • وضع ContractB في 1 ETH
  • ثم يسرق ContractB كل شيء

آلية الهجوم 🕵️‍♂️

تحتاج إلى شيئين رئيسيين:

  1. attack() وظيفة لبدء كل شيء
  2. fallback() وظيفة للجزء الماكر

تسير العملية كالتالي:

  1. ContractB يبدأ الهجوم() الذي يستدعي سحب ContractA()
  2. ContractA يتحقق من رصيد ContractB
  3. يرسل ContractA ETH إلى ContractB
  4. هذا يُشغّل الاسترجاع ContractB()
  5. الحلقة تستمر. الأموال ذهبت 🚨

من المفاجئ نوعًا ما مدى بساطة هذا ومع ذلك مدى تدميره.

مثال على الكود الضعيف 📝

إليك ما يبدو عليه العقد القابل للاختراق: صلابه وظيفة withdrawAll() عامة { uint bal = أرصدة [msg.sender]; require(bal > 0).

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

balances[msg.sender] = 0; // تحديث بعد الإرسال؟ خطأ كبير!

}

يظهر عقد الهجوم هذا: صلابه fallback() خارجي قابل للدفع { if(etherStore.balance >= 1 ether) etherStore.withdrawAll(); }

function attack() خارجي قابل للدفع { require(msg.value >= 1 ether) ؛ etherStore.deposit{القيمة: 1 إيثر} (); etherStore.withdrawAll(); }

ثلاث طرق لوقف هذه الهجمات 🛡️

1. غير قابلة لإعادة الدخول المعدل 🔒

الصمود bool خاص مقفل = false;

المعدل nonReentrant() { require(!locked, "لا إعادة دخول"); مقفلة = true; _; مقفل = خطأ; }

أضفه إلى الوظائف الضعيفة. بسيطة ولكن فعالة.

2. نمط الفحوصات-التأثيرات-التفاعلات 📊

هذا أمر حاسم:

سوليديتي وظيفة withdrawAll() عامة { uint bal = أرصدة [msg.sender]; require(bal > 0).

الأرصدة [msg.sender] = 0 ؛ التحديث أولا

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

}

قم بتحديث ولايتك أولاً. تفاعل لاحقاً. دائماً.

3. الحماية العالمية 🌐

للمشاريع الأكبر:

صلابه عقد GlobalReentrancyGuard { bool خاص مغلق = false;

المعدل globalNonReentrant() {
    require(!locked, "لا إعادة الدخول");
    مقفل = صحيح;
    _;
    مغلق = خطأ ؛
}

}

اجعل جميع عقودك ترث هذا. نظام بيئي أكثر أمانًا.

أحدث الاتجاهات 🔥

اعتبارًا من سبتمبر 2025، لا تزال هذه الهجمات تؤرق DeFi. ليس من الواضح تمامًا لماذا يواصل المطورون ارتكاب نفس الأخطاء. يمكن لأدوات مثل Slither اكتشاف هذه المشكلات. تساعد Echidna و Foundry في اختبارها 🚀

الأمان ليس مجرد إضافة مُعدل. إنها عقلية.

ابق حذرًا هناك! 🛡️

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