OWASP 类别: MASVS-CODE:代码质量
概览
Android 应用可以利用使用 C 和 C++ 等语言编写的原生代码来实现特定功能。但是,当应用利用 Java 本地接口 (JNI) 与此原生代码进行交互时,可能会暴露自身,从而受到原生代码实现中可能存在的缓冲区溢出和其他漏洞的影响。
影响
尽管在性能优化和混淆等方面的积极影响非常显著,但在 Android 应用中使用原生代码可能会对安全性产生负面影响。C/C++ 等原生代码语言缺乏 Java/Kotlin 的内存安全功能,因此容易受到缓冲区溢出、释放后再使用错误和其他内存损坏问题的影响,从而导致崩溃或任意代码执行。此外,如果原生代码组件中存在漏洞,则可能会危及整个应用,即使其余部分是用 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 SDK
索引等资源可帮助您识别备受好评且值得信赖的库。确保
将库更新到最新版本,并主动搜索
与这些库相关的任何已知漏洞,使用
来自 Exploit-DB 的数据库等资源。使用 [library_name] vulnerability 或 [library_name] CVE 等关键字进行网络搜索可以发现关键安全信息。
资源
- CWE-111:直接使用不安全的 JNI
- 漏洞数据库
- 检查二进制文件是否具有安全强化功能
- 使用 pwntools 检查二进制文件安全设置
- Linux 二进制文件安全强化
- 使用重定位只读 (RELRO) 强化 ELF 二进制文件
- OWASP 二进制文件保护机制
- SEI CERT 编码标准
- OWASP 开发者指南
- Google Play SDK 索引
- Android NDK
- Android Rust 简介
- Abseil(C++ 通用库)
- 链接器强制执行 PIE