UndefinedBehaviorSanitizer

UndefinedBehaviorSanitizer (UBSan), कंपाइल-टाइम इंस्ट्रुमेंटेशन करता है. इससे अलग-अलग तरह के अनडिफ़ाइंड व्यवहार की जांच की जाती है. UBSan, कई अनडिफ़ाइंड बिहेवियर बग का पता लगा सकता है. हालांकि, Android इन सुविधाओं के साथ काम करता है:

  • अलाइनमेंट
  • बूल
  • बाउंड
  • enum
  • float-cast-overflow
  • float-divide-by-zero
  • integer-divide-by-zero
  • nonnull-attribute
  • खाली
  • रिटर्न स्टेटमेंट
  • returns-nonnull-attribute
  • shift-base
  • shift-exponent
  • signed-integer-overflow
  • पहुंच में नहीं
  • unsigned-integer-overflow
  • vla-bound

अनसाइंड-इंटीजर-ओवरफ़्लो, तकनीकी तौर पर अपरिभाषित व्यवहार नहीं है. हालांकि, इसे सैनिटाइज़र में शामिल किया गया है. साथ ही, इसका इस्तेमाल कई Android मॉड्यूल में किया जाता है. इनमें मीडियासर्वर कॉम्पोनेंट भी शामिल हैं. ऐसा इसलिए किया जाता है, ताकि इंटीजर-ओवरफ़्लो की किसी भी संभावित कमज़ोरी को दूर किया जा सके.

लागू करना

Android के बिल्ड सिस्टम में, UBSan को ग्लोबल या लोकल तौर पर चालू किया जा सकता है. UBSan को सभी के लिए चालू करने के लिए, Android.mk में SANITIZE_TARGET सेट करें. UBSan को हर मॉड्यूल के लेवल पर चालू करने के लिए, LOCAL_SANITIZE सेट करें. साथ ही, Android.mk में उन अनडिफ़ाइंड बिहेवियर के बारे में बताएं जिन्हें आपको ढूंढना है. उदाहरण के लिए:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CFLAGS := -std=c11 -Wall -Werror -O0

LOCAL_SRC_FILES:= sanitizer-status.c

LOCAL_MODULE:= sanitizer-status

LOCAL_SANITIZE := alignment bounds null unreachable integer
LOCAL_SANITIZE_DIAG := alignment bounds null unreachable integer

include $(BUILD_EXECUTABLE)

साथ ही, इसके बराबर का ब्लूप्रिंट (Android.bp) कॉन्फ़िगरेशन:

cc_binary {

    cflags: [
        "-std=c11",
        "-Wall",
        "-Werror",
        "-O0",
    ],

    srcs: ["sanitizer-status.c"],

    name: "sanitizer-status",

    sanitize: {
        misc_undefined: [
            "alignment",
            "bounds",
            "null",
            "unreachable",
            "integer",
        ],
        diag: {
            misc_undefined: [
                "alignment",
                "bounds",
                "null",
                "unreachable",
                "integer",
            ],
        },
    },

}

UBSan शॉर्टकट

Android में एक साथ कई सैनिटाइज़र चालू करने के लिए, दो शॉर्टकट भी उपलब्ध हैं: integer और default-ub. पूर्णांक integer-divide-by-zero, signed-integer-overflow, और unsigned-integer-overflow को चालू करता है. default-ub उन जांचों को चालू करता है जिनसे कंपाइलर की परफ़ॉर्मेंस से जुड़ी समस्याएं कम होती हैं: bool, integer-divide-by-zero, return, returns-nonnull-attribute, shift-exponent, unreachable and vla-bound. पूर्णांक सैनिटाइज़र क्लास का इस्तेमाल SANITIZE_TARGET और LOCAL_SANITIZE के साथ किया जा सकता है. वहीं, default-ub का इस्तेमाल सिर्फ़ SANITIZE_TARGET के साथ किया जा सकता है.

गड़बड़ी की बेहतर रिपोर्टिंग

