पूर्णांक अतिप्रवाह स्वच्छता

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

अनपेक्षित पूर्णांक अतिप्रवाह मेमोरी एक्सेस या मेमोरी आवंटन से जुड़े चर में स्मृति भ्रष्टाचार या सूचना प्रकटीकरण कमजोरियों का कारण बन सकता है। इसका मुकाबला करने के लिए, हमने एंड्रॉइड 7.0 में मीडिया ढांचे को सख्त करने के लिए क्लैंग के अपरिभाषित व्यवहार सैनिटाइज़र (UBSan) पर हस्ताक्षर किए और अहस्ताक्षरित पूर्णांक ओवरफ़्लो सैनिटाइज़र जोड़े। एंड्रॉइड 9 में, हमने अधिक घटकों को कवर करने और इसके लिए बेहतर बिल्ड सिस्टम समर्थन के लिए यूबीएसन का विस्तार किया

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

उदाहरण और स्रोत

पूर्णांक अतिप्रवाह स्वच्छता (इंटसैन) संकलक द्वारा प्रदान किया जाता है और अंकगणितीय अतिप्रवाह का पता लगाने के लिए संकलन समय के दौरान बाइनरी में उपकरण जोड़ता है। यह पूरे प्लेटफॉर्म पर विभिन्न घटकों में डिफ़ॉल्ट रूप से सक्षम है, उदाहरण के लिए /platform/external/libnl/Android.bp

कार्यान्वयन

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

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

मेकफ़ाइल्स में इंटसैन का समर्थन करना

मेकफ़ाइल में IntSan को सक्षम करने के लिए, जोड़ें:

LOCAL_SANITIZE := integer_overflow
# Optional features
LOCAL_SANITIZE_DIAG := integer_overflow
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
  • LOCAL_SANITIZE सैनिटाइज़र की अल्पविराम से अलग की गई सूची लेता है, integer_overflow पूर्णांक_ओवरफ़्लो डिफ़ॉल्ट ब्लैकलिस्ट वाले व्यक्तिगत हस्ताक्षरित और अहस्ताक्षरित पूर्णांक ओवरफ़्लो सैनिटाइज़र के लिए विकल्पों का एक पूर्व-पैकेज सेट होता है।
  • LOCAL_SANITIZE_DIAG सैनिटाइज़र के लिए निदान मोड चालू करता है। केवल परीक्षण के दौरान निदान मोड का उपयोग करें क्योंकि यह अतिप्रवाह पर निरस्त नहीं होगा, शमन के सुरक्षा लाभ को पूरी तरह से नकार देगा। अतिरिक्त विवरण के लिए समस्या निवारण देखें।
  • LOCAL_SANITIZE_BLACKLIST आपको फ़ंक्शन और स्रोत फ़ाइलों को स्वच्छ होने से रोकने के लिए एक ब्लैकलिस्ट फ़ाइल निर्दिष्ट करने की अनुमति देता है। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

यदि आप अधिक बारीक नियंत्रण चाहते हैं, तो एक या दोनों झंडों का उपयोग करके सैनिटाइज़र को अलग-अलग सक्षम करें:

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

ब्लूप्रिंट फाइलों में इंटसैन का समर्थन करना

ब्लूप्रिंट फ़ाइल, जैसे /platform/external/libnl/Android.bp में पूर्णांक अतिप्रवाह स्वच्छता को सक्षम करने के लिए, जोड़ें:

   sanitize: {
      integer_overflow: true,
      diag: {
          integer_overflow: true,
      },
      blacklist: "modulename_blacklist.txt",
   },

फ़ाइल बनाने की तरह, integer_overflow गुण डिफ़ॉल्ट ब्लैकलिस्ट के साथ व्यक्तिगत हस्ताक्षरित और अहस्ताक्षरित पूर्णांक अतिप्रवाह सैनिटाइज़र के लिए विकल्पों का एक पूर्व-पैक सेट है।

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

