脆弱性体験

暗黙的Intentの不適切な使用により、アプリに作り込まれてしまった脆弱性が悪用された場合の被害について、サンプルアプリを使って体験してみましょう。

サンプルアプリについて

サンプルアプリは、2本のアプリから構成され、以下の想定で作成されています。
アプリ名 07画像受信
アプリの概要 「07画像送信」アプリから受け取った画像をあらかじめ指定された場所へアップロードするアプリです。
アプリを使用するメリット 画像をアップロードするのに必要な設定をユーザ側で行うことなく画像をアップロードすることができます。
主な動作 「07画像送信」アプリから受け取った画像を一覧表示し、利用者が選択した画像を送信します。
サンプルアプリの実装範囲 サンプルアプリのため、「07画像送信」アプリから受け取った画像名の表示と削除は行いますが、実際の送信処理は行いません。
サンプルアプリ内の脆弱性 利用者が「07画像送信」アプリによって送信した画像を、アプリ内のBroadcastReceiverで受け取るように設計していました。
ところが、アプリ内のBroadcastReceiverが保護されていなかったため、悪意あるアプリからのBroadcastを受信してしまう脆弱性があった、という想定です。


アプリ名 07画像送信
アプリの概要 前述の「07画像受信」アプリへ画像ファイルを送信するアプリです。
アプリを使用するメリット 写真撮影、編集をおこない「07画像受信」アプリと連携することができます。
主な動作 画像ファイル名を一覧し、利用者が選択した画像ファイルを送信します。
サンプルアプリの実装範囲 サンプルアプリのため、「07画像受信」アプリへ画像ファイル名は送信しますが、実際にファイルの送信は行わず、撮影、編集も行えません。
サンプルアプリ内の脆弱性 利用者が画像送信を指示した際に、自アプリ内のBroadcastReceiverにIntentを使用して画像ファイルを設定し、送信処理を起動するように設計していました。
ところが、暗黙的Intentを使用して通知を行っていたため、他のアプリからIntentを受信して画像ファイルを取得できてしまう脆弱性があった、という想定です。

サンプルアプリのインポート

始めに、サンプルアプリをEclipseにインポートします。
「サンプルアプリをインポート」ボタンをクリックしてプロジェクト「ComponentBroadcast」および「ComponentBroadcastSender」をワークスペースにインポートしてください。

サンプルアプリをインポート(ComponentBroadcast)

サンプルアプリをインポート(ComponentBroadcastSender)

サンプルアプリのビルド、起動

サンプルアプリは、以下の環境で動作するように作成されています。

動作対象バージョン Android2.2(API Level 8) 以降

サンプルアプリをビルドするためにはAndroid2.2(API Level 8) のSDKがインストールされている必要があります。
実行環境の準備を行い、サンプルプロジェクトをビルド・実行してみましょう。
準備ができていない場合はこちらを参考に準備を行ってください。

  • ビルドと実行
    画面左側ペインの「Package Explorer」タブを選択し、表示されているEclipseのプロジェクト「ComponentBroadcast」を右クリック→「Run As …」→「Android Application」でサンプルアプリ「07画像受信」を実行してください。

    サンプルアプリ「07画像受信」がビルドされ、ビルド完了後に自動的に起動します。


    同様に「ComponentBroadcastSender」を右クリック→「Run As …」→「Android Application」でサンプルアプリ「07画像送信」を実行してください。

    サンプルアプリ「07画像送信」がビルドされ、ビルド完了後に自動的に起動します。
    以下の画面が表示されます。

    サンプルアプリが実行できない場合

    • プロジェクトに「!」が付いている場合
      この場合はサンプルアプリの動作対象バージョンのSDKがインストールされていないことが原因です。
      「ComponentBroadcastSender」プロジェクトフォルダの以下に「Android2.2」がありません。
      SDK Managerを起動して、動作対象バージョンのSDKをインストールしてください。
    • プロジェクトに「☓」が付いている場合
      この場合はソースコードにエラーがあることが原因です。
      プロジェクトフォルダ内の.javaファイル、xmlファイルのエラーとなっている箇所を修正してください。


  • 一覧表示されている画像から送信したいものを選択し、「送信」ボタンをタップします。
  • 「07画像受信」アプリを起動し、画像データの確認を行います。
  • 次は、発行された暗黙的Intentから情報を盗み出す攻撃アプリの説明です。

攻撃アプリについて

