OWASP कैटगरी: MASVS-CODE: कोड क्वालिटी
खास जानकारी
Android ऐप्लिकेशन, कुछ खास सुविधाओं के लिए C और C++ जैसी भाषाओं में लिखे गए नेटिव कोड का फ़ायदा ले सकते हैं. हालांकि, जब कोई ऐप्लिकेशन इस नेटिव कोड के साथ इंटरैक्ट करने के लिए, Java नेटिव इंटरफ़ेस (JNI) का इस्तेमाल करता है, तो वह बफ़र ओवरफ़्लो जैसी कमजोरियों और नेटिव कोड लागू करने से जुड़ी अन्य समस्याओं के संपर्क में आ सकता है.
असर
परफ़ॉर्मेंस को ऑप्टिमाइज़ करने और कोड को छिपाने जैसे बहुत अच्छे असर के बावजूद, Android ऐप्लिकेशन में नेटिव कोड का इस्तेमाल करने से सुरक्षा पर बुरा असर पड़ सकता है. C/C++ जैसी नेटिव कोड लैंग्वेज में, Java/Kotlin की मेमोरी सुरक्षा सुविधाएं मौजूद नहीं हैं. इस वजह से, बफ़र ओवरफ़्लो, इस्तेमाल के बाद होने वाली गड़बड़ियों, और मेमोरी में गड़बड़ी से जुड़ी अन्य समस्याओं का सामना करना पड़ सकता है. इन समस्याओं की वजह से, ये क्रैश या आर्बिट्रेरी कोड एक्ज़ीक्यूट करते हैं. इसके अलावा, अगर नेटिव कोड कॉम्पोनेंट में जोखिम की आशंका मौजूद है, तो इससे पूरे ऐप्लिकेशन के साथ छेड़छाड़ हो सकती है. भले ही, बाकी का हिस्सा Java में सुरक्षित तरीके से क्यों न लिखा गया हो.
जोखिम कम करने के तरीके
डेवलपमेंट और कोडिंग के बारे में दिशा-निर्देश
- सुरक्षित कोडिंग के दिशा-निर्देश: C/C++ प्रोजेक्ट के लिए, लागू किए गए सुरक्षित कोडिंग मानकों का पालन करें (उदाहरण के लिए, CERT, OWASP) का इस्तेमाल करें. इससे बफ़र ओवरफ़्लो, पूर्णांक ओवरफ़्लो, और फ़ॉर्मैट स्ट्रिंग अटैक जैसी जोखिम की आशंकाओं को कम करने में मदद मिलती है. Abseil जैसी लाइब्रेरी को प्राथमिकता दें, जो क्वालिटी और सुरक्षा के लिए जानी जाती हैं. जब भी मुमकिन हो, Rust जैसी मेमोरी-सेफ़ भाषाओं का इस्तेमाल करें. ये भाषाएं C/C++ जैसी परफ़ॉर्मेंस देती हैं.
- इनपुट की पुष्टि करना: बाहरी सोर्स से मिले सभी इनपुट डेटा की पुष्टि करना. इसमें उपयोगकर्ता का इनपुट, नेटवर्क डेटा, और फ़ाइलें शामिल हैं. इससे इंजेक्शन अटैक और अन्य जोखिमों से बचा जा सकता है.
कंपाइल करने के विकल्पों को बेहतर बनाना
ईएलएफ़ फ़ॉर्मैट का इस्तेमाल करने वाली नेटिव लाइब्रेरी को जोखिम की कई आशंकाओं से मज़बूत बनाया जा सकता है. इसके लिए, स्टैक प्रोटेक्शन (कैनरी), रीलोकेशन रीड-ओनली (आरईएलआरओ), डेटा एक्ज़ीक्यूशन प्रिवेंशन (एनएक्स), और पोज़ीशन-इंडिपेंडेंट एक्ज़ीक्यूटेबल (पीआईई) जैसे सुरक्षा के तरीके चालू किए जा सकते हैं. आसानी से, Android एनडीके (NDK) के कंपाइलेशन विकल्प में ये सभी सुरक्षा सुविधाएं डिफ़ॉल्ट रूप से चालू होती हैं.
किसी बाइनरी में सुरक्षा के इन तरीकों के लागू होने की पुष्टि करने के लिए, hardening-check
या pwntools
जैसे टूल का इस्तेमाल किया जा सकता है.
बैश
$ pwn checksec --file path/to/libnativecode.so
Arch: aarch64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
पुष्टि करना कि तीसरे पक्ष की लाइब्रेरी में कोई जोखिम न हो
तीसरे पक्ष की लाइब्रेरी चुनते समय, उन लाइब्रेरी का इस्तेमाल करें जिनकी डेवलपर कम्यूनिटी में अच्छी ख्याति हो. Google Play SDK इंडेक्स जैसे संसाधन, जानी-मानी और भरोसेमंद लाइब्रेरी की पहचान करने में आपकी मदद कर सकते हैं. पक्का करें कि आपने लाइब्रेरी को नए वर्शन में अपडेट किया हो. साथ ही, Exploit-DB के डेटाबेस जैसे संसाधनों का इस्तेमाल करके, उनसे जुड़ी किसी भी कमज़ोरी को पहले से खोजें. [library_name] vulnerability
या [library_name] CVE
जैसे कीवर्ड का इस्तेमाल करके वेब पर खोज करने पर, सुरक्षा से जुड़ी अहम जानकारी दिख सकती है.
संसाधन
- CWE-111: असुरक्षित JNI का सीधे तौर पर इस्तेमाल करना
- एक्सप्लॉइट डेटाबेस
- सुरक्षा को बेहतर बनाने वाली सुविधाओं के लिए बाइनरी की जांच करना
- pwntools की मदद से बाइनरी की सुरक्षा सेटिंग देखना
- Linux बाइनरी की सुरक्षा को बेहतर बनाना
- रीलोकेशन रीड-ओनली (RELRO) का इस्तेमाल करके, ELF बाइनरी को सुरक्षित बनाना
- OWASP बाइनरी प्रोटेक्शन मैकेनिज़्म
- एसईआई सीईआरटी के कोडिंग स्टैंडर्ड
- OWASP डेवलपर गाइड
- Google Play SDK Index
- Android एनडीके
- Android Rust के बारे में जानकारी
- Abseil (C++ Common Libraries)
- पीआईई को लिंकर लागू करता है