فئة OWASP: MASVS-CODE: جودة الرمز
نظرة عامة
يمكن لتطبيقات Android الاستفادة من الرموز البرمجية الأصلية المكتوبة بلغات مثل C وC++ لتنفيذ وظائف معيّنة. ومع ذلك، عندما يستخدم تطبيق واجهة Java الأصلية (JNI) للتفاعل مع هذا الرمز البرمجي الأصلي، قد يعرّض نفسه للثغرات الأمنية، مثل تجاوز سعة المخزن المؤقت وغيرها من المشاكل التي قد تكون موجودة في تنفيذ الرمز البرمجي الأصلي.
التأثير
على الرغم من الآثار الإيجابية الكبيرة، مثل تحسين الأداء والتشويش، يمكن أن يؤدي استخدام الرمز البرمجي الأصلي في تطبيقات Android إلى آثار سلبية على الأمان. تفتقر لغات الرموز البرمجية الأصلية، مثل C/C++، إلى ميزات أمان الذاكرة المتوفّرة في Java/Kotlin، ما يجعلها عرضة للثغرات الأمنية، مثل تجاوز سعة المخزن المؤقت وأخطاء استخدام ذاكرة معيّنة بعد تفريغها وغيرها من المشاكل المتعلقة بتلف الذاكرة، ما يؤدي إلى حدوث أعطال أو تنفيذ رموز برمجية عشوائية. بالإضافة إلى ذلك، إذا كانت هناك ثغرة أمنية في مكوّن الرمز البرمجي الأصلي، يمكن أن تؤدي إلى تعريض التطبيق بأكمله للخطر، حتى إذا تمت كتابة بقية الرمز بشكل آمن في Java.
إجراءات التخفيف
إرشادات حول التطوير والترميز
- إرشادات الترميز الآمن: بالنسبة إلى مشاريع C/C++، يجب الالتزام بمعايير الترميز الآمن المعمول بها (مثل CERT وOWASP) للحدّ من الثغرات الأمنية، مثل تجاوز سعة المخزن المؤقت وتجاوز سعة الأعداد الصحيحة وهجمات سلاسل التنسيق. يجب إعطاء الأولوية للمكتبات، مثل Abseil، المعروفة بجودتها وأمانها. ننصحك باستخدام لغات آمنة للذاكرة، مثل Rust، عندما يكون ذلك ممكنًا، لأنّها توفّر أداءً مشابهًا للغة C/C++.
- التحقّق من صحة الإدخال: تحقَّق بدقة من صحة جميع بيانات الإدخال الواردة من مصادر خارجية، بما في ذلك بيانات أدخلها المستخدم وبيانات الشبكة والملفات، وذلك لمنع هجمات الحقن وغيرها من الثغرات الأمنية.
تصليد خيارات التجميع
يمكن تعزيز أمان المكتبات الأصلية التي تستخدم تنسيق ELF ضد مجموعة من الثغرات الأمنية من خلال تفعيل آليات الحماية، مثل حماية الذاكرة المكدّسة (Canary) وإعادة التوطين للقراءة فقط (RELRO) ومنع تنفيذ البيانات (NX) والملفات التنفيذية المستقلة عن الموضع (PIE). لحسن الحظ، تتيح خيارات تجميع Android NDK كل إجراءات الحماية هذه تلقائيًا.
للتحقّق من تنفيذ آليات الأمان هذه في ملف ثنائي، يمكنك استخدام أدوات مثل hardening-check أو pwntools.
Bash
$ pwn checksec --file path/to/libnativecode.so
Arch: aarch64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
التأكّد من أنّ مكتبات الجهات الخارجية ليست عرضة للثغرات الأمنية
عند اختيار مكتبات تابعة لجهات خارجية، عليك إعطاء الأولوية للمكتبات التي تتمتع بسمعة جيدة في أوساط المطوّرين. يمكن أن تساعدك مراجع مثل فهرس حِزم SDK على Google Play في تحديد المكتبات الموثوقة والمشهورة. احرص على تحديث المكتبات إلى أحدث الإصدارات والبحث بشكل استباقي عن أي ثغرات أمنية معروفة مرتبطة بها باستخدام مراجع مثل قواعد البيانات من Exploit-DB. يمكن أن يكشف البحث على الويب باستخدام كلمات رئيسية مثل
[library_name] vulnerability أو [library_name] CVE عن معلومات أمان مهمة.
الموارد
- CWE-111: الاستخدام المباشر لواجهة JNI غير الآمنة
- قاعدة بيانات الثغرات الأمنية
- التحقّق من الثنائيات بحثًا عن ميزات تعزيز الأمان
- التحقّق من إعدادات أمان الملفات الثنائية باستخدام pwntools
- تعزيز أمان برامج Linux الثنائية
- تعزيز أمان ملفات ELF الثنائية باستخدام ميزة "نقل البيانات للقراءة فقط" (RELRO)
- آليات حماية البرامج الثنائية في OWASP
- معايير الترميز الصادرة عن فريق الاستجابة للطوارئ الحاسوبية (CERT) التابع لمعهد هندسة البرمجيات (SEI)
- دليل المطوّرين من OWASP
- أداة Google Play SDK Index
- Android NDK
- مقدمة عن Rust على Android
- Abseil (مكتبات C++ الشائعة)
- يفرض الرابط استخدام PIE