Android में UBSan को डिफ़ॉल्ट तौर पर लागू करने पर, अनडिफ़ाइंड बिहेवियर का पता चलने पर, तय किए गए फ़ंक्शन को शुरू किया जाता है. डिफ़ॉल्ट रूप से, यह फ़ंक्शन बंद होता है. हालांकि, Android पर UBSan के लिए अक्टूबर 2016 से, एक वैकल्पिक रनटाइम लाइब्रेरी उपलब्ध है. इससे गड़बड़ी की ज़्यादा जानकारी मिलती है. इसमें, अनडिफ़ाइंड बिहेवियर का टाइप, फ़ाइल, और सोर्स कोड लाइन की जानकारी शामिल होती है. पूर्णांक की जांच के साथ गड़बड़ी की जानकारी देने की सुविधा चालू करने के लिए, Android.mk फ़ाइल में यह जोड़ें:

LOCAL_SANITIZE:=integer
LOCAL_SANITIZE_DIAG:=integer

LOCAL_SANITIZE वैल्यू, बिल्ड के दौरान सैनिटाइज़र को चालू करती है. LOCAL_SANITIZE_DIAG, सैनिटाइज़र के लिए गड़बड़ी की जानकारी लॉग करने की सुविधा चालू करता है. LOCAL_SANITIZE और LOCAL_SANITIZE_DIAG को अलग-अलग वैल्यू पर सेट किया जा सकता है. हालांकि, LOCAL_SANITIZE में मौजूद सिर्फ़ वे जांचें चालू होती हैं. अगर LOCAL_SANITIZE में किसी जांच के बारे में नहीं बताया गया है, लेकिन LOCAL_SANITIZE_DIAG में बताया गया है, तो जांच चालू नहीं की जाती है और डाइग्नोस्टिक मैसेज नहीं दिए जाते हैं.

यहां UBSan रनटाइम लाइब्रेरी से मिली जानकारी का उदाहरण दिया गया है:

pixel-xl:/ # sanitizer-status ubsan
sanitizer-status/sanitizer-status.c:53:6: runtime error: unsigned integer overflow: 18446744073709551615 + 1 cannot be represented in type 'size_t' (aka 'unsigned long')

पूर्णांक ओवरफ़्लो सैनिटाइज़ेशन

अनचाहे पूर्णांक ओवरफ़्लो की वजह से, मेमोरी से जुड़े ऐक्सेस या मेमोरी के बंटवारे से जुड़े वैरिएबल में मेमोरी करप्शन या जानकारी ज़ाहिर होने की कमज़ोरियां हो सकती हैं. इस समस्या से निपटने के लिए, हमने Android 7.0 में मीडिया फ़्रेमवर्क को सुरक्षित बनाने के लिए, Clang के UndefinedBehaviorSanitizer (UBSan) के साइंड और अनसाइंड इंटिजर ओवरफ़्लो सैनिटाइज़र जोड़े. Android 9 में, हमने UBSan को ज़्यादा कॉम्पोनेंट के लिए उपलब्ध कराया और इसके लिए, बिल्ड सिस्टम के सपोर्ट को बेहतर बनाया.

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

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

इंटिजर ओवरफ़्लो सैनिटाइज़ेशन (IntSan) की सुविधा कंपाइलर देता है. यह कंपाइल टाइम के दौरान बाइनरी में इंस्ट्रूमेंटेशन जोड़ता है, ताकि अंकगणितीय ओवरफ़्लो का पता लगाया जा सके. यह सुविधा, पूरे प्लैटफ़ॉर्म पर अलग-अलग कॉम्पोनेंट में डिफ़ॉल्ट रूप से चालू होती है. उदाहरण के लिए, /platform/external/libnl/Android.bp.

लागू करना

IntSan, UBSan के साइंड और अनसाइंड इंटिजर ओवरफ़्लो सैनिटाइज़र का इस्तेमाल करता है. यह कम करने की सुविधा, हर मॉड्यूल के लेवल पर चालू होती है. यह Android के ज़रूरी कॉम्पोनेंट को सुरक्षित रखने में मदद करता है. इसे बंद नहीं किया जाना चाहिए.

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

