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
などのキーワードを使用してウェブ検索すると、重要なセキュリティ情報が公開される可能性があります。
リソース
- CWE-111: 安全でない JNI の直接使用
- データベースを悪用する
- バイナリにセキュリティ強化機能が含まれているかどうかを確認する
- pwntools を使用してバイナリのセキュリティ設定を確認する
- Linux バイナリのセキュリティ強化
- 再配置読み取り専用(RELRO)を使用した ELF バイナリの強化
- OWASP バイナリ保護メカニズム
- SEI CERT コーディング標準
- OWASP デベロッパー ガイド
- Google Play SDK Index
- Android NDK
- Android Rust の概要
- Abseil(C++ 共通ライブラリ)
- PIE はリンカーによって適用される