Android セキュリティテスト入門

この章では、セキュリティテスト環境のセットアップについて詳しく説明し、Android アプリのセキュリティをテストするための実践的なプロセスとテクニックをいくつか紹介します。これらは MASTG テストケースの構成要素です。

Android テストのセットアップ

Windows, Linux, macOS が動作するほぼすべてのマシン上で、完全に機能するテスト環境をセットアップできます。

ホストデバイス

少なくても、Android Studio (付属の Android SDK) プラットフォームツール、エミュレータ、さまざまな SDK バージョンとフレームワークコンポーネントを管理するアプリが必要です。Android Studio にはエミュレータイメージを作成するための Android Virtual Device (AVD) Manager アプリケーションも付属しています。最新の SDK ツールプラットフォームツール がシステムにインストールされていることを確認します。

さらに、ネイティブライブラリを含むアプリを扱う予定がある場合は、Android NDK をインストールしてホストのセットアップを完了するとよいでしょう。

コンピュータからデバイスを表示や制御すると便利なことがあります。これを実現するには、Scrcpy を使用できます。

テストデバイス

動的解析には、ターゲットアプリを実行する Android デバイスが必要です。原理的には、実際の Android デバイスがなくてもエミュレータだけを使用してテストできます。しかし、アプリの実行はエミュレータ上では非常に遅く、シミュレータでは現実的な結果が得られないかもしれません。実機でのテストはよりスムーズなプロセスとより現実的な環境を得られます。一方、エミュレータでは SDK バージョンを簡単に変更したり、複数のデバイスを作成できます。各アプローチの長所と短所の概要全体を以下の表に示します。

プロパティ物理エミュレータ/シミュレータ

リストアする能力

ソフトブリックはいつでも可能性がありますが、新しいファームウェアは一般的にまだフラッシュできます。ハードウェアブリックは非常に稀です。

エミュレータはクラッシュしたり破損する可能性がありますが、新しいものを作成したりスナップショットをリストアできます。

リセット

工場出荷時設定にリストアしたり再フラッシュできます。

エミュレータは削除して再作成できます。

スナップショット

できません。

サポートされており、マルウェア解析に最適です。

スピード

エミュレータよりはるかに高速です。

一般的に低速ですが、改善が行われています。

コスト

一般的に使用可能なデバイスは $200 からです。生体センサーのあるものやないものなど、さまざまなデバイスが必要になるかもしれません。

フリーと商用の両方のソリューションが存在します。

ルート化のしやすさ

デバイスに大きく依存します。

一般的にデフォルトでルート化されています。

エミュレータ検出のしやすさ

エミュレータではないので、エミュレータチェックは適用できません。

多くのアーティファクトが存在するため、アプリがエミュレータで動作していることを簡単に検出できます。

ルート検出のしやすさ

多くのルート検出アルゴリズムはエミュレータのプロパティをチェックするため、ルートを隠すのは比較的簡単です。Magisk Systemless Root を用いると、検出することはほぼできません。

テストするために見つけることができる多くのアーティファクトで構築されているため、エミュレータはほとんど常にルート検出アルゴリズムをトリガーします。

ハードウェアとのインタラクション

Bluetooth, NFC, 4G, Wi-Fi, 生体認証, カメラ, GPS, ジャイロスコープなどを通じて簡単にインタラクションします。

通常はかなり制限があり、エミュレートされたハードウェア入力 (ランダムな GPS 座標など) になります。

API レベルのサポート

デバイスとコミュニティによって異なります。活発なコミュニティ (LineageOS など) は更新バージョンを配布し続けますが、あまり人気のないデバイスは少数のアップデートしか受け取れないかもしれません。バージョン間の切り替えにはデバイスをフラッシュする必要があり、面倒なプロセスです。

ベータリリースを含む最新バージョンを常にサポートします。特定の API レベルを含むエミュレータを簡単にダウンロードして起動できます。

ネイティブライブラリのサポート

通常、ネイティブライブラリは ARM デバイス用にビルドされているため、物理デバイス上で動作します。

x86 CPU で動作するため、一部のエミュレータはパッケージ化されたネイティブライブラリを実行できないかもしれません。