मेकफ़ाइलों में IntSan के लिए सहायता

makefile में IntSan को चालू करने के लिए, यह जोड़ें:

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

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

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

ब्लूप्रिंट फ़ाइलों में IntSan के साथ काम करने की सुविधा

ब्लूप्रिंट फ़ाइल में पूर्णांक ओवरफ़्लो सैनिटाइज़ेशन की सुविधा चालू करने के लिए, जैसे कि /platform/external/libnl/Android.bp, यह जोड़ें:

   sanitize: {
          integer_overflow: true,
          diag: {
              integer_overflow: true,
          },
          BLOCKLIST: "modulename_BLOCKLIST.txt",
       },

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

प्रॉपर्टी के diag सेट की मदद से, सैनिटाइज़र के लिए गड़बड़ी का पता लगाने वाला मोड चालू किया जा सकता है. सिर्फ़ टेस्टिंग के दौरान डाइग्नोस्टिक्स मोड का इस्तेमाल करें. डाइग्नोस्टिक्स मोड में, ओवरफ़्लो होने पर प्रोसेस बंद नहीं होती. इससे, उपयोगकर्ता के बिल्ड में सुरक्षा से जुड़ी कमियों को ठीक करने के फ़ायदे खत्म हो जाते हैं. ज़्यादा जानकारी के लिए, समस्या हल करना लेख पढ़ें.

BLOCKLIST प्रॉपर्टी की मदद से, BLOCKLIST फ़ाइल के बारे में जानकारी दी जा सकती है. इससे डेवलपर, फ़ंक्शन और सोर्स फ़ाइलों को सैनिटाइज़ होने से रोक सकते हैं. ज़्यादा जानकारी के लिए, समस्या हल करना लेख पढ़ें.

सैनिटाइज़र को अलग-अलग चालू करने के लिए, इसका इस्तेमाल करें:

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

समस्या का हल

अगर नए कॉम्पोनेंट में पूर्णांक ओवरफ़्लो सैनिटाइज़ेशन की सुविधा चालू की जा रही है या पूर्णांक ओवरफ़्लो सैनिटाइज़ेशन की सुविधा वाली प्लैटफ़ॉर्म लाइब्रेरी का इस्तेमाल किया जा रहा है, तो आपको पूर्णांक ओवरफ़्लो से जुड़ी कुछ समस्याएं आ सकती हैं. इनकी वजह से, प्रोग्राम बंद हो सकते हैं. आपको उन कॉम्पोनेंट की जांच करनी चाहिए जिनमें सैनिटाइज़ेशन की सुविधा चालू है, ताकि यह पक्का किया जा सके कि नुकसान न पहुंचाने वाले ओवरफ़्लो दिख सकें.

उपयोगकर्ता की बिल्ड में सैनिटाइज़ेशन की वजह से हुई गड़बड़ियों को ढूंढने के लिए, यह खोजें SIGABRT क्रैश होने की ऐसी घटनाएं जिनमें अबॉर्ट मैसेज से पता चलता है कि UBSan ने ओवरफ़्लो पकड़ा है. जैसे:

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')

समस्या वाली अंकगणितीय कार्रवाई का पता लगाने के बाद, पक्का करें कि ओवरफ़्लो सामान्य हो और जान-बूझकर किया गया हो. उदाहरण के लिए, इससे सुरक्षा पर कोई असर नहीं पड़ना चाहिए. सैनिटाइज़र के बंद होने की समस्या को इन तरीकों से ठीक किया जा सकता है:

  • ओवरफ़्लो से बचने के लिए कोड को फिर से व्यवस्थित करना (उदाहरण)
  • Clang के __builtin_*_overflow फ़ंक्शन (उदाहरण) के ज़रिए, ओवरफ़्लो की जानकारी साफ़ तौर पर दी गई है
  • no_sanitize एट्रिब्यूट की वैल्यू सेट करके, फ़ंक्शन में सैनिटाइज़ेशन की सुविधा बंद करना (उदाहरण)
  • BLOCKLIST फ़ाइल के ज़रिए, किसी फ़ंक्शन या सोर्स फ़ाइल को सैनिटाइज़ करने की सुविधा बंद करना (उदाहरण)

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

