AARC64 बाइनरी के लिए सिर्फ़-एक्सपेरिमेंट मेमोरी (XOM)

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

AARC64 सिस्टम बाइनरी के लिए एक्ज़ीक्यूट किए जा सकने वाले कोड सेक्शन, डिफ़ॉल्ट रूप से मार्क होते हैं जस्ट-इन-टाइम कोड के लिए, मज़बूत नियम के तहत कॉन्टेंट का दोबारा इस्तेमाल न करें. ऐसा कोड जो डेटा और कोड को एक साथ मिलाता है और सोच-समझकर कोड बनाता है इन सेक्शन की जांच करता है (पहले मेमोरी सेगमेंट को आसानी से पढ़ा जा सकने के तौर पर फिर से मैप किए बिना) काम नहीं करता. 10 टारगेट SDK टूल वाले ऐप्लिकेशन अगर ऐप्लिकेशन, एपीआई लेवल 29 या उसके बाद के लेवल वाले ऐप्लिकेशन के कोड सेक्शन को पढ़ने की कोशिश करता है, तो उन पर असर पड़ता है सिर्फ़ मेमोरी (XOM) से जुड़ी सिस्टम लाइब्रेरी को मेमोरी में एक्ज़ीक्यूट करने की सुविधा सेक्शन को 'पढ़ने लायक' के तौर पर मार्क करें.

इस कमी से पूरा फ़ायदा पाने के लिए, हार्डवेयर और कर्नेल सपोर्ट, दोनों को आवश्यक. यह मदद न मिलने पर, हो सकता है कि खतरों को कम करने की प्रोसेस पूरी तरह से लागू न हो. कॉन्टेंट बनाने Android 4.9 सामान्य कर्नेल में, फ़ुल स्क्रीन मोड के लिए सही पैच शामिल हैं ARMv8.2 डिवाइसों पर यह सुविधा काम करती है.

लागू करना

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

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

डिवाइस सहायता और असर

पहले के हार्डवेयर या पहले के कर्नेल (4.9 से कम) वाले डिवाइस जिनमें ज़रूरी पैच इस सुविधा का पूरी तरह से समर्थन नहीं करते या इससे लाभ नहीं मिलता. डिवाइसों की सूची हो सकता है कि कर्नेल सहायता के बिना, सिर्फ़ एक्ज़ीक्यूशन-ओनली मेमोरी का उपयोगकर्ता ऐक्सेस लागू न कर पाए, हालांकि, कर्नेल कोड यह जांच करता है कि कोई पेज पढ़ने लायक है या नहीं यह प्रॉपर्टी लागू करें, जैसे process_vm_readv().

कर्नेल फ़्लैग CONFIG_ARM64_UAO को कर्नेल में पक्का करें कि कर्नेल, सिर्फ़ लागू किए गए के तौर पर मार्क किए गए यूज़रलैंड पेजों के मुताबिक काम करता है. पिछला ARMv8 या ऐसे ARMv8.2 डिवाइस जिनमें उपयोगकर्ता ऐक्सेस ओवरराइड (यूएओ) बंद है, तो हो सकता है कि इसका पूरा लाभ उठा सकता है और अभी भी syscalls.

मौजूदा कोड में बदलाव करें

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

स्थानीय तौर पर पूल किए गए पूल को अलग करने के लिए, हाथ से लिखे हुए असेंबली को फिर से बनाने की ज़रूरत पड़ सकती है स्थिरांक.

उदाहरण:

Clang कंपाइलर की ओर से जनरेट की गई बाइनरी में डेटा से जुड़ी कोई समस्या नहीं होनी चाहिए को कोड में जोड़ा जा सकता है. अगर GNU कंपाइलर कलेक्शन (जीसीसी) से जनरेट हुआ कोड शामिल है (स्टैटिक लाइब्रेरी से), आउटपुट बाइनरी की पक्का करें कि कॉन्सटेंट को कोड सेक्शन में पूल नहीं किया गया है.

अगर एक्ज़ीक्यूटेबल कोड सेक्शन के लिए, कोड की जांच करना ज़रूरी हो, कोड को 'पढ़ने लायक' के तौर पर मार्क करने के लिए, mprotect को कॉल करें. इसके बाद, ऑपरेशन के बाद पूरा हो गया है, इसे 'नहीं पढ़ा जा सकता' के तौर पर मार्क करने के लिए, mprotect पर फिर से कॉल करें.

XOM चालू करें

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

XOM को बंद करें

किसी मॉड्यूल लेवल पर, पूरे सबडायरेक्ट्री ट्री से सिर्फ़ एक्ज़ीक्यूट करने की सुविधा बंद की जा सकती है या का एक हिस्सा है.

XOM को ऐसे अलग-अलग मॉड्यूल के लिए बंद किया जा सकता है जिन्हें रीफ़ैक्टर नहीं किया जा सकता या जिन्हें पढ़ने की ज़रूरत होती है LOCAL_XOM सेट करके एक्ज़ीक्यूटेबल कोड और false के लिए xom वैरिएबल.

// Android.mk
LOCAL_XOM := false

// Android.bp
cc_binary { // or other module types
   ...
   xom: false,
}

अगर किसी स्टैटिक लाइब्रेरी में सिर्फ़ एक्ज़ीक्यूट करने के लिए मेमोरी बंद है, तो बिल्ड सिस्टम लागू होता है की अनुमति है. इन्हें बदला जा सकता है xom: true, का इस्तेमाल करके ऐसा किया है.

किसी सबडायरेक्ट्री में, सिर्फ़ एक्ज़ीक्यूट करने के लिए मेमोरी बंद करने के लिए (उदाहरण के लिए, foo/bar/) को ऐक्सेस करने के लिए, XOM_EXCLUDE_PATHS को वैल्यू पास करें.

make -j XOM_EXCLUDE_PATHS=foo/bar

इसके अलावा, आपके पास PRODUCT_XOM_EXCLUDE_PATHS को सेट करने का भी विकल्प है आपके प्रॉडक्ट कॉन्फ़िगरेशन में वैरिएबल.

पास करके, दुनिया भर में सिर्फ़ एक्ज़ीक्यूट करने वाली बाइनरी को बंद किया जा सकता है ENABLE_XOM=false को आपके make निर्देश में बदला गया.

make -j ENABLE_XOM=false

पुष्टि करें

सिर्फ़ एक्ज़ीक्यूशन के लिए कोई सीटीएस या पुष्टि टेस्ट उपलब्ध नहीं है मेमोरी. readelf का इस्तेमाल करके, मैन्युअल तरीके से बाइनरी की पुष्टि की जा सकती है फ़्लैग करती है.