स्कूडो एक गतिशील उपयोगकर्ता-मोड मेमोरी एलोकेटर या हीप एलोकेटर है, जिसे प्रदर्शन को बनाए रखते हुए हीप-संबंधित कमजोरियों (जैसे हीप-आधारित बफर ओवरफ्लो , फ्री के बाद उपयोग और डबल फ्री ) के खिलाफ लचीला होने के लिए डिज़ाइन किया गया है। यह मानक C आवंटन और डीलोकेशन प्रिमिटिव (जैसे कि मॉलोक और फ्री), साथ ही C++ प्रिमिटिव (जैसे कि नया और डिलीट) प्रदान करता है।
एड्रेससेनिटाइज़र (एएसएएन) जैसे पूर्ण विकसित मेमोरी त्रुटि डिटेक्टर की तुलना में स्कूडो अधिक शमन है।
एंड्रॉइड 11 रिलीज के बाद से, स्कूडो का उपयोग सभी मूल कोड के लिए किया जाता है (कम-मेमोरी वाले उपकरणों को छोड़कर, जहां जेमलोक अभी भी उपयोग किया जाता है)। रनटाइम पर, सभी निष्पादन योग्य और उनकी लाइब्रेरी निर्भरता के लिए सभी मूल ढेर आवंटन और डीलोकेशन स्कूडो द्वारा सेवित किए जाते हैं, और यदि ढेर में भ्रष्टाचार या संदिग्ध व्यवहार का पता चलता है तो प्रक्रिया निरस्त कर दी जाती है।
स्कूडो खुला स्रोत है और एलएलवीएम के कंपाइलर-आरटी प्रोजेक्ट का हिस्सा है। दस्तावेज़ीकरण 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 | वैश्विक संगरोध को ऑफलोड करने के लिए प्रति-थ्रेड कैश का आकार (KB में) उपयोग किया जाता है। कम मूल्य मेमोरी उपयोग को कम कर सकता है लेकिन वैश्विक संगरोध पर विवाद बढ़ा सकता है। इसे और 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 ऐप बिल्ड का उपयोग करना भी संभव है।