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