攻撃アプリは以下のような想定で作成されています。
アプリ名 07画像送信スパイ
攻撃者の目的 「07画像送信」アプリの脆弱性を悪用し、利用者が送信した画像を取得します。
攻撃方法
  • 攻撃アプリのインストール・実行
    攻撃者が情報を盗み出すためには、攻撃アプリを利用者の端末にインストールする必要があります。利用者に攻撃アプリをインストールさせるには、「無害なアプリを装ってアプリを公開する」などの方法が考えられます。利用者に、「攻撃アプリ」を無害なアプリであると思い込ませ、端末にインストールして実行させます。
  • 攻撃実行
    攻撃アプリは「07画像送信」アプリが発行した暗黙的Intentを取得します。この攻撃アプリはサンプルなので取得した情報を外部へ送信することはありません。取得した情報を表示します。

攻撃アプリをダウンロード

では、攻撃者の立場に立って、実際に脆弱性のあるサンプルアプリが作成した情報を盗み出してみましょう。
まず、「攻撃アプリをダウンロード」ボタンをクリックし、「ComponentBroadcastSpyware.apk」をダウンロードしてください。

攻撃アプリをダウンロード

  • 攻撃アプリ(.apkファイル)のダウンロード先を指定する画面が表示されます。

  • 指定した位置に攻撃アプリのファイルと攻撃アプリのインストールを行うためのバッチファイルがダウンロードされます。
  • バッチファイルを実行すると、攻撃アプリが端末(またはエミュレータ)にインストールされます。

    攻撃アプリがインストールできない場合

    • 「'adb' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」のメッセージが表示された場合
      この場合はadbコマンドのpathが設定されていないことが原因です。

      adbコマンドのpathの設定方法は以下の通りです。(Windows7の場合)
      • Windowsの「スタート」をクリック → 「コンピュータ」を右クリック → 「プロパティ」を選択 → 「システムの詳細設定」をクリック → 「環境変数」ボタンをクリック
        環境変数の設定画面が表示されます。「システム環境変数」の項目の中から「Path」を選択して、「編集」ボタンをクリックします。
      • 変数値にAndroid SDKフォルダのplatform-toolsフォルダのパスを追加
        「変数値」の最後の行にAndroid SDKを保存しているフォルダのplatform-toolsフォルダまでのパスを追加します。

        例)Android SDKをCドライブのルートに保存した場合
        C:\android-sdk-windows\platform-tools

        追加するパスの前に「;」が無い場合はそれも追加するようにしてください。
    • 「error: more than one device and emulator - waiting for device -」のメッセージが表示された場合
      この場合は複数の端末がPCに接続されていること、または、エミュレータが複数起動していることが原因です。

      接続する端末を取り外す、または、エミュレータを終了し、DDMSビューにデバイスが1つだけ表示される状態にしてください。

攻撃アプリを使用した攻撃方法

  • 攻撃アプリの実行
    それでは攻撃アプリを実行してみましょう。
    Android3.0以降では、インストールしたアプリのBroadcastReceiverはアプリ実行後に有効になります。
    体験に使っている端末のOSバージョンを意識せずにシナリオを進められるよう、一度攻撃アプリを起動してBroadcastReceiverを有効にしておきます。
    端末(またはエミュレータ)のアプリ一覧画面(ドロワー)上で、攻撃アプリのアイコン「07画像送信スパイ」をタップし、攻撃アプリを起動します。

    攻撃アプリを実行


  • 実行結果の確認
    攻撃アプリを実行すると、一見無害にみえる時計アプリが起動します。

    起動画面

    この攻撃アプリは画像ファイル名を傍受するアプリです。アプリを起動したことによってBroadcastReceiverが有効になりました。
    それでは「07画像送信」アプリを起動し、いくつか画像データを送信してみてください。その後、攻撃アプリを再度起動します。
    攻撃アプリが起動したら、画面上にある「傍受した情報を見る」ボタンをタップしてみてください。
    先ほど、「07画像送信」アプリで入力した画像ファイル名が一覧され、暗黙的Intentの内容が傍受されていることが分かります。

    傍受画面

この攻撃アプリは、傍受した画像ファイル名を表示するだけで外部へ送信することはありません。
通常、攻撃者は情報が盗み出されたことを利用者に気づかれないように外部へ送信するため、情報の不正利用が公にならない限り、利用者が被害に気づくことは困難です。