ネイティブ コードの使用
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
OWASP カテゴリ: MASVS-CODE: コード品質
概要
Android アプリでは、特定の機能に C や C++ などの言語で記述されたネイティブ コードを利用できます。ただし、アプリが Java Native Interface(JNI)を使用してこのネイティブ コードを操作すると、バッファ オーバーフローなどの脆弱性や、ネイティブ コードの実装に存在する可能性のあるその他の問題にさらされる可能性があります。
影響
パフォーマンスの最適化や難読化など、非常に有益な影響があるにもかかわらず、Android アプリでネイティブ コードを使用すると、セキュリティに悪影響が及ぶ可能性があります。C/C++ などのネイティブ コード言語には、Java/Kotlin のメモリ安全性機能がないため、バッファ オーバーフロー、解放後の使用エラー、その他のメモリ破損の問題などの脆弱性の影響を受けやすく、クラッシュや任意のコード実行につながる可能性があります。また、ネイティブ コード コンポーネントに脆弱性があると、たとえ他の部分が Java で安全に記述されていても、アプリ全体が危険にさらされる可能性があります。
リスクの軽減
開発とコーディングに関するガイダンス
- 安全なコーディング ガイドライン: C/C++ プロジェクトの場合は、確立された安全なコーディング標準(CERT、OWASP など)にマッピングすることで、バッファ オーバーフロー、整数オーバーフロー、フォーマット文字列攻撃などの脆弱性を軽減できます。品質とセキュリティに定評のある Abseil などのライブラリを優先します。可能であれば、Rust などのメモリセーフ言語を採用することを検討してください。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
などのキーワードを使用してウェブ検索すると、重要なセキュリティ情報が公開される可能性があります。
リソース
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-07-26 UTC。"],[],[],null,["# Use of native code\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-CODE: Code Quality](https://mas.owasp.org/MASVS/10-MASVS-CODE)\n\nOverview\n--------\n\nAndroid applications can take advantage of native code written in languages like\nC and C++ for specific functionalities. However, when an application utilizes\nthe Java Native Interface (JNI) to interact with this native code, it\npotentially exposes itself to vulnerabilities like buffer overflows and other\nissues that may be present in the native code implementation.\n\nImpact\n------\n\nDespite very positive impacts such as performance optimization and obfuscation,\nutilizing native code in Android applications can have negative security\nimpacts. Native code languages like C/C++ lack the memory safety features of\nJava/Kotlin, making them susceptible to vulnerabilities like buffer overflows,\nuse-after-free errors, and other memory corruption issues -- leading to crashes\nor arbitrary code execution. Additionally, if a vulnerability exists in the\nnative code component, it can potentially compromise the entire application,\neven if the rest is written securely in Java.\n\nMitigations\n-----------\n\n### Development and coding guidance\n\n- **Secure Coding Guidelines**: For C/C++ projects, adhere to established secure coding standards (e.g., 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++.\n- **Input Validation**: Rigorously validate all input data received from external sources, including user input, network data, and files, to prevent injection attacks and other vulnerabilities.\n\n### Harden the compilation options\n\nNative libraries utilizing the ELF format can be hardened against a range of\nvulnerabilities by activating protective mechanisms like stack protection\n(Canary), relocation read-only (RELRO), data execution prevention (NX), and\nposition-independent executables (PIE). Conveniently, the Android NDK\ncompilation options already enable all these protections by default.\n\nTo verify the implementation of these security mechanisms within a binary, you\ncan employ tools like `hardening-check` or `pwntools`. \n\n### Bash\n\n $ pwn checksec --file path/to/libnativecode.so\n Arch: aarch64-64-little\n RELRO: Full RELRO\n Stack: Canary found\n NX: NX enabled\n PIE: PIE enabled\n\n### Verify third-party libraries are not vulnerable\n\nWhen choosing third-party libraries, prioritize using those with a solid\nreputation in the development community. Resources like the [Google Play SDK\nIndex](https://play.google.com/sdks) can help you identify well-regarded and trustworthy libraries. Ensure\nyou keep the libraries updated to the latest versions and proactively search for\nany known vulnerabilities related to them using resources like the databases\nfrom [Exploit-DB](https://www.exploit-db.com/). A web search using keywords like\n`[library_name] vulnerability` or `[library_name] CVE` can reveal critical\nsecurity information.\n\nResources\n---------\n\n- [CWE-111: Direct Use of Unsafe JNI](https://cwe.mitre.org/data/definitions/111.html)\n- [Exploit database](https://www.exploit-db.com/)\n- [Check binaries for security hardening features](https://www.systutorials.com/docs/linux/man/1-hardening-check/)\n- [Check binary security settings with pwntools](https://docs.pwntools.com/en/stable/commandline.html#pwn-checksec)\n- [Linux binary security hardening](https://medium.com/@n80fr1n60/linux-binary-security-hardening-1434e89a2525)\n- [Hardening ELF binaries using Relocation Read-Only (RELRO)](https://www.redhat.com/fr/blog/hardening-elf-binaries-using-relocation-read-only-relro)\n- [OWASP binary protection mechanisms](https://mas.owasp.org/MASTG/Android/0x05i-Testing-Code-Quality-and-Build-Settings/#binary-protection-mechanisms)\n- [SEI CERT Coding Standards](https://wiki.sei.cmu.edu/confluence/display/seccode/SEI+CERT+Coding+Standards)\n- [OWASP Developer Guide](https://owasp.org/www-project-developer-guide/release/)\n- [Google Play SDK Index](https://play.google.com/sdks)\n- [Android NDK](/ndk)\n- [Android Rust introduction](https://source.android.com/docs/setup/build/rust/building-rust-modules/overview)\n- [Abseil (C++ Common Libraries)](https://github.com/abseil/abseil-cpp)\n- [PIE is enforced by the linker](https://cs.android.com/android/platform/superproject/main/+/main:bionic/linker/linker_main.cpp;l=425?q=linker_main&ss=android%2Fplatform%2Fsuperproject%2Fmain)"]]