استفاده از کد بومی

دسته OWASP: MASVS-CODE: کیفیت کد

نمای کلی

برنامه‌های Android می‌توانند از کد بومی نوشته‌شده به زبان‌هایی مانند C و C++ برای عملکردهای خاص استفاده کنند. بااین‌حال، وقتی برنامه‌ای از «میانای بومی جاوا» (JNI) برای تعامل با این کد بومی استفاده می‌کند، به‌طور بالقوه خود را درمعرض آسیب‌پذیری‌هایی مانند سرریز میان‌گیر و مشکلات دیگری قرار می‌دهد که ممکن است در پیاده‌سازی کد بومی وجود داشته باشد.

تأثیر

باوجود تأثیرات بسیار مثبت مانند بهینه‌سازی عملکرد و مبهم‌سازی، استفاده از کد بومی در برنامه‌های Android می‌تواند تأثیرات امنیتی منفی داشته باشد. زبان‌های کد بومی مانند C/C++‎ فاقد ویژگی‌های ایمنی حافظه Java/Kotlin هستند، که آن‌ها را دربرابر آسیب‌پذیری‌هایی مانند سرریز میان‌گیر، خطاهای use-after-free، و سایر مشکلات خرابی حافظه آسیب‌پذیر می‌کند – که منجر به ازکارافتادن یا اجرای کد دلخواه می‌شود. علاوه‌براین، اگر آسیب‌پذیری‌ای در مؤلفه کد بومی وجود داشته باشد، می‌تواند به‌طور بالقوه کل برنامه را به‌خطر بیندازد، حتی اگر بقیه برنامه به‌طور ایمن در 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

درستی‌سنجی کتابخانه‌های طرف سوم آسیب‌پذیر نیستند

هنگام انتخاب کتابخانه‌های شخص ثالث، اولویت را به استفاده از کتابخانه‌هایی بدهید که در انجمن توسعه‌دهندگان شهرت خوبی دارند. منابعی مثل نمایه کیت توسعه نرم‌افزار Google Play می‌تواند به شما کمک کند کتابخانه‌های معتبر و قابل‌اعتماد را شناسایی کنید. مطمئن شوید کتابخانه‌ها را به جدیدترین نسخه‌ها به‌روز نگه می‌دارید و بااستفاده از منابعی مثل پایگاه‌های داده Exploit-DB، به‌طور پیش‌گیرانه هرگونه آسیب‌پذیری شناخته‌شده مربوط به آن‌ها را جستجو کنید. جستجوی وب بااستفاده از کلیدواژه‌هایی مثل [library_name] vulnerability یا [library_name] CVE می‌تواند اطلاعات امنیتی مهمی را آشکار کند.

منابع