دسته 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
میتواند اطلاعات امنیتی مهمی را نشان دهد.
منابع
- CWE-111: استفاده مستقیم از JNI ناامن
- بهره برداری از پایگاه داده
- باینری ها را برای ویژگی های سخت شدن امنیتی بررسی کنید
- تنظیمات امنیتی باینری را با pwntools بررسی کنید
- سخت شدن امنیت باینری لینوکس
- سخت کردن باینری های ELF با استفاده از جابجایی فقط خواندنی (RELRO)
- مکانیزم های حفاظت باینری OWASP
- استانداردهای کدگذاری SEI CERT
- راهنمای توسعه دهنده OWASP
- فهرست SDK Google Play
- اندروید NDK
- معرفی Android Rust
- Abseil (کتابخانههای مشترک C++)
- PIE توسط پیوند دهنده اعمال می شود