رده OWASP: MASVS-CODE: کیفیت کد
نمای کلی
برنامههای اندروید میتوانند از کد بومی نوشته شده به زبانهایی مانند C و C++ برای قابلیتهای خاص بهره ببرند. با این حال، هنگامی که یک برنامه از رابط بومی جاوا (JNI) برای تعامل با این کد بومی استفاده میکند، به طور بالقوه خود را در معرض آسیبپذیریهایی مانند سرریز بافر و سایر مشکلاتی که ممکن است در پیادهسازی کد بومی وجود داشته باشد، قرار میدهد.
تأثیر
با وجود تأثیرات بسیار مثبتی مانند بهینهسازی عملکرد و مبهمسازی، استفاده از کد بومی در برنامههای اندروید میتواند تأثیرات امنیتی منفی داشته باشد. زبانهای کد بومی مانند C/C++ فاقد ویژگیهای ایمنی حافظه جاوا/کاتلین هستند و همین امر آنها را مستعد آسیبپذیریهایی مانند سرریز بافر، خطاهای استفاده پس از آزادسازی و سایر مشکلات خرابی حافظه میکند که منجر به خرابی یا اجرای کد دلخواه میشود. علاوه بر این، اگر آسیبپذیری در مؤلفه کد بومی وجود داشته باشد، میتواند به طور بالقوه کل برنامه را به خطر بیندازد، حتی اگر بقیه آن به طور ایمن در جاوا نوشته شده باشد.
کاهشها
راهنمایی در توسعه و کدنویسی
- Secure Coding Guidelines : For C/C++ projects, adhere to established secure coding standards (eg, CERT, OWASP) to mitigate vulnerabilities like buffer overflows, integer overflows, and format string attacks. Prioritize libraries like Abseil known for quality and security. Whenever possible, consider adopting memory-safe languages like Rust, which offer performance comparable to C/C++.
- اعتبارسنجی ورودی : تمام دادههای ورودی دریافتی از منابع خارجی، از جمله ورودی کاربر، دادههای شبکه و فایلها را به دقت اعتبارسنجی کنید تا از حملات تزریق و سایر آسیبپذیریها جلوگیری شود.
گزینههای کامپایل را تقویت کنید
کتابخانههای بومی که از فرمت ELF استفاده میکنند را میتوان با فعال کردن مکانیسمهای محافظتی مانند محافظت پشته (Canary)، فقط خواندنی جابجایی (RELRO)، جلوگیری از اجرای دادهها (NX) و فایلهای اجرایی مستقل از موقعیت (PIE) در برابر طیف وسیعی از آسیبپذیریها مقاوم کرد. خوشبختانه، گزینههای کامپایل 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
تأیید کنید که کتابخانههای شخص ثالث آسیبپذیر نیستند
هنگام انتخاب کتابخانههای شخص ثالث، اولویت را به استفاده از کتابخانههایی با اعتبار بالا در جامعه توسعهدهندگان بدهید. منابعی مانند فهرست SDK گوگل پلی میتوانند به شما در شناسایی کتابخانههای معتبر و قابل اعتماد کمک کنند. اطمینان حاصل کنید که کتابخانهها را به آخرین نسخهها بهروز نگه میدارید و با استفاده از منابعی مانند پایگاههای داده Exploit-DB ، بهطور فعال هرگونه آسیبپذیری شناختهشده مربوط به آنها را جستجو کنید. جستجوی وب با استفاده از کلمات کلیدی مانند [library_name] vulnerability یا [library_name] CVE میتواند اطلاعات امنیتی حیاتی را آشکار کند.
منابع
- CWE-111: استفاده مستقیم از JNI ناامن
- سوءاستفاده از پایگاه داده
- بررسی فایلهای باینری برای ویژگیهای مقاومسازی امنیتی
- بررسی تنظیمات امنیتی باینری با pwntools
- مقاومسازی امنیتی باینری لینوکس
- مقاومسازی فایلهای باینری ELF با استفاده از جابجایی فقط خواندنی (RELRO)
- مکانیسمهای حفاظت دودویی OWASP
- استانداردهای کدگذاری SEI CERT
- راهنمای توسعهدهندگان OWASP
- فهرست SDK گوگل پلی
- اندروید NDK
- معرفی اندروید Rust
- Abseil (کتابخانههای مشترک C++)
- PIE توسط لینکر اعمال میشود