マルウェアの危険性

マルウェアサンプルはデバイスに感染する可能性がありますが、デバイスストレージを消去してクリーンなファームウェアをフラッシュし、それによって工場出荷状態にリストアできれば、問題にはならないでしょう。USB ブリッジを悪用しようとするマルウェアサンプルがあることに注意してください。

マルウェアサンプルはエミュレータに感染する可能性がありますが、エミュレータは削除して再作成するだけで済みます。スナップショットを作成し、さまざまなスナップショットを比較して、マルウェア解析に役立てることもできます。ハイパーバイザを攻撃しようとするマルウェアの概念実証があることに注意してください。

実デバイスでのテスト

ほとんどすべての物理デバイスをテストに使用できますが、考慮すべき点がいくつかあります。まず、デバイスがルート化可能である必要があります。これは一般的にエクスプロイトを通じて行われるか、アンロックされたブートローダーを通じて行われます。エクスプロイトは常に利用できるわけではなく、ブートローダーが永久にロックされていることもあれば、通信事業者との契約が終了した場合にのみアンロックされることもあります。

最適な候補は開発者向けに作られたフラグシップの Google Pixel デバイスです。これらのデバイスには一般的にアンロック可能なブートローダー、オープンソースファームウェア、カーネル、オンラインで利用可能な無線通信、公式の OS ソースコードが付属しています。OS が Android オープンソースプロジェクトに最も近いため、開発者コミュニティは Google デバイスを好みます。これらのデバイスは一般的にサポート期間が最も長く、OS アップデートが 2 年間、その後のセキュリティアップデートが 1 年間となっています。

あるいは、Google の Android One プロジェクトには同じサポート期間 (2 年間の OS アップデート、1 年間のセキュリティアップデート) が受けられ、純正に近い体験を得られるデバイスが含まれています。当初はローエンドデバイス向けのプロジェクトとして開始されましたが、このプログラムはミッドレンジやハイエンドのスマートフォンを含むまでに発展し、その多くは改造コミュニティによって積極的にサポートされています。

LineageOS プロジェクトでサポートされているデバイスもテストデバイスとして非常に良い候補です。活発なコミュニティがあり、フラッシュとルート化の手順が簡単で、最新バージョンの Android が一般的に Lineage インストールとしてすぐに利用可能です。また、LineageOS は OEM がアップデートの配布を停止した後も、新しいバージョンの Android のサポートを継続しています。

Android の物理デバイスで作業する場合、ADB デバッグインタフェースを使用するために、デバイスの開発者モードと USB デバッグを有効にしましょう。Android 4.2 (API レベル 16) 以降、設定アプリの 開発者オプション サブメニューはデフォルトで非表示になっています。これをアクティブにするには 端末情報 ビューの ビルド番号 セクションを七回タップします。ビルド番号フィールドの場所はデバイスによって若干異なることに注意してください。たとえば、LG Phone では、端末情報 -> ソフトウェア情報 にあります。これを行うと、設定メニューの一番下に 開発者オプション が表示されます。開発者オプションをアクティブにすると、USB デバッグ スイッチでデバッグを有効にできます。

エミュレータでのテスト

複数のエミュレータが存在しますが、それぞれに長所と短所があります。

フリーエミュレータ:

商用エミュレータ:

  • Genymotion - ローカルおよびクラウドベースの両方のソリューションとして多くの機能を備えた成熟したエミュレータ。フリー版は非営利目的で利用できます。

  • Corellium - クラウドベースまたはオンプレミスのソリューションを通じてカスタムデバイスの仮想化を提供します。

フリーの Android エミュレータはいくつかありますが、他のものと比べてアプリのテストに適した拡張機能を提供する AVD を使用することをお勧めします。このガイドの残りの部分では、公式の AVD を使用してテストを実行します。

AVD は、いわゆる 拡張コントロールモーションセンサー を通じて、GPS や SMS などのいくつかのハードウェアエミュレーションをサポートしています。

Android Studio の AVD Manager を使用して Android Virtual Device (AVD) を起動するか、Android SDK の tools ディレクトリにある android コマンドでコマンドラインから AVD Manager を起動します。

