MASTG-KNOW-0006 バイナリ保護メカニズム (Binary Protection Mechanisms)

バイナリ保護メカニズム の存在を検出することはアプリケーションの開発に使用された言語に大きく依存します。

一般的にはすべてのバイナリをテストすべきです。これにはメインのアプリ実行可能ファイルだけでなくすべてのライブラリや依存関係が含まれます。しかし、Android では次に説明するようにメインの実行可能ファイルは安全であると考えられるため、ネイティブライブラリに焦点を当てます。

Android は アプリの DEX ファイル (classes.dex など) から Dalvik バイトコードを最適化し、ネイティブコードを含む新しいファイルを生成します。通常、拡張子は .odex, .oat です。この Android コンパイル済みバイナリ (アプリパッケージの探索 (Exploring the App Package) の "コンパイル済みアプリバイナリ" を参照) は Linux や Android がアセンブリコードをパッケージ化するために使用するフォーマットである ELF フォーマット を使用してラップされています。

アプリの NDK ネイティブライブラリ (アプリパッケージの探索 (Exploring the App Package) の "ネイティブライブラリ" を参照) も ELF フォーマットを使用 しています。

  • PIE (Position Independent Executable):

    • Android 7.0 (API レベル 24) 以降、メインの実行可能ファイルに対して PIC コンパイルは デフォルトで有効 になっています。

    • Android 5.0 (API レベル 21) で PIE 非対応のネイティブライブラリのサポートは 廃止 され、それ以降 PIE は リンカーによって強制 されるようになりました。

  • メモリ管理:

    • ガベージコレクションはメインのバイナリに対して実行されるだけで、バイナリ自体は何もチェックされません。

    • ガベージコレクションは Android ネイティブライブラリには適用されません。開発者は適切な 手動メモリ管理 を行う責任があります。 "メモリ破損バグ" を参照してください。

  • スタックスマッシュ保護:

    • Android アプリはメモリセーフと考えられる (少なくともバッファオーバーフローを軽減する) Dalvik バイトコードにコンパイルされます。Flutter などの他のフレームワークはその言語 (この場合は Dart) がバッファーオーバーフローを軽減する方法であるため、スタックカナリアを使用したコンパイルは行われません。

    • Android ネイティブライブラリは有効にしなければなりませんが、それを完全に判断するのは難しいかもしれません。

      • NDK ライブラリはコンパイラがデフォルトでそれを行うため有効になっているはずです。

      • 他のカスタム C/C++ ライブラリは有効になっていない可能性があります。

詳しくはこちら。

Last updated

Was this helpful?