स्मार्ट कॉन्ट्रैक्ट ऑडिटिंग के लिए शुरुआती गाइड में आपका स्वागत है! स्मार्ट कॉन्ट्रैक्ट ऑडिटिंग के साथ शुरुआत करने के सर्वोत्तम तरीकों में से एक है, स्मार्ट कॉन्ट्रैक्ट्स में कुछ सामान्य प्रकार की कमजोरियों को देखना और देखना।
यह मददगार होगा यदि आपको पहले से ही एथेरियम की सॉलिडिटी प्रोग्रामिंग भाषा की बुनियादी समझ है। जैसा कि हम Noob सॉलिडिटी प्रोग्रामर्स द्वारा लिखे गए कुछ कोड को देखेंगे।
पुन: प्रवेश हमला
वास्तविक दुनिया परिदृश्य:
कल्पना कीजिए कि आपके पास 50 चॉकलेट हैं। आपकी एक नटखट छोटी बहन है जिसे आपने एक बार में केवल 2 चॉकलेट लेने की अनुमति दी है। आप उसे एक दिन में 10 से अधिक चॉकलेट नहीं देना चाहेंगे, इस डर से कि कहीं उसके दाँत खराब न हो जाएँ। इसे सुनिश्चित करने के लिए आप हर शाम गिनते हैं कि आपके पास कितनी चॉकलेट बची हैं। क्या आपको लगता है कि यह काम करेगा? या आप अपनी छोटी बहन द्वारा हैक किया जाएगा?
दुर्भाग्य से, यह काम नहीं करेगा! आपकी बहन को पता चलता है कि आप इस बात से अनजान हैं कि शाम होने तक आपके पास कितनी चॉकलेट हैं। तो अगले ही दिन आपकी छोटी बहन शाम से पहले 6 बार आपके पास आती है और हर बार 2 चॉकलेट लेती है! इसे ही हम री-एंट्रेंसी अटैक कहते हैं।
यहां आप हर बार जब आपकी बहन आपसे 2 चॉकलेट लेती है तो गिनती को अपडेट करने के बजाय शाम को आपके पास चॉकलेट की गिनती अपडेट कर रहे हैं। स्मार्ट कॉन्ट्रैक्ट के साथ भी यही होता है। स्मार्ट अनुबंध एक विशेष संतुलन ग्रहण करता है जबकि हमलावर वास्तव में अनुबंध से कई बार क्रिप्टो की कुछ राशि निकालने में व्यस्त होता है।
वास्तविक-विश्व कोड उदाहरण:
यह कोड एक स्मार्ट अनुबंध से संबंधित है जिसे कहा जाता है बैंक रहित. कोई भी व्यक्ति बैंक रहित अनुबंध से ईथर निकाल सकता है, जब तक कि संदेश भेजने वाले (अर्थात कॉल करने वाला) withdraw
function ) निकालने के लिए मांगी गई राशि से अधिक या उसके बराबर है।
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount;
}
ध्यान दें कि ईथर की आवश्यक मात्रा को भेजने के लिए एक कॉल कीवर्ड का उपयोग किया जाता है msg.sender
. एक हमलावर चोर नामक एक अनुबंध बनाकर इसका फायदा उठा सकता है जिसमें वह एक में वापसी समारोह को कॉल करता है fallback()
समारोह। ए fallback()
सॉलिडिटी में फ़ंक्शन एक विशेष फ़ंक्शन है जो ईथर को स्मार्ट अनुबंध पर भेजे जाने पर निष्पादित होता है।
इसका मतलब है कि एक हमलावर सक्षम है वापसी समारोह को दोबारा कॉल करें. इस प्रकार, स्मार्ट अनुबंध अद्यतन होने से पहले, की शेष राशि msg.sender
कोड की अंतिम पंक्ति में, हमलावर पहले ही कई बार ईथर वापस ले चुका है। इसे टाला जा सकता है यदि कॉल कीवर्ड का उपयोग करने से पहले शेष राशि को अद्यतन किया जाता है, इस प्रकार निम्नलिखित का पालन किया जाता है: जाँच-प्रभाव-बातचीत पैटर्न.
प्रभाव:
RSI पहली बार रीएंट्रेन्सी अटैक 2016 में एक DAO (विकेंद्रीकृत स्वायत्त संगठन) पर हुआ, जिसके परिणामस्वरूप लगभग $50 मिलियन हैक हुए। इस हैक को उलटने के लिए, एथेरियम समुदाय ने एथेरियम ब्लॉकचेन को विभाजित किया जिसने ईटीसी (एथेरियम क्लासिक) और ईटीएच (एथेरियम) को जन्म दिया।
अंकगणित अतिप्रवाह और अंडरफ्लो
वास्तविक दुनिया परिदृश्य:
चलो एक सोचा खेल खेलते हैं। इसमें एक स्पिन-द व्हील होता है, और विजेता का फैसला उस सबसे बड़ी संख्या के आधार पर किया जाता है जो वह पहिया को घुमाने में सक्षम होता है। पहिए को 256 से -256 तक चिह्नित किया गया है।
खेल का नियम यह है कि सभी खिलाड़ियों के लिए पॉइंटर प्रत्येक स्पिन की शुरुआत में 0 पर टिका होता है। और एक खिलाड़ी को केवल ऋणात्मक संख्याओं की दिशा में घूमने की अनुमति है। आप इस खेल को कैसे जीतेंगे?
हर बार इस खेल को जीतने की एक अच्छी रणनीति यह होगी कि पहिया को इतनी शक्ति से घुमाया जाए कि पहिया -256 तक घूमे और फिर एक बार में 256 हो जाए। ऐसा इसलिए संभव है क्योंकि पहिए पर 256 के ठीक बाद 256 आता है। इसे हम अंकगणितीय अंतर्प्रवाह कहते हैं। और अंकगणित अतिप्रवाह इसके ठीक विपरीत है।
वास्तविक-विश्व कोड उदाहरण:
An अंडरफ्लो या ओवरफ्लो तब होता है जब एक अंकगणितीय संक्रिया अपने न्यूनतम या अधिकतम तक पहुँच जाती है।
function withdraw(uint _amount) public { require(balances[msg.sender] - _amount > 0); address payable to = payable(msg.sender); to.transfer(_amount); balances[msg.sender] -= _amount;
}
RSI _amount
निकासी फ़ंक्शन का पैरामीटर एक हस्ताक्षरित पूर्णांक है। बैलेंस मैपिंग का मान (जो कि अजगर में एक शब्दकोश की तरह है या सी ++ या जावा में की-वैल्यू जोड़ी है) भी एक अहस्ताक्षरित पूर्णांक है।
mapping(address => uint256) public balances
आवश्यक विवरण जाँचता है कि क्या का शेष msg.sender
सकारात्मक है या नहीं। लेकिन यह कथन हमेशा सत्य होगा, भले ही राशि के शेष से अधिक हो msg.sender
. ऐसा इसलिए है क्योंकि दोनों balances
और _amount
चर अहस्ताक्षरित पूर्णांक प्रकार के होते हैं और उनका अंकगणितीय परिणाम (अंडरफ्लो के बाद) भी एक अहस्ताक्षरित पूर्णांक होगा!
और जैसा कि आपको याद होगा, एक अहस्ताक्षरित पूर्णांक हमेशा धनात्मक होता है। इसका मतलब है कि एक हमलावर स्मार्ट अनुबंध से असीमित मात्रा में ईथर निकालने में सक्षम है! आप इस भेद्यता के लिए एक विस्तृत उदाहरण और कार्यान्वयन कोड पा सकते हैं यहाँ उत्पन्न करें.
यहां ध्यान देने वाली एक और महत्वपूर्ण बात यह है कि दो अहस्ताक्षरित पूर्णांकों के बीच अंकगणितीय संक्रिया भी एक अहस्ताक्षरित पूर्णांक है। यह खतरनाक हो सकता है अगर स्मार्ट अनुबंधों में इसे अनदेखा किया जाता है, क्योंकि इसके परिणामस्वरूप अवांछित सुरक्षा उल्लंघन हो सकते हैं!
function votes(uint postId, uint upvote, uint downvotes) { if (upvote - downvote < 0) { deletePost(postId) }
}
जैसा कि आपने उपरोक्त उदाहरण में देखा होगा, अगर कथन काफी व्यर्थ है क्योंकि upvote - downvote
हमेशा सकारात्मक रहने वाला है। और पोस्ट डिलीट हो जाएगी भले ही downvotes
से अधिक है upvotes
. इस तरह के हमलों से बचने के लिए, सॉलिडिटी कंपाइलर संस्करण का उपयोग करने की सिफारिश की जाती है 0.8.0.
प्रभाव:
एक सिक्का जिसे . कहा जाता है पीओडब्ल्यूएच सिक्का 2017 में लॉन्च किया गया था। हालांकि यह एक पोंजी गेम था, लेकिन एक अंकगणितीय अतिप्रवाह बग के कारण इसे हैक कर लिया गया, जिसके परिणामस्वरूप उस समय लगभग 866 ETH या $950,000 का नुकसान हुआ। आप इसके बारे में विस्तार से पढ़ सकते हैं यहाँ उत्पन्न करें.
जरूर पढ़े: टाइनीमैन पर हमले से सबक, अल्गोरंड पर सबसे बड़ा डेक्स
सर्विस अटैक से इनकार
वास्तविक दुनिया परिदृश्य:
कल्पना कीजिए कि आप बिटकॉइन टेक यूनिवर्सिटी में हैं। सब कुछ ठीक लगता है सिवाय इसके कि सभी के लिए एक कॉमन डाइनिंग टेबल हो। और दुर्भाग्य से, दूसरे वर्ग के कुछ ही लोग हैं जो हमेशा आपकी कक्षा के किसी के सामने खाने की मेज पर कब्जा करने का प्रबंधन करते हैं।
व्यावहारिक परिदृश्य में, वे सभी को आवश्यक सेवा से वंचित कर रहे हैं जिसके परिणामस्वरूप कीमती समय की हानि हो रही है। इसे हम 'डिनायल ऑफ सर्विस अटैक' कहते हैं।
वास्तविक-विश्व कोड उदाहरण:
नाम के खेल में ईथर का राजाकोई भी राजा बन सकता है। लेकिन राजा बनने का नियम यह है कि व्यक्ति को वर्तमान राजा से अधिक ईथर जमा करना चाहिए। यह कॉल करके किया जा सकता है claimThrone()
ईथर अनुबंध के राजा का कार्य जिसमें व्यक्ति ईथर को सीधे पिछले राजा को भेजता है और नया राजा बन जाता है।
function claimThrone() external payable { require(msg.value > balance, "Need to pay more to become the king"); (bool sent, ) = king.call{value: balance}(""); require(sent, "Failed to send Ether"); balance = msg.value; king = msg.sender; }
जैसा कि आपने अनुमान लगाया होगा, यह कोड DoS अटैक की चपेट में है, लेकिन कैसे? इसके लिए आपको यह समझना होगा कि एथेरियम में दो तरह के एड्रेस होते हैं- पहला है एक बाहरी का पता स्वामित्व वाला खाता या बस एक बटुए का पता, और दूसरा है अनुबंध का पता. अब ईथर को इनमें से किसी भी प्रकार के पते से भेजा जा सकता है।
यदि यह, ईथर को अनुबंध के पते से भेजा जाता है, तो अनुबंध राजा बन जाएगा। लेकिन मान लेते हैं कि इस नए अनुबंध में a . नहीं है fallback()
फ़ंक्शन जो आवश्यक है यदि अनुबंध ईथर को स्वीकार करना चाहता है। फिर अगर कोई नया व्यक्ति साथ आता है और कॉल करने की कोशिश करता है claimThrone()
समारोह, यह हमेशा विफल रहेगा!
ध्यान दें कि यह भी आंशिक रूप से होता है क्योंकि claimThrone()
फ़ंक्शन स्पष्ट रूप से जांचता है कि ईथर का स्थानांतरण सफल था या नहीं, दूसरे आवश्यक विवरण में। आप पूरा कोड ढूंढ सकते हैं और उस पर DoS अटैक कर सकते हैं यहाँ उत्पन्न करें.
यदि कोड में बड़े आकार की सरणी पर लूप है, तो कोड के लिए DoS हमले के प्रति संवेदनशील होना भी संभव है। ऐसा इसलिए होता है क्योंकि गैस सीमा ऐसे मामलों में पार किया जा सकता है। आप इसके बारे में पढ़ सकते हैं यहाँ उत्पन्न करें.
प्रभाव:
एक खेल कहा जाता है सरकारी मानसिक, जो स्पष्ट रूप से एक पोंजी योजना थी, 1100 ईथर के साथ अटक गई क्योंकि भुगतान को संसाधित करने के लिए बड़ी मात्रा में गैस की आवश्यकता थी।
असुरक्षित यादृच्छिकता
वास्तविक दुनिया परिदृश्य:
एक बार हेस्की नाम का एक आदमी रहता था जो हमेशा अपने बंदर पेस्की के साथ रहता था। हेस्की ने लॉटरी खेल आयोजित किए और अच्छा मुनाफा कमाया। एक दिन ऐलिस ने देखा कि हेस्की अपने बंदर पेस्की को गौर से देख रहा है। फिर उसने देखा कि वह एक कागज के टुकड़े पर कुछ लिख रहा है और उसे एक लिफाफे में बंद कर दिया। जिज्ञासु, उसने आगे की जाँच करने का निर्णय लिया।
उस शाम बाद में, ऐलिस ने देखा कि सीलबंद लिफाफे को सार्वजनिक रूप से खोलकर लॉटरी के विजेता का फैसला किया गया था। कुछ दिनों तक उसे देखने के बाद, ऐलिस को पता चला कि हेस्की ने पेस्की के इशारों को देखकर लॉटरी जीतने का नंबर तय किया था (उदाहरण के लिए अगर बंदर ने अपना सिर खुजलाया, तो हेस्की ने 10 लिख दिया)! अब ऐलिस के पास प्रत्येक लॉटरी जीतने का फॉर्मूला था और उसे बस सही संख्या के साथ लॉटरी टिकट खरीदना था!
हेस्की ने मान लिया था कि लॉटरी के विजेता को तय करने के उनके "यादृच्छिक" तरीके का कभी पता नहीं लगाया जा सकता है, लेकिन वह वास्तव में गलत था।
वास्तविक-विश्व कोड उदाहरण:
इस उदाहरण में, एक ब्लॉक की संख्या और उसके ब्लॉक टाइमस्टैम्प के संयोजन के हैश के आधार पर एक यादृच्छिक संख्या उत्पन्न होती है। यह हैश तब उत्तर चर को सौंपा गया है। अब जो कोई भी इस (प्रतीत होता है) यादृच्छिक संख्या का अनुमान लगाता है, उसे 1 ईथर पुरस्कृत किया जाता है। क्या आपको लगता है कि यह अप्राप्य है?
function guess(uint _guess) public { uint answer = uint( keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)) ); if (_guess == answer) { (bool sent, ) = msg.sender.call{value: 1 ether}(""); require(sent, "Failed to send Ether"); } }
नहीं! एक हमलावर अभी भी इस यादृच्छिक संख्या का अनुमान लगा सकता है, बस कोड को कॉपी करके उत्तर चर को निर्दिष्ट मान उत्पन्न करने के लिए, और उसी उत्तर चर को पास कर सकता है guess()
समारोह!
guessTheRandomNumber.guess(answer);
आप पूरा कोड पा सकते हैं यहाँ उत्पन्न करें. इस हमले से बचने के लिए, सत्यापन योग्य रैंडम फ़ंक्शन का उपयोग करने की अनुशंसा की जाती है जैसे कि चेनलिंक वीआरएफ.
प्रभाव:
पर एक हमले के कारण लगभग 400 ETH खो गया था स्मार्ट अरबों लॉटरी अनुबंध। हैरानी की बात यह है कि कॉन्ट्रैक्ट लॉटरी भी अपने आप में एक पोंजी स्कीम थी।
समय में हेरफेर
वास्तविक दुनिया परिदृश्य:
सातोशी को कुकीज़ खाना बहुत पसंद है। उन्हें हर तरह की कुकीज पसंद हैं जो उनकी मां बनाती हैं। लेकिन उनकी मां बहुत सख्त हैं और उन्हें लगता है कि ज्यादा कुकीज खाना उनके लिए अच्छा नहीं है। इसलिए उसकी मां नियम बनाती है कि उसे रात 8 बजे ही कुकीज मिल जाएंगी।
उसी दिन शाम 7:45 बजे सतोशी दौड़कर अपनी मां के पास जाता है और कुकीज मांगता है। उसकी माँ पूछती है- "क्या समय हो गया है?"
"8 बज गए हैं!" - वह उत्तर देता है।
"ठीक। फिर मेरी अलमारी से कुकीज़ ले लो।”
और इस प्रकार, सातोशी सफलतापूर्वक 15 मिनट के समय में हेरफेर करने में सक्षम था ताकि वह अपनी कुकीज़ प्राप्त कर सके! क्या कुकी-भूखा आदमी है!
वास्तविक-विश्व कोड उदाहरण:
किसी ब्लॉक के टाइमस्टैम्प में लगभग द्वारा हेरफेर किया जा सकता है 15 सेकंड एक खनिक द्वारा। इस तरह, एक खनिक एक अनुकूल टाइमस्टैम्प सेट कर सकता है और अपने लेन-देन को उसी ब्लॉक में शामिल कर सकता है जो वह खदान करता है। कार्यक्रम play()
G-Dot नामक गेम अनुबंध से संबंधित है।
function play() public { require(now > 1640392200 && neverPlayed == true); neverPlayed = false; msg.sender.transfer(1500 ether);
}
यह अनुबंध उस खिलाड़ी को 1500 ईथर का पुरस्कार देता है जो प्ले फंक्शन को सबसे पहले कॉल करता है। लेकिन जैसा कि आप देख सकते हैं, प्ले फ़ंक्शन को केवल तभी कॉल किया जा सकता है जब लेन-देन का अभी या ब्लॉक। टाइमस्टैम्प जिसमें कॉल शामिल है play()
समारोह, से बड़ा है युग का समय 1640392200.
एक खनिक आसानी से इस टाइमस्टैम्प में हेरफेर कर सकता है और कॉल करने के अपने लेनदेन को शामिल कर सकता है play()
एक ही ब्लॉक में कार्य करते हैं जैसे कि वह स्वयं पहला खिलाड़ी है। इस तरह यह गारंटी है कि खनिक खेल जीत जाएगा!
प्रभाव:
ब्लॉक.टाइमस्टैम्प का उपयोग यादृच्छिक संख्या उत्पन्न करने के लिए किया गया था सरकारी और इस प्रकार समय में हेरफेर के हमलों की चपेट में था।
QuillAudits तक पहुंचें
QuillAudits द्वारा डिज़ाइन किया गया एक सुरक्षित स्मार्ट अनुबंध ऑडिट प्लेटफ़ॉर्म है क्विलहाश
टेक्नोलॉजीज।
यह एक ऑडिटिंग प्लेटफॉर्म है जो स्थिर और गतिशील विश्लेषण टूल, गैस एनालाइजर के साथ-साथ सिमुलेटर के साथ प्रभावी मैनुअल समीक्षा के माध्यम से सुरक्षा कमजोरियों की जांच के लिए स्मार्ट अनुबंधों का कड़ाई से विश्लेषण और सत्यापन करता है। इसके अलावा, लेखापरीक्षा प्रक्रिया में व्यापक इकाई परीक्षण के साथ-साथ संरचनात्मक विश्लेषण भी शामिल है।
हम क्षमता का पता लगाने के लिए स्मार्ट कॉन्ट्रैक्ट ऑडिट और पैठ परीक्षण दोनों आयोजित करते हैं
सुरक्षा भेद्यताएं जो मंच की अखंडता को नुकसान पहुंचा सकती हैं।
यदि आपको स्मार्ट कॉन्ट्रैक्ट ऑडिट में किसी सहायता की आवश्यकता है, तो बेझिझक हमारे विशेषज्ञों से संपर्क करें यहाँ!
हमारे काम के साथ अप टू डेट रहने के लिए, हमारे समुदाय में शामिल हों: -
ट्विटर | लिंक्डइन | फेसबुक | Telegram
पोस्ट स्मार्ट कॉन्ट्रैक्ट ऑडिटिंग के लिए शुरुआती गाइड: भाग 1 पर पहली बार दिखाई दिया Quillhash ब्लॉग.
स्रोत: https://blog.quillhash.com/2022/01/19/beginners-guide-to-smart-contract-auditing-part-1/
- "
- &
- 000
- 2016
- 7
- About
- लेखा
- पता
- सब
- पहले ही
- हालांकि
- विश्लेषण
- आडिट
- स्वायत्त
- शुरू
- BEST
- Bitcoin
- blockchain
- दोष
- खरीदने के लिए
- कॉल
- मामलों
- जाँचता
- क्लासिक
- कोड
- सिक्का
- संयोजन
- सामान्य
- समुदाय
- शामिल हैं
- अनुबंध
- ठेके
- कुकीज़
- सका
- बनाना
- क्रिप्टो
- वर्तमान
- डीएओ
- दिन
- विकेन्द्रीकृत
- सेवा से वंचित
- विस्तार
- डेक्स
- नीचे
- आसानी
- खाने
- ETH
- ईथर
- ethereum
- एथेरियम ब्लॉकचेन
- ईथरम क्लासिक
- उदाहरण
- शोषण करना
- फेसबुक
- अंत
- प्रथम
- मुक्त
- समारोह
- खेल
- Games
- गैस
- उत्पन्न
- GitHub
- जा
- अच्छा
- गाइड
- हैक
- हैक्स
- हैश
- सिर
- यहाँ उत्पन्न करें
- कैसे
- HTTPS
- जांच
- IT
- जावा
- में शामिल होने
- छलांग
- राजा
- भाषा
- बड़ा
- लाइन
- लिंक्डइन
- लंबा
- देख
- लाटरी
- आदमी
- दस लाख
- मां
- संख्या
- संगठन
- काग़ज़
- पैटर्न
- वेतन
- स्टाफ़
- टुकड़ा
- मंच
- प्ले
- खिलाड़ी
- पोंजी
- पॉन्ज़ी योजना
- बिजली
- प्रक्रिया
- प्रोग्रामर्स
- प्रोग्रामिंग
- सार्वजनिक
- रेडिट
- उल्टा
- की समीक्षा
- पुरस्कार
- नियम
- सातोशी
- सुरक्षा
- सेट
- स्मार्ट
- स्मार्ट अनुबंध
- स्मार्ट अनुबंध
- So
- दृढ़ता
- कुछ
- स्पिन
- विभाजित
- शुरू
- कथन
- स्ट्रेटेजी
- सफल
- सफलतापूर्वक
- तकनीक
- परीक्षण
- यहाँ
- पहर
- उपकरण
- ट्रांजेक्शन
- बैंक रहित
- विश्वविद्यालय
- अपडेट
- मूल्य
- कमजोरियों
- भेद्यता
- चपेट में
- बटुआ
- क्या
- पहिया
- कौन
- जीतना
- काम
- लिख रहे हैं