सामान्य पैटर्न की वजह से, बिनाइन ओवरफ़्लो हो सकते हैं. इनमें ये शामिल हैं:

  • इंप्लिसिट कास्ट, जहां साइंड टाइप (उदाहरण) में कास्ट किए जाने से पहले, अनसाइंड ओवरफ़्लो होता है
  • लिंक की गई सूची से आइटम मिटाने पर, लूप इंडेक्स कम हो जाता है (उदाहरण)
  • असली ज़्यादा से ज़्यादा वैल्यू (उदाहरण) तय करने के बजाय, -1 को बिना हस्ताक्षर वाला टाइप असाइन करना
  • ऐसे लूप जिनमें शर्त के तौर पर इस्तेमाल किए गए बिना हस्ताक्षर वाले पूर्णांक को कम किया जाता है (उदाहरण, उदाहरण)

हमारा सुझाव है कि डेवलपर, सैनिटाइज़र को बंद करने से पहले यह पक्का कर लें कि सैनिटाइज़र ने जिन मामलों में ओवरफ़्लो का पता लगाया है वे वाकई में सामान्य हैं और उनसे कोई अनचाहा साइड इफ़ेक्ट या सुरक्षा से जुड़ी समस्या नहीं होती.

IntSan को बंद करना

BLOCKLIST या फ़ंक्शन एट्रिब्यूट का इस्तेमाल करके, IntSan को बंद किया जा सकता है. इस नियम को कभी-कभी ही बंद करें. ऐसा सिर्फ़ तब करें, जब कोड को फिर से व्यवस्थित करना सही न हो या परफ़ॉर्मेंस से जुड़ी कोई समस्या हो.

फ़ंक्शन एट्रिब्यूट और ब्लॉकलिस्ट फ़ाइल फ़ॉर्मैटिंग की मदद से IntSan को बंद करने के बारे में ज़्यादा जानने के लिए, अपस्ट्रीम Clang का दस्तावेज़ देखें. ब्लॉकलिस्टिंग को किसी खास सैनिटाइज़र के लिए स्कोप किया जाना चाहिए. इसके लिए, सेक्शन के नामों का इस्तेमाल करके, टारगेट किए गए सैनिटाइज़र के बारे में जानकारी दें, ताकि दूसरे सैनिटाइज़र पर असर न पड़े.

Validation

फ़िलहाल, पूर्णांक ओवरफ़्लो सैनिटाइज़ेशन के लिए, कोई सीटीएस टेस्ट उपलब्ध नहीं है. इसके बजाय, पक्का करें कि IntSan चालू होने या न होने पर, सीटीएस टेस्ट पास हो जाएं. इससे यह पुष्टि की जा सकेगी कि इसका डिवाइस पर कोई असर नहीं पड़ रहा है.

बाउंड सैनिटाइज़ेशन

BoundsSanitizer (BoundSan), बाइनरी में इंस्ट्रुमेंटेशन जोड़ता है, ताकि ऐरे ऐक्सेस के आस-पास सीमा की जांच की जा सके. ये जांचें तब जोड़ी जाती हैं, जब कंपाइलर यह साबित नहीं कर पाता कि ऐक्सेस सुरक्षित होगा. साथ ही, अगर कंपाइल टाइम पर ऐरे का साइज़ पता नहीं चलता है, तो ये जांचें जोड़ी जाती हैं, ताकि रनटाइम पर इसकी जांच की जा सके. Android 10, ब्लूटूथ और कोडेक में BoundSan को डिप्लॉय करता है. BoundSan, कंपाइलर उपलब्ध कराता है. यह पूरे प्लैटफ़ॉर्म पर अलग-अलग कॉम्पोनेंट में डिफ़ॉल्ट रूप से चालू होता है.

लागू करना