blacklist संपत्ति एक ब्लैकलिस्ट फ़ाइल के विनिर्देश की अनुमति देती है जो डेवलपर्स को कार्यों और स्रोत फ़ाइलों को स्वच्छ होने से रोकने की अनुमति देती है। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

सैनिटाइज़र को व्यक्तिगत रूप से सक्षम करने के लिए, उपयोग करें:

   sanitize: {
      misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
      diag: {
          misc_undefined: ["signed-integer-overflow",
                           "unsigned-integer-overflow",],
      },
      blacklist: "modulename_blacklist.txt",
   },

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

यदि आप नए घटकों में पूर्णांक अतिप्रवाह स्वच्छता को सक्षम कर रहे हैं, या उन प्लेटफ़ॉर्म पुस्तकालयों पर भरोसा करते हैं जिनके पास पूर्णांक अतिप्रवाह स्वच्छता है, तो आप कुछ मुद्दों में भाग ले सकते हैं जिनमें सौम्य पूर्णांक अतिप्रवाह के कारण गर्भपात हो सकता है। यह सुनिश्चित करने के लिए कि सौम्य अतिप्रवाह सामने आ सकता है, आपको स्वच्छता सक्षम घटकों का परीक्षण करना चाहिए।

उपयोगकर्ता बिल्ड में सैनिटाइजेशन के कारण होने वाले एबॉर्ट्स को खोजने के लिए, UBSan द्वारा पकड़े गए ओवरफ्लो को इंगित करने वाले एबॉर्ट संदेशों के साथ SIGABRT क्रैश की खोज करें, जैसे:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: sub-overflow'

स्टैक ट्रेस में निरस्त करने वाला फ़ंक्शन शामिल होना चाहिए, हालांकि, इनलाइन फ़ंक्शंस में होने वाले ओवरफ़्लो स्टैक ट्रेस में स्पष्ट नहीं हो सकते हैं।

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

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

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

  • अतिप्रवाह से बचने के लिए कोड को पुन: सक्रिय करना ( उदाहरण )
  • क्लैंग के __बिल्टिन_*_ओवरफ्लो फ़ंक्शन ( उदाहरण ) के माध्यम से स्पष्ट रूप से ओवरफ़्लो
  • no_sanitize विशेषता निर्दिष्ट करके फ़ंक्शन में sanitization अक्षम करना ( उदाहरण )
  • ब्लैकलिस्ट फ़ाइल के माध्यम से किसी फ़ंक्शन या स्रोत फ़ाइल के सैनिटाइजेशन को अक्षम करना ( उदाहरण )

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

सामान्य पैटर्न जिसके परिणामस्वरूप सौम्य अतिप्रवाह हो सकते हैं उनमें शामिल हैं:

  • निहित कास्ट जहां हस्ताक्षरित प्रकार ( उदाहरण ) में डालने से पहले एक हस्ताक्षरित अतिप्रवाह होता है
  • लिंक्ड सूची विलोपन जो विलोपन पर लूप इंडेक्स को घटाता है ( उदाहरण )
  • वास्तविक अधिकतम मान निर्दिष्ट करने के बजाय एक अहस्ताक्षरित प्रकार को -1 पर असाइन करना ( उदाहरण )
  • लूप्स जो स्थिति में एक अहस्ताक्षरित पूर्णांक को घटाते हैं ( उदाहरण , उदाहरण )

यह अनुशंसा की जाती है कि डेवलपर्स आश्वस्त करें कि ऐसे मामले जहां सैनिटाइज़र एक अतिप्रवाह का पता लगाता है कि यह वास्तव में बिना किसी अनपेक्षित दुष्प्रभाव या सुरक्षा प्रभाव के बिना स्वच्छता को अक्षम करने से पहले सौम्य है।

इंटसैन को अक्षम करना

आप ब्लैकलिस्ट या फ़ंक्शन विशेषताओं के साथ IntSan को अक्षम कर सकते हैं। संयम से अक्षम करें और केवल तभी जब कोड को फिर से सक्रिय करना अन्यथा अनुचित है या यदि कोई समस्यात्मक प्रदर्शन ओवरहेड है।

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

मान्यकरण

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