ネイティブ コードの使用

OWASP カテゴリ: MASVS-CODE: コード品質

概要

Android アプリケーションは、特定の機能に C や C++ などの言語で記述されたネイティブ コードを利用できます。ただし、アプリが Java Native Interface(JNI)を使用してこのネイティブ コードとやり取りする場合、ネイティブ コードの実装に存在する可能性のあるバッファ オーバーフローなどの脆弱性やその他の問題にさらされる可能性があります。

影響

パフォーマンスの最適化や難読化など、非常に大きなメリットがある一方で、Android アプリケーションでネイティブ コードを使用すると、セキュリティに悪影響が及ぶ可能性があります。C/C++ などのネイティブ コード言語には Java/Kotlin のようなメモリ安全機能がないため、バッファ オーバーフロー、解放後の使用エラー、その他のメモリ破損の問題などの脆弱性が生じやすく、クラッシュや任意のコード実行につながる可能性があります。また、ネイティブ コード コンポーネントに脆弱性がある場合、残りの部分が Java で安全に記述されていても、アプリケーション全体が危険にさらされる可能性があります。

リスクの軽減

開発とコーディングのガイダンス

  • 安全なコーディング ガイドライン: C/C++ プロジェクトでは、確立された安全なコーディング標準(CERT、OWASP など)に準拠して、バッファ オーバーフロー、整数オーバーフロー、フォーマット文字列攻撃などの脆弱性を軽減します。品質とセキュリティで知られる Abseil などのライブラリを優先します。可能な限り、C/C++ と同等のパフォーマンスを提供する Rust などのメモリセーフ言語の採用を検討してください。
  • 入力の検証: ユーザー入力、ネットワーク データ、ファイルなど、外部ソースから受信したすべての入力データを厳密に検証し、インジェクション攻撃やその他の脆弱性を防ぎます。

コンパイル オプションを強化する

ELF 形式を利用するネイティブ ライブラリは、スタック保護(カナリア)、再配置読み取り専用(RELRO)、データ実行防止(NX)、位置独立実行可能ファイル(PIE)などの保護メカニズムを有効にすることで、さまざまな脆弱性に対して強化できます。Android NDK のコンパイル オプションでは、これらの保護がすべてデフォルトで有効になっています。

バイナリ内のこれらのセキュリティ メカニズムの実装を検証するには、hardening-checkpwntools などのツールを使用できます。

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 Index などのリソースは、評価が高く信頼できるライブラリを特定するのに役立ちます。ライブラリを最新バージョンに更新し、Exploit-DB のデータベースなどのリソースを使用して、関連する既知の脆弱性を積極的に検索します。[library_name] vulnerability[library_name] CVE などのキーワードを使用してウェブ検索を行うと、重要なセキュリティ情報が明らかになる可能性があります。

リソース