Trending News

BTC
$23,188.19
+0.77
ETH
$1,671.19
+1.78
LTC
$100.92
+1.82
DASH
$65.04
+2.18
XMR
$165.87
-1.13
NXT
$0.01
+0.77
ETC
$22.91
+1.51

सॉलिडिटी ऑप्टिमाइज़र और ABIEncoderV2 बग

0


सॉलिडिटी ऑप्टिमाइज़र और ABIEncoderV2 बग घोषणा

एथेरियम बग बाउंटी प्रोग्राम के माध्यम से, हमें नए प्रयोगात्मक एबीआई एन्कोडर (एबीआईएनकोडरवी2 के रूप में संदर्भित) के भीतर एक दोष के बारे में एक रिपोर्ट प्राप्त हुई। जांच करने पर, यह पाया गया कि घटक एक ही प्रकार के कुछ भिन्न रूपों से ग्रस्त है। इस घोषणा के पहले भाग में इस बग के बारे में विस्तार से बताया गया है। नया एबीआई एन्कोडर अभी भी प्रयोगात्मक के रूप में चिह्नित है, लेकिन हम फिर भी सोचते हैं कि यह एक प्रमुख घोषणा के योग्य है क्योंकि यह पहले से ही मेननेट पर उपयोग किया जा चुका है।

इसके अतिरिक्त, पिछले दो हफ्तों में ऑप्टिमाइज़र में दो कम प्रभाव वाले बग की पहचान की गई है, जिनमें से एक को सॉलिडिटी v0.5.6 के साथ ठीक किया गया था। दोनों को संस्करण 0.5.5 के साथ पेश किया गया था। विवरण के लिए इस घोषणा का दूसरा भाग देखें।

0.5.7 रिलीज इस ब्लॉग पोस्ट में समझाए गए सभी बगों के समाधान शामिल हैं।

यहां उल्लिखित सभी बग परीक्षणों में आसानी से दिखाई देने चाहिए जो प्रासंगिक कोड पथों को छूते हैं, कम से कम जब शून्य और गैर-शून्य मानों के सभी संयोजनों के साथ चलते हैं।

मेलोनपोर्ट टीम (ट्रैविस जैकब्स और जेना ज़ेंक) और मेलन काउंसिल (निक मुनोज़-मैकडॉनल्ड, मार्टिन लुंडफॉल, मैट डि फेरेंटे और एडम कोलार) को श्रेय, जिन्होंने एथेरियम बग बाउंटी प्रोग्राम के माध्यम से इसकी सूचना दी!

किसे चिंतित होना चाहिए

यदि आपने प्रायोगिक ABI एनकोडर V2 का उपयोग करने वाले अनुबंधों को तैनात किया है, तो वे प्रभावित हो सकते हैं। इसका मतलब यह है कि केवल अनुबंध जो स्रोत कोड के भीतर निम्नलिखित निर्देश का उपयोग करते हैं, प्रभावित हो सकते हैं:

pragma experimental ABIEncoderV2;

इसके अतिरिक्त, बग को ट्रिगर करने के लिए कई आवश्यकताएँ हैं। अधिक जानकारी के लिए आगे नीचे तकनीकी विवरण देखें।

जहाँ तक हम बता सकते हैं, लगभग 2500 अनुबंध मेननेट पर रहते हैं जो प्रयोगात्मक ABIEncoderV2 का उपयोग करते हैं। यह स्पष्ट नहीं है कि उनमें से कितने में बग है।

कैसे जांचें कि अनुबंध कमजोर है या नहीं

बग केवल तभी प्रकट होता है जब निम्नलिखित सभी शर्तें पूरी होती हैं:

  • एरेज़ या स्ट्रक्चर्स से जुड़े स्टोरेज डेटा को सीधे बाहरी फ़ंक्शन कॉल पर भेजा जाता है abi.encode या किसी स्थानीय (मेमोरी) वेरिएबल AND को पूर्व असाइनमेंट के बिना इवेंट डेटा के लिए
  • एक सरणी है जिसमें 32 बाइट्स से कम आकार वाले तत्व होते हैं या एक संरचना होती है जिसमें ऐसे तत्व होते हैं जो स्टोरेज स्लॉट या प्रकार के सदस्यों को साझा करते हैं बाइट्सएनएन 32 बाइट्स से कम।

इसके अतिरिक्त, निम्न स्थितियों में, आपका कोड प्रभावित नहीं होता है:

  • यदि आपके सभी structs या arrays केवल उपयोग करते हैं uint256 या int256 प्रकार
  • यदि आप केवल पूर्णांक प्रकार का उपयोग करते हैं (जो छोटा हो सकता है) और एक समय में केवल एक सरणी में एन्कोड करें
  • यदि आप केवल ऐसा डेटा लौटाते हैं और इसका उपयोग नहीं करते हैं abi.encodeबाहरी कॉल या ईवेंट डेटा।

यदि आपके पास कोई अनुबंध है जो इन शर्तों को पूरा करता है, और यह सत्यापित करना चाहते हैं कि क्या अनुबंध वास्तव में असुरक्षित है, तो आप इसके माध्यम से हमसे संपर्क कर सकते हैं security@ethereum.org.

भविष्य में इस प्रकार की खामियों को कैसे रोका जाए

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

हम उच्च गुणवत्ता सुनिश्चित करने के लिए अपनी पूरी कोशिश करते हैं, और हाल ही में कुछ हिस्सों के ‘सिमेंटिक’ फ़ज़िंग पर काम करना शुरू कर दिया है ओएसएस-फ़ज़ (हमने पहले कंपाइलर को क्रैश-फ़ज़ किया है, लेकिन उसने कंपाइलर शुद्धता का परीक्षण नहीं किया)।

डेवलपर्स के लिए – सॉलिडिटी कंपाइलर के भीतर बग भेद्यता डिटेक्टरों जैसे उपकरणों के साथ पता लगाना मुश्किल होता है, क्योंकि उपकरण जो स्रोत कोड या एएसटी-प्रतिनिधित्व पर काम करते हैं, उन खामियों का पता नहीं लगाते हैं जो केवल संकलित बायटेकोड में पेश की जाती हैं।

इस प्रकार की खामियों से बचाव का सबसे अच्छा तरीका है कि आपके अनुबंधों (सभी कोड पथों की पुष्टि) के लिए एंड-टू-एंड परीक्षणों का एक कठोर सेट होना चाहिए, क्योंकि एक कंपाइलर में बग “साइलेंट” नहीं होते हैं और इसके बजाय अमान्य में प्रकट होते हैं। जानकारी।

संभावित परिणाम

स्वाभाविक रूप से, किसी भी बग के कार्यक्रम नियंत्रण प्रवाह के आधार पर बेतहाशा भिन्न परिणाम हो सकते हैं, लेकिन हम उम्मीद करते हैं कि यह शोषण की तुलना में खराबी की ओर ले जाने की अधिक संभावना है।

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

समय

2019-03-16:

  • बग बाउंटी के माध्यम से रिपोर्ट करें, भंडारण से सीधे एबीआई एनकोडर में बूलियन्स की सरणियों से पढ़ने के कारण होने वाले भ्रष्टाचार के बारे में।

2019-03-16 से 2019-03-21:

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

2019-03-20:

  • सूचना सार्वजनिक करने का निर्णय
  • तर्क: सभी कमजोर अनुबंधों का पता लगाना और समय पर सभी लेखकों तक पहुंचना संभव नहीं होगा, और मेननेट पर कमजोर अनुबंधों के आगे प्रसार को रोकना अच्छा होगा।

2019-03-26:

  • नया कंपाइलर रिलीज़, संस्करण 0.5.7।
  • यह पोस्ट जारी।

तकनीकी जानकारी

पार्श्वभूमि

अनुबंध एबीआई एक विनिर्देश है कि कैसे डेटा को बाहर से अनुबंधों (एक डैप) से या अनुबंधों के बीच बातचीत करते समय आदान-प्रदान किया जा सकता है। यह विभिन्न प्रकार के डेटा का समर्थन करता है, जिसमें सरल मान जैसे संख्या, बाइट्स और स्ट्रिंग्स, साथ ही अधिक जटिल डेटा प्रकार, सरणियाँ और स्ट्रक्चर शामिल हैं।

जब कोई अनुबंध इनपुट डेटा प्राप्त करता है, तो इसे डीकोड करना चाहिए (यह “एबीआई डिकोडर” द्वारा किया जाता है) और डेटा वापस करने या किसी अन्य अनुबंध को डेटा भेजने से पहले, इसे एन्कोड करना होगा (यह “एबीआई एन्कोडर” द्वारा किया जाता है)। सॉलिडिटी कंपाइलर एक अनुबंध में प्रत्येक परिभाषित फ़ंक्शन के लिए कोड के इन दो टुकड़ों को उत्पन्न करता है (और इसके लिए भी abi.encode तथा abi.decode). सॉलिडिटी कंपाइलर में एनकोडर और डिकोडर उत्पन्न करने वाले सबसिस्टम को “एबीआई एनकोडर” कहा जाता है।

2017 के मध्य में सॉलिडिटी टीम ने “एबीआई एनकोडर वी2” नामक एक नए कार्यान्वयन पर काम करना शुरू किया, जिसका लक्ष्य अधिक लचीला, सुरक्षित, प्रदर्शन करने वाला और श्रव्य कोड जनरेटर होना था। यह प्रयोगात्मक कोड जनरेटर, जब स्पष्ट रूप से सक्षम होता है, तो 2017 के अंत से 0.4.19 रिलीज के साथ उपयोगकर्ताओं को पेश किया गया है।

दोष

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

इसके अलावा, 32 बाइट्स से कम तत्वों वाले सरणियों को सही ढंग से नियंत्रित नहीं किया जा सकता है, भले ही आधार प्रकार एक पूर्णांक प्रकार हो। ऊपर वर्णित तरीके से इस तरह के सरणियों को एन्कोडिंग करने से एन्कोडिंग में अन्य डेटा को अधिलेखित किया जा सकता है यदि एन्कोड किए गए तत्वों की संख्या एकल स्लॉट में फिट होने वाले तत्वों की संख्या से अधिक नहीं है। यदि एन्कोडिंग में सरणी का अनुसरण नहीं करता है (ध्यान दें कि गतिशील आकार की सरणियों को हमेशा सांख्यिकीय आकार की सामग्री के साथ स्थिर आकार के सरणियों के बाद एन्कोड किया जाता है), या यदि केवल एक सरणी को एन्कोड किया जाता है, तो कोई अन्य डेटा अधिलेखित नहीं होता है।

दो असंबंधित बग

ऊपर बताए गए एबीआई एनकोडर मुद्दे से असंबंधित, ऑप्टिमाइज़र में दो बग पाए गए हैं। दोनों को 0.5.5 (5 मार्च को रिलीज) के साथ पेश किया गया है। जब तक इनलाइन असेंबली का उपयोग नहीं किया जाता है, तब तक संकलक द्वारा उत्पन्न कोड में होने की संभावना नहीं है।

हाल ही में सॉलिडिटी को जोड़कर इन दो बगों की पहचान की गई है ओएसएस-फ़ज़ – विभिन्न परियोजनाओं में विसंगतियों या मुद्दों को खोजने के लिए एक सुरक्षा टूलकिट। सॉलिडिटी के लिए हमने कंपाइलर के विभिन्न पहलुओं का परीक्षण करने वाले कई अलग-अलग फ़ज़र्स को शामिल किया है।

  1. ऑप्टिमाइज़र ओपकोड अनुक्रमों को बदल देता है ((एक्स << ए) << बी))कहाँ पे एक तथा बी संकलन-समय स्थिरांक हैं, में (एक्स << (ए + बी)) अतिरिक्त में अतिप्रवाह ठीक से नहीं संभालते हुए।
  2. ऑप्टिमाइज़र गलत तरीके से हैंडल करता है बाइट opcode अगर लगातार 31 को दूसरे तर्क के रूप में प्रयोग किया जाता है। इंडेक्स एक्सेस चालू करते समय ऐसा हो सकता है बाइट्सएनएन 31 के संकलन-समय स्थिर मान (इंडेक्स नहीं) के साथ या इनलाइन असेंबली में बाइट ओपकोड का उपयोग करते समय टाइप करें।

इस पोस्ट को @axic, @chriseth, @holiman ने संयुक्त रूप से कंपोज किया था



Source link

Leave A Reply

Your email address will not be published.

Shares