فئة OWASP: MASVS-CODE: جودة الرموز البرمجية
نظرة عامة
يمكن لتطبيقات Android الاستفادة من التعليمات البرمجية الأصلية المكتوبة بلغات مثل C وC++ لأداء وظائف معينة. ومع ذلك، عندما يستخدم أحد التطبيقات واجهة Java Native Interface (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
- معايير الترميز في معهد SEI CERT
- دليل المطوّر في OWASP
- أداة Google Play SDK Index
- مجموعة تطوير البرامج (NDK) لنظام التشغيل Android
- مقدمة عن Rust لنظام التشغيل Android
- Abseil (مكتبات C++ الشائعة)
- فرض أداة الربط لميزة PIE