BoundSan, UBSan के बाउंड सैनिटाइज़र का इस्तेमाल करता है. यह सुविधा, हर मॉड्यूल के लेवल पर चालू होती है. इससे Android के ज़रूरी कॉम्पोनेंट को सुरक्षित रखने में मदद मिलती है. इसलिए, इसे बंद नहीं किया जाना चाहिए.

हमारा सुझाव है कि आप अन्य कॉम्पोनेंट के लिए भी BoundSan को चालू करें. इसके लिए, ऐसे नेटिव कोड सबसे सही होते हैं जिन्हें खास अधिकार मिले हों या जो जटिल हों. साथ ही, जो ऐसे उपयोगकर्ता के इनपुट को पार्स करते हों जिन पर भरोसा नहीं किया जा सकता. BoundSan को चालू करने से परफ़ॉर्मेंस पर पड़ने वाला असर, ऐरे के उन ऐक्सेस की संख्या पर निर्भर करता है जिन्हें सुरक्षित साबित नहीं किया जा सकता. औसतन, कुछ हद तक ओवरहेड प्रतिशत की उम्मीद करें और जांच करें कि परफ़ॉर्मेंस पर कोई असर तो नहीं पड़ रहा है.

ब्लूप्रिंट फ़ाइलों में BoundSan चालू करें

