OWASP कैटगरी: MASVS-CODE: कोड की क्वालिटी
खास जानकारी
Android ऐप्लिकेशन, खास कामों के लिए C और C++ जैसी लैंग्वेज में लिखे गए नेटिव कोड का फ़ायदा उठा सकते हैं. हालांकि, जब कोई ऐप्लिकेशन, Java Native Interface (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
Index जैसे संसाधन, भरोसेमंद और अच्छी लाइब्रेरी की पहचान करने में आपकी मदद कर सकते हैं. पक्का करें
कि लाइब्रेरी, सबसे नए वर्शन पर अपडेट हों. साथ ही,
Exploit-DB के डेटाबेस जैसे संसाधनों का इस्तेमाल करके, उनसे जुड़ी किसी भी ज्ञात कमज़ोरी को खोजें.
[library_name] vulnerability या [library_name] CVE जैसे कीवर्ड का इस्तेमाल करके, वेब पर खोज करने से सुरक्षा से जुड़ी अहम जानकारी मिल सकती है.
संसाधन
- CWE-111: Direct Use of Unsafe JNI
- Exploit database
- Check binaries for security hardening features
- Check binary security settings with pwntools
- Linux binary security hardening
- Hardening ELF binaries using Relocation Read-Only (RELRO)
- OWASP binary protection mechanisms
- SEI CERT Coding Standards
- OWASP Developer Guide
- Google Play SDK Index
- Android NDK
- Android Rust introduction
- Abseil (C++ Common Libraries)
- PIE is enforced by the linker