सॉलिडिटी स्टोरेज ऐरे बग अनाउंसमेंट
यह ब्लॉग पोस्ट भंडारण सरणियों से जुड़े दो बगों के बारे में है जो अन्यथा असंबंधित हैं। दोनों लंबे समय से संकलक में मौजूद हैं और केवल अब ही खोजे गए हैं, हालांकि उनमें शामिल एक अनुबंध को परीक्षणों में खराबी दिखाने की बहुत संभावना है।
दानम किम की मदद से गुयेन फामदोनों से कर्वग्रिड एक ऐसे मुद्दे की खोज की जहां अमान्य डेटा को हस्ताक्षरित पूर्णांकों के सरणियों के संबंध में संग्रहीत किया जाता है।
यह बग सॉलिडिटी 0.4.7 के बाद से मौजूद है और हम इसे दोनों में से अधिक गंभीर मानते हैं। यदि ये सरणियाँ एक निश्चित स्थिति में नकारात्मक पूर्णांकों का उपयोग करती हैं, तो यह डेटा भ्रष्टाचार का कारण बनेगा और इस प्रकार बग का पता लगाना आसान होना चाहिए।
एथेरियम बग बाउंटी प्रोग्राम के माध्यम से, हमें नए प्रयोगात्मक एबीआई एन्कोडर (एबीआईएनकोडरवी2 के रूप में संदर्भित) के भीतर एक दोष के बारे में एक रिपोर्ट प्राप्त हुई। नया एबीआई एन्कोडर अभी भी प्रयोगात्मक के रूप में चिह्नित है, लेकिन हम फिर भी सोचते हैं कि यह एक प्रमुख घोषणा के योग्य है क्योंकि यह पहले से ही मेननेट पर उपयोग किया जा चुका है। मिंग चुआन लिन को श्रेय (का https://www.secondstate.io) बग को खोजने और ठीक करने दोनों के लिए!
0.5.10 रिलीज बग्स को ठीक करता है। फिलहाल, हम सॉलिडिटी की विरासत 0.4.x श्रृंखला को ठीक करने की योजना नहीं बना रहे हैं, लेकिन अगर लोकप्रिय मांग है तो हम ऐसा कर सकते हैं।
प्रासंगिक कोड पथों को छूने वाले परीक्षणों में दोनों बग आसानी से दिखाई देने चाहिए।
दो बग के बारे में विवरण नीचे पाया जा सकता है।
हस्ताक्षरित पूर्णांक सरणी बग
किसे चिंतित होना चाहिए
यदि आपने अनुबंधों को तैनात किया है जो भंडारण में हस्ताक्षरित पूर्णांक सरणियों का उपयोग करते हैं और या तो सीधे असाइन करते हैं
- इसमें कम से कम एक नकारात्मक मूल्य के साथ एक शाब्दिक सरणी (एक्स = [-1, -2, -3];) या
- एक मौजूदा सरणी विभिन्न हस्ताक्षरित पूर्णांक प्रकार
इसके लिए, इससे स्टोरेज ऐरे में डेटा करप्शन होगा।
अनुबंध जो केवल अलग-अलग सरणी तत्वों को असाइन करते हैं (यानी with एक्स[2] = -1;) प्रभावित नहीं होते हैं।
कैसे जांचें कि अनुबंध कमजोर है या नहीं
यदि आप भंडारण में हस्ताक्षरित पूर्णांक सरणियों का उपयोग करते हैं, तो उन परीक्षणों को चलाने का प्रयास करें जहाँ आप नकारात्मक मानों का उपयोग करते हैं। प्रभाव यह होना चाहिए कि संग्रहीत वास्तविक मूल्य ऋणात्मक के बजाय सकारात्मक है।
यदि आपके पास कोई अनुबंध है जो इन शर्तों को पूरा करता है, और यह सत्यापित करना चाहते हैं कि क्या अनुबंध वास्तव में असुरक्षित है, तो आप इसके माध्यम से हमसे संपर्क कर सकते हैं security@ethereum.org.
तकनीकी जानकारी
भंडारण सरणियों को विभिन्न प्रकार के सरणियों से सौंपा जा सकता है। इस कॉपी और असाइनमेंट ऑपरेशन के दौरान, प्रत्येक तत्व पर एक प्रकार का रूपांतरण किया जाता है। रूपांतरण के अतिरिक्त, विशेष रूप से यदि हस्ताक्षरित पूर्णांक प्रकार 256 बिट्स से छोटा है, तो एक ही स्टोरेज स्लॉट में एकाधिक मानों को संग्रहीत करने की तैयारी में मूल्य के कुछ बिट्स को शून्य करना होगा।
कौन से बिट को शून्य करना है, गलत तरीके से स्रोत से निर्धारित किया गया था न कि लक्ष्य प्रकार से। इससे बहुत सारे बिट शून्य हो जाते हैं। विशेष रूप से, साइन बिट शून्य होगा जो मान को धनात्मक बनाता है।
ABIEncoderV2 ऐरे बग
किसे चिंतित होना चाहिए
यदि आपने प्रायोगिक ABI एनकोडर V2 का उपयोग करने वाले अनुबंधों को तैनात किया है, तो वे प्रभावित हो सकते हैं। इसका मतलब यह है कि केवल अनुबंध जो स्रोत कोड के भीतर निम्नलिखित निर्देश का उपयोग करते हैं, प्रभावित हो सकते हैं:
pragma experimental ABIEncoderV2;
इसके अतिरिक्त, बग को ट्रिगर करने के लिए कई आवश्यकताएँ हैं। अधिक जानकारी के लिए आगे नीचे तकनीकी विवरण देखें।
कैसे जांचें कि अनुबंध कमजोर है या नहीं
बग केवल तभी प्रकट होता है जब निम्नलिखित सभी शर्तें पूरी होती हैं:
- एरेज़ या स्ट्रक्चर्स से जुड़े स्टोरेज डेटा को सीधे बाहरी फ़ंक्शन कॉल पर भेजा जाता है abi.encode या किसी स्थानीय (मेमोरी) वेरिएबल AND को पूर्व असाइनमेंट के बिना इवेंट डेटा के लिए
- इस डेटा में या तो स्ट्रक्चर्स की एक सरणी या स्टेटिकली-साइज़ सरणियों की एक सरणी होती है (यानी कम से कम द्वि-आयामी)।
इसके अतिरिक्त, निम्न स्थिति में, आपका कोड प्रभावित नहीं होता है:
- यदि आप केवल ऐसा डेटा लौटाते हैं और इसका उपयोग नहीं करते हैं abi.encodeबाहरी कॉल या ईवेंट डेटा।
संभावित परिणाम
स्वाभाविक रूप से, किसी भी बग के कार्यक्रम नियंत्रण प्रवाह के आधार पर बेतहाशा भिन्न परिणाम हो सकते हैं, लेकिन हम उम्मीद करते हैं कि यह शोषण की तुलना में खराबी की ओर ले जाने की अधिक संभावना है।
बग, जब ट्रिगर किया जाता है, कुछ परिस्थितियों में अन्य अनुबंधों के लिए विधि आमंत्रण पर दूषित पैरामीटर भेजेगा।
तकनीकी जानकारी
एन्कोडिंग प्रक्रिया के दौरान, यदि तत्व भंडारण में एक से अधिक स्लॉट पर कब्जा कर लेते हैं, तो प्रयोगात्मक एबीआई एन्कोडर सरणी में अगले तत्व के लिए उचित रूप से आगे नहीं बढ़ता है।
यह केवल उन तत्वों के मामले में है जो structs या स्थिर-आकार वाले सरणियाँ हैं। गतिशील रूप से आकार वाली सरणियों या प्राथमिक डेटाटाइप्स की सारणियाँ प्रभावित नहीं होती हैं।
आप जो विशिष्ट प्रभाव देखेंगे वह यह है कि एन्कोडेड सरणी में डेटा “स्थानांतरित” है: यदि आपके पास प्रकार की सरणी है यूंट[2][] और इसमें डेटा होता है
[[1, 2], [3, 4], [5, 6]]तो यह के रूप में एन्कोड किया जाएगा [[1, 2], [2, 3], [3, 4]] क्योंकि एनकोडर केवल दो के बजाय तत्वों के बीच एक ही स्लॉट से आगे बढ़ता है।
इस पोस्ट को @axic, @chriseth, @holiman ने संयुक्त रूप से कंपोज किया था