बाइनरी और लाइब्रेरी मॉड्यूल के लिए, misc_undefined sanitize प्रॉपर्टी में "bounds" जोड़कर, ब्लूप्रिंट फ़ाइलों में BoundSan को चालू किया जा सकता है:

    sanitize: {
       misc_undefined: ["bounds"],
       diag: {
          misc_undefined: ["bounds"],
       },
       BLOCKLIST: "modulename_BLOCKLIST.txt",
diag

diag प्रॉपर्टी, सैनिटाइज़र के लिए डाइग्नोस्टिक्स मोड चालू करती है. सिर्फ़ टेस्टिंग के दौरान डाइग्नोस्टिक्स मोड का इस्तेमाल करें. डाइग्नोस्टिक्स मोड में, ओवरफ़्लो होने पर प्रोसेस बंद नहीं होती. इससे, सुरक्षा से जुड़ी समस्या को कम करने के फ़ायदे नहीं मिलते. साथ ही, परफ़ॉर्मेंस पर ज़्यादा असर पड़ता है. इसलिए, इसे प्रोडक्शन बिल्ड के लिए इस्तेमाल करने का सुझाव नहीं दिया जाता.

ब्लॉकलिस्ट

BLOCKLIST प्रॉपर्टी की मदद से, BLOCKLIST फ़ाइल के बारे में जानकारी दी जा सकती है. डेवलपर इस फ़ाइल का इस्तेमाल करके, फ़ंक्शन और सोर्स फ़ाइलों को सैनिटाइज़ होने से रोक सकते हैं. इस प्रॉपर्टी का इस्तेमाल सिर्फ़ तब करें, जब परफ़ॉर्मेंस एक समस्या हो और टारगेट किए गए फ़ाइलें/फ़ंक्शन काफ़ी योगदान देते हों. इन फ़ाइलों/फ़ंक्शन की मैन्युअल तरीके से जांच करें, ताकि यह पक्का किया जा सके कि ऐरे ऐक्सेस सुरक्षित हैं. ज़्यादा जानकारी के लिए, समस्या हल करना लेख पढ़ें.

मेकफ़ाइलों में BoundSan चालू करना

makefiles में BoundSan को चालू किया जा सकता है. इसके लिए, बाइनरी और लाइब्रेरी मॉड्यूल के LOCAL_SANITIZE वैरिएबल में "bounds" जोड़ें:

    LOCAL_SANITIZE := bounds
    # Optional features
    LOCAL_SANITIZE_DIAG := bounds
    LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt

LOCAL_SANITIZE में, कॉमा लगाकर अलग किए गए सैनिटाइज़र की सूची स्वीकार की जाती है.

LOCAL_SANITIZE_DIAG से, गड़बड़ी की जानकारी देने वाला मोड चालू हो जाता है. गड़बड़ी की जानकारी देने वाले मोड का इस्तेमाल सिर्फ़ टेस्टिंग के दौरान करें. डाइग्नोस्टिक्स मोड में ओवरफ़्लो होने पर, प्रोसेस बंद नहीं होती. इससे, सुरक्षा से जुड़ी समस्या को कम करने के फ़ायदे नहीं मिलते. साथ ही, परफ़ॉर्मेंस पर ज़्यादा असर पड़ता है. इसलिए, इसे प्रोडक्शन बिल्ड के लिए इस्तेमाल करने का सुझाव नहीं दिया जाता.

LOCAL_SANITIZE_BLOCKLIST, BLOCKLIST फ़ाइल के बारे में जानकारी देने की अनुमति देता है. इससे डेवलपर, फ़ंक्शन और सोर्स फ़ाइलों को सैनिटाइज़ होने से रोक सकते हैं. इस प्रॉपर्टी का इस्तेमाल सिर्फ़ तब करें, जब परफ़ॉर्मेंस एक समस्या हो और टारगेट किए गए फ़ाइलें/फ़ंक्शन काफ़ी योगदान देते हों. इन फ़ाइलों/फ़ंक्शन की मैन्युअल तरीके से जांच करें, ताकि यह पक्का किया जा सके कि ऐरे ऐक्सेस सुरक्षित हैं. ज़्यादा जानकारी के लिए, समस्या हल करना लेख पढ़ें.

BoundSan बंद करना

फ़ंक्शन और सोर्स फ़ाइलों में, BLOCKLIST या फ़ंक्शन एट्रिब्यूट का इस्तेमाल करके BoundSan को बंद किया जा सकता है. BoundSan को चालू रखना सबसे अच्छा होता है. इसलिए, इसे सिर्फ़ तब बंद करें, जब फ़ंक्शन या फ़ाइल की वजह से परफ़ॉर्मेंस पर बहुत ज़्यादा असर पड़ रहा हो और सोर्स की मैन्युअल तरीके से समीक्षा की गई हो.

फ़ंक्शन एट्रिब्यूट और ब्लॉकलिस्ट फ़ाइल फ़ॉर्मैटिंग की मदद से, BoundSan को बंद करने के बारे में ज़्यादा जानने के लिए, Clang LLVM दस्तावेज़ देखें. किसी खास सैनिटाइज़र के लिए, BLOCKLISTing को स्कोप करें. इसके लिए, सेक्शन के ऐसे नाम इस्तेमाल करें जिनमें टारगेट सैनिटाइज़र के बारे में बताया गया हो. इससे अन्य सैनिटाइज़र पर असर नहीं पड़ेगा.

Validation

BoundSan के लिए, खास तौर पर कोई सीटीएस टेस्ट नहीं है. इसके बजाय, यह पक्का करें कि BoundSan चालू होने या न होने पर, सीटीएस टेस्ट पास हो रहे हों. इससे यह पुष्टि की जा सकेगी कि इससे डिवाइस पर कोई असर नहीं पड़ रहा है.

समस्या का हल

BoundSan को चालू करने के बाद, कॉम्पोनेंट की अच्छी तरह से जांच करें. इससे यह पक्का किया जा सकेगा कि पहले से मौजूद, सीमा से बाहर के ऐक्सेस की समस्याओं को ठीक कर दिया गया है.

BoundSan से जुड़ी गड़बड़ियों का आसानी से पता लगाया जा सकता है, क्योंकि इनमें ये शामिल होते हैं टॉम्बस्टोन अबॉर्ट मैसेज:

    pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
    signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    Abort message: 'ubsan: out-of-bounds'

डाइग्नोस्टिक्स मोड में चलाने पर, सोर्स फ़ाइल, लाइन नंबर, और इंडेक्स वैल्यू को logcat में प्रिंट किया जाता है. डिफ़ॉल्ट रूप से, इस मोड में 'बंद करें' मैसेज नहीं दिखता है. logcat की समीक्षा करके देखें कि कोई गड़बड़ी तो नहीं है.

    external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'