./android avd

エミュレータ環境内でアプリをテストするために使用できるツールや VM がいくつかあります。

特権アクセスの取得

実機でのテストには ルート化 (つまり、root ユーザーとしてコマンドを実行できるように OS を変更すること) をお勧めします。これにより、オペレーティングシステムを完全に制御できるようになり、アプリのサンドボックス化などの制限を回避できるようになります。これらの権限により、コードインジェクションや関数フックなどのテクニックをより簡単に使用できるようになります。

ルート化には危険が伴うことに注意し、続行する前に三つの主な結果を明確にする必要があります。ルート化は以下のような悪影響を及ぼす可能性があります。

  • デバイスの保証を無効にします (何らかの行動を起こす前に、必ず製造業者のポリシーを確認してください)

  • デバイスを「ブリック (文鎮化)」します、つまり操作不能で使用不能になります

  • さらなるセキュリティリスクを引き起こします (ビルトインのエクスプロイト緩和機能が削除されることが多いため)

個人情報を保存している個人デバイスをルート化すべきではありません。代わりに安価なテスト専用端末を入手することをお勧めします。Google の Nexus シリーズなど、多くの古いデバイスは最新の Android バージョンを実行でき、テストにはまったく問題ありません。

デバイスのルート化は最終的にあなたの判断であり、OWASP はいかなる損害に対しても責任を負わないことを理解する必要があります。不明な点があれば、ルート化プロセスを開始する前に専門家の助言を求めてください。

どのモバイルがルート化できるか

実質的にはどんな Android モバイルでもルート化できます。Android OS の商用バージョン (カーネルレベルで Linux OS を進化させたもの) はモバイル向けに最適化されています。これらのバージョンでは、たとえば、非特権ユーザーが (昇格した権限を持つ) 'root' ユーザーになる機能など、一部の機能が削除または無効になっています。スマホのルート化とは、ユーザーが root ユーザーになることを許可することを意味します。たとえば、su とよばれる標準 Linux 実行ファイルを追加することで、別のユーザーアカウントに変更できます。

モバイルデバイスをルート化するには、まずブートローダーをアンロックします。アンロックの手順はデバイス製造業者によって異なります。しかし、実用的な理由から、特にセキュリティテストに関しては、一部のモバイルデバイスのルート化が他のルート化よりも人気があります。Google が開発し、Samsung, LG, Motorola などの企業が製造したデバイスが、特に多くの開発者に使用されているため、最も人気があります。ブートローダーがアンロックされてもそのデバイスの保証は無効にならず、Google はルート自体をサポートする多くのツールを提供しています。

Magisk でのルート化

Magisk ("Magic Mask") は Android デバイスをルート化する方法の一つです。その特徴はシステムの変更を実行する方法にあります。他のルート化ツールはシステムパーティション上の実際のデータを改変しますが、Magisk は変更しません (これを「システムレス」と呼びます)。これにより、root に敏感なアプリケーション (金融やゲームなど) からの変更を隠すことが可能になり、事前にデバイスのルート化を解除しなくても公式の Android OTA アップグレードを使用できます。

公式の GitHub 上のドキュメント を読むことで、Magisk について詳しく知ることができます。Magisk をインストールしていないのであれば、そのドキュメント にインストール手順があります。公式 Android バージョンを使用していて、それをアップグレードする予定がある場合、Magisk は GitHub 上のチュートリアル を提供しています。

さらに、開発者は Magisk の機能を利用してカスタムモジュールを作成し、それを公式の Magisk Modules リポジトリ投稿 できます。投稿されたモジュールは Magisk Manager アプリケーション内にインストールできます。これらのインストール可能なモジュールの一つが、Xposed のシステムレスバージョンです (SDK バージョン 27 までで利用可能)。

ルート検出

ルート検出手法の広範なリストは「Android のアンチリバース防御のテスト」の章に記載されています。

一般的なモバイルアプリセキュリティビルドでは、通常、ルート検出を無効にしてデバッグビルドをテストしたいと思うでしょう。そのようなビルドがテストに利用できない場合には、この本の後半で紹介するさまざまな方法でルート検出を無効にできます。

Last updated