स्कूडो

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

स्कूडो पूरी तरह से विकसित मेमोरी एरर डिटेक्टर जैसे एड्रेससैनिटाइज़र (आसन) की तुलना में अधिक शमन है।

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

Android 10 में, scudo को .mk फ़ाइल में LOCAL_SANITIZE := scudo विकल्प या .bp फ़ाइल में sanitize: { scudo: true, } सेट करके प्रति-बाइनरी आधार पर सक्षम किया जाना था।

स्कूडो ओपन सोर्स है और एलएलवीएम के कंपाइलर-आरटी प्रोजेक्ट का हिस्सा है। दस्तावेज़ीकरण https://llvm.org/docs/ScudoHardenedAllocator.html पर उपलब्ध है। एंड्रॉइड टूलचेन के हिस्से के रूप में स्कूडो रनटाइम जहाजों और बाइनरी में आवंटक को आसान सक्षम करने की अनुमति देने के लिए सूंग और मेक में समर्थन जोड़ा गया था।

आप नीचे वर्णित विकल्पों का उपयोग करके आवंटक के भीतर अतिरिक्त शमन को सक्षम या अक्षम कर सकते हैं।

अनुकूलन

आवंटक के कुछ मापदंडों को प्रति-प्रक्रिया के आधार पर कई तरीकों से परिभाषित किया जा सकता है:

  • सांख्यिकीय रूप से : प्रोग्राम में एक __scudo_default_options फ़ंक्शन को परिभाषित करें जो पार्स किए जाने वाले विकल्प स्ट्रिंग को लौटाता है। इस फ़ंक्शन में निम्न प्रोटोटाइप होना चाहिए: extern "C" const char *__scudo_default_options()
  • गतिशील रूप से: पर्यावरण चर SCUDO_OPTIONS का उपयोग करें जिसमें विकल्प स्ट्रिंग को पार्स किया जाना है। इस तरह से परिभाषित विकल्प __scudo_default_options के माध्यम से बनाई गई किसी भी परिभाषा को ओवरराइड करते हैं।

निम्न विकल्प उपलब्ध हैं।

विकल्प 64-बिट डिफ़ॉल्ट 32-बिट डिफ़ॉल्ट विवरण
QuarantineSizeKb 256 64 क्वारंटाइन का आकार (केबी में) विखंडू के वास्तविक विलोपन में देरी के लिए उपयोग किया जाता है। कम मान स्मृति उपयोग को कम कर सकता है लेकिन शमन की प्रभावशीलता को कम कर सकता है; एक ऋणात्मक मान डिफ़ॉल्ट पर वापस आ जाता है। इसे और ThreadLocalQuarantineSizeKb दोनों को शून्य पर सेट करने से क्वारंटाइन पूरी तरह से अक्षम हो जाता है।
QuarantineChunksUpToSize 2048 512 आकार (बाइट्स में) जिस तक विखंडू को क्वारंटाइन किया जा सकता है।
ThreadLocalQuarantineSizeKb 64 16 प्रति-थ्रेड कैश का आकार (केबी में) वैश्विक संगरोध को उतारने के लिए उपयोग किया जाता है। कम मान स्मृति उपयोग को कम कर सकता है लेकिन वैश्विक संगरोध पर विवाद बढ़ा सकता है। इसे और QuarantineSizeKb दोनों को शून्य पर सेट करने से क्वारंटाइन पूरी तरह से अक्षम हो जाता है।
DeallocationTypeMismatch false false मॉलोक/डिलीट, न्यू/फ्री, न्यू/डिलीट पर एरर रिपोर्टिंग को सक्षम करता है []
DeleteSizeMismatch true true नए और हटाए गए आकारों के बीच बेमेल होने पर त्रुटि रिपोर्टिंग सक्षम करता है।
ZeroContents false false आवंटन और डीलोकेशन पर शून्य खंड सामग्री को सक्षम करता है।
allocator_may_return_null false false निर्दिष्ट करता है कि प्रक्रिया को समाप्त करने के बजाय, पुनर्प्राप्ति योग्य त्रुटि होने पर आवंटक शून्य वापस आ सकता है।
hard_rss_limit_mb 0 0 जब प्रक्रिया का RSS इस सीमा तक पहुँच जाता है, तो प्रक्रिया समाप्त हो जाती है।
soft_rss_limit_mb 0 0 जब प्रक्रिया का RSS इस सीमा तक पहुँच जाता है, तो आगे के आवंटन विफल हो जाते हैं या null हो जाते हैं ( allocator_may_return_null के मूल्य के आधार पर), जब तक कि RSS नए आवंटन की अनुमति देने के लिए वापस नहीं जाता।
allocator_release_to_os_interval_ms एन/ए 5000 केवल 64-बिट आवंटक को प्रभावित करता है। यदि सेट किया जाता है, तो अप्रयुक्त मेमोरी को OS में रिलीज़ करने का प्रयास करता है, लेकिन इस अंतराल (मिलीसेकंड में) से अधिक बार नहीं। यदि मान ऋणात्मक है, तो OS को स्मृति जारी नहीं की जाती है।
abort_on_error true true यदि सेट किया जाता है, तो टूल त्रुटि संदेश को प्रिंट करने के बाद _exit() ) के बजाय abort() को कॉल करता है।

मान्यकरण

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

समस्या निवारण

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

यहां वर्तमान त्रुटि संदेशों और उनके संभावित कारणों की सूची दी गई है:

  • corrupted chunk header : चंक हेडर का चेकसम सत्यापन विफल हो गया है। यह दो चीजों में से एक के कारण होने की संभावना है: हेडर को ओवरराइट किया गया था (आंशिक रूप से या पूरी तरह से), या फ़ंक्शन को पास किया गया पॉइंटर एक हिस्सा नहीं है।
  • race on chunk header : दो अलग-अलग धागे एक ही समय में एक ही शीर्षलेख में हेरफेर करने का प्रयास कर रहे हैं। यह आमतौर पर दौड़ की स्थिति या उस खंड पर संचालन करते समय लॉकिंग की सामान्य कमी का लक्षण है।
  • invalid chunk state : किसी दिए गए ऑपरेशन के लिए खंड अपेक्षित स्थिति में नहीं है, उदाहरण के लिए, इसे मुक्त करने का प्रयास करते समय इसे आवंटित नहीं किया जाता है, या इसे रीसायकल करने का प्रयास करते समय इसे संगरोध नहीं किया जाता है। एक डबल फ्री इस त्रुटि का विशिष्ट कारण है।
  • misaligned pointer : बुनियादी संरेखण आवश्यकताओं को दृढ़ता से लागू किया जाता है: 32-बिट प्लेटफॉर्म पर 8 बाइट्स और 64-बिट प्लेटफॉर्म पर 16 बाइट्स। यदि हमारे कार्यों के लिए पारित एक सूचक उन पर फिट नहीं होता है, तो कार्यों में से एक को दिया गया सूचक संरेखण से बाहर है।
  • allocation type mismatch : जब यह विकल्प सक्षम होता है, तो एक खंड पर बुलाए गए एक डीलोकेशन फ़ंक्शन को उस प्रकार के फ़ंक्शन से मेल खाना चाहिए जिसे इसे आवंटित करने के लिए बुलाया गया था। इस प्रकार का बेमेल सुरक्षा मुद्दों को पेश कर सकता है।
  • invalid sized delete : जब C++14 आकार के डिलीट ऑपरेटर का उपयोग किया जाता है, और वैकल्पिक चेक सक्षम किया जाता है, तो उस आकार के बीच एक बेमेल होता है जो एक खंड को हटाते समय पारित किया गया था और आकार जिसे आवंटित करते समय अनुरोध किया गया था। यह आम तौर पर एक कंपाइलर समस्या है या ऑब्जेक्ट को हटाए जाने पर एक प्रकार का भ्रम है।
  • RSS limit exhausted : वैकल्पिक रूप से निर्दिष्ट RSS की अधिकतम सीमा पार हो गई है।

यदि आप OS में ही क्रैश डीबग कर रहे हैं, तो आप HWASan OS बिल्ड का उपयोग कर सकते हैं। यदि आप किसी ऐप में क्रैश डिबगिंग कर रहे हैं, तो HWASan ऐप बिल्ड का भी उपयोग करना संभव है।