Google 致力于为黑人社区推动种族平等。查看具体举措
此页面由 Cloud Translation API 翻译。
Switch to English

Scudo

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

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

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

एंड्रॉइड 10 में, स्कूडो को LOCAL_SANITIZE := scudo फ़ाइल में LOCAL_SANITIZE := scudo विकल्प या sanitize: { scudo: true, } । Scudo sanitize: { scudo: true, } .bb फ़ाइल में सेट करके प्रति-बाइनरी आधार पर सक्षम होना चाहिए।

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

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

अनुकूलन

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

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

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

विकल्प 64-बिट डिफ़ॉल्ट 32-बिट डिफ़ॉल्ट विवरण
QuarantineSizeKb 256 64 संगरोध का आकार (KB में) चंक्स के वास्तविक निपटान में देरी करता था। एक कम मूल्य स्मृति उपयोग को कम कर सकता है लेकिन शमन की प्रभावशीलता को कम कर सकता है; एक नकारात्मक मान चूक में गिर जाता है। यह और ThreadLocalQuarantineSizeKb दोनों को शून्य पर सेट करना पूरी तरह से संगरोध को अक्षम करता है।
QuarantineChunksUpToSize 2048 512 आकार (बाइट्स में) जिस तक चूजों को संगरोध किया जा सकता है।
ThreadLocalQuarantineSizeKb 64 16 प्रति-सूत्र कैश का आकार (KB में) वैश्विक संगरोध को लोड करने के लिए उपयोग करता है। कम मूल्य स्मृति उपयोग को कम कर सकता है लेकिन वैश्विक संगरोध पर विवाद को बढ़ा सकता है। यह और QuarantineSizeKb दोनों को शून्य पर सेट करना पूरी तरह से QuarantineSizeKb को अक्षम करता है।
DeallocationTypeMismatch false false Malloc / delete, new / free, new / delete [] पर त्रुटि रिपोर्ट करने में सक्षम बनाता है
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 प्रक्रिया के आरएसएस इस सीमा तक पहुँच जाता है, आगे आवंटन असफल या वापसी null (के मूल्य के आधार allocator_may_return_null ), जब तक आरएसएस नई आवंटन के लिए अनुमति देने के लिए वापस नीचे चला जाता है।
allocator_release_to_os_interval_ms एन / ए 5000 केवल 64-बिट आवंटनकर्ता को प्रभावित करता है। यदि सेट किया गया है, तो अप्रयुक्त मेमोरी को ओएस में जारी करने की कोशिश करता है, लेकिन इस अंतराल (मिलीसेकंड में) से अधिक बार नहीं। यदि मान ऋणात्मक है, तो स्मृति OS पर रिलीज़ नहीं होती है।
abort_on_error true true यदि सेट किया जाता है, तो टूल त्रुटि संदेश प्रिंट करने के बाद _exit() बजाय abort() कहता है।

मान्यकरण

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

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

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

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

  • corrupted chunk header : 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 ऐप बिल्ड का उपयोग करना संभव है।