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

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

نمای کلی

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

تاثیر

علیرغم تأثیرات بسیار مثبتی مانند بهینه سازی عملکرد و مبهم سازی، استفاده از کد بومی در برنامه های اندروید می تواند تأثیرات امنیتی منفی داشته باشد. زبان‌های کد بومی مانند C/C++ فاقد ویژگی‌های ایمنی حافظه جاوا/کوتلین هستند، که آنها را مستعد آسیب‌پذیری‌هایی مانند سرریز شدن بافر، خطاهای استفاده پس از آزادسازی و سایر مشکلات خرابی حافظه می‌کند که منجر به خرابی یا اجرای کد دلخواه می‌شود. علاوه بر این، اگر آسیب‌پذیری در مؤلفه کد اصلی وجود داشته باشد، می‌تواند به طور بالقوه کل برنامه را به خطر بیندازد، حتی اگر بقیه به طور ایمن در جاوا نوشته شده باشند.

اقدامات کاهشی

راهنمای توسعه و کدنویسی

  • دستورالعمل‌های کدگذاری امن : برای پروژه‌های C/C++، استانداردهای کدگذاری ایمن (مانند CERT، OWASP) را رعایت کنید تا آسیب‌پذیری‌هایی مانند سرریز بافر، سرریز اعداد صحیح و حملات رشته‌ای قالب‌بندی را کاهش دهید. کتابخانه هایی مانند Abseil که به دلیل کیفیت و امنیت شناخته شده است را در اولویت قرار دهید. در صورت امکان، زبان‌های ایمن برای حافظه مانند Rust را در نظر بگیرید که عملکردی قابل مقایسه با C/C++ دارند.
  • اعتبارسنجی ورودی : برای جلوگیری از حملات تزریق و سایر آسیب‌پذیری‌ها، تمام داده‌های ورودی دریافتی از منابع خارجی، از جمله ورودی کاربر، داده‌های شبکه و فایل‌ها را به‌شدت تأیید کنید.

گزینه های کامپایل را سخت کنید

کتابخانه‌های بومی با استفاده از فرمت ELF می‌توانند با فعال کردن مکانیسم‌های حفاظتی مانند حفاظت پشته (Canary)، جابجایی فقط خواندنی (RELRO)، جلوگیری از اجرای داده‌ها (NX) و فایل‌های اجرایی مستقل از موقعیت (PIE) در برابر طیف وسیعی از آسیب‌پذیری‌ها سخت‌تر شوند. به‌راحتی، گزینه‌های کامپایل 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 می‌تواند اطلاعات امنیتی مهمی را نشان دهد.

منابع