脆弱性体験

Activityのandroid:exported属性に、誤った値を設定したことで生じた脆弱性を悪用された場合の被害について、サンプルアプリを使って体験してみましょう。

サンプルアプリについて

サンプルアプリは、以下の想定で作成されています。
アプリ名 04画像投稿
アプリの概要 端末内の画像ファイルを外部のサイトへアップロードし、他のアプリ利用者と画像の共有を行うアプリを想定しています。
アプリを使用するメリット 利用者はこのアプリを利用する事で、画像をアップロードし、他の利用者とコミュニケーションを図ることができるようになります。
主な動作 最初に認証画面を表示して利用者のID、パスワードの入力を得ます。 その後、入力された値を使って認証を行い、認証完了後に投稿画像選択画面に遷移して画像のアップロードを行います。
サンプルアプリの実装範囲 本アプリはサンプルのため、ID、パスワードの入力を受け取りますが、入力された値に対するチェック、および認証処理を行いません。認証を通過した想定で次の投稿画像選択画面へ遷移します。
また、画像のアップロードの処理に関しても実際には行いません。
サンプルアプリ内の脆弱性 開発者はandroid:exported属性にtrueを設定した場合、他の全てのアプリからそのActivityへアクセス可能となるということを理解せずにtrueを設定してしまったという想定です。

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

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

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

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

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

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

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

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

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


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

    • プロジェクトに「!」が付いている場合
      この場合はサンプルアプリの動作対象バージョンのSDKがインストールされていないことが原因です。
      ComponentActivityExported」プロジェクトフォルダの以下に「Android2.2」がありません。
      SDK Managerを起動して、動作対象バージョンのSDKをインストールしてください。
    • プロジェクトに「☓」が付いている場合
      この場合はソースコードにエラーがあることが原因です。
      プロジェクトフォルダ内の.javaファイル、xmlファイルのエラーとなっている箇所を修正してください。
  • ID、パスワードを入力
    ユーザID、パスワードを入力し、ログインボタンをタップします。
    (本アプリはサンプルのため、IDとパスワードは任意の文字列で構いません。)

    投稿画像選択画面が表示され、プルダウンメニューからディレクトリを選択すると、端末に保存されている画像ファイルの一覧が表示されます。
    (端末内に画像ファイルが存在しない場合も想定し、アプリに内蔵されているテスト用の画像も一覧に表示されます。)
  • 画像の投稿
    投稿したい画像をチェックし、「投稿」ボタンをタップすると、投稿画像確認画面が表示されます。
    「投稿前に画像を確認する」にチェックを入れていた場合、「はい」ボタンをタップすると画像の投稿を行います。
    チェックを外していた場合は、すぐに画像の投稿を行います。
次は、「04画像投稿」アプリのActivityを外部から起動する攻撃アプリの説明です。

攻撃アプリについて

攻撃アプリは以下のような想定で作成されています。
アプリ名 04画像投稿スパイ
攻撃者の目的 「04画像投稿」アプリの機能を悪用し、端末内の画像を不正にアップロードします。
攻撃方法
  • 攻撃アプリのインストール・実行
    攻撃者が端末内の画像を不正にアップロードするためには、攻撃アプリを利用者の端末にインストールする必要があります。利用者に攻撃アプリをインストールさせるには、「無害なアプリを装ってアプリを公開する」などの方法が考えられます。利用者に、「攻撃アプリ」を無害なアプリであると思い込ませ、端末にインストールして実行させます。
  • 攻撃実行
    攻撃アプリは「04画像投稿」アプリのアップロード機能を悪用し、端末内の画像を無断でアップロードします。この攻撃アプリはサンプルなので取得した情報を外部へ送信することはありません。

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

では、攻撃者の立場に立って、実際に脆弱性のあるサンプルアプリの機能を悪用してみましょう。
まず、「攻撃アプリをダウンロード」ボタンをクリックし、ComponentActivitySpywareExported.apkをダウンロードしてください。

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

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

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

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

    install.batの実行に失敗し、攻撃アプリがインストールできなかった場合、以下の原因が考えられます。
    • 「'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つだけ表示される状態にしてください。

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

  • 攻撃アプリの実行
    それでは攻撃アプリを実行してみましょう。 端末(またはエミュレータ)のアプリ一覧画面(ドロワー)上で、攻撃アプリのアイコン「04画像投稿スパイ」をタップし、攻撃アプリを起動します。


  • 実行結果の確認
    攻撃アプリを実行すると、「04画像投稿」アプリの画像アップロード機能を悪用し、端末内の画像を不正にアップロードされてしまいます。


この攻撃アプリはサンプルなので、実際に画像をアップロードすることはありません。
通常、攻撃者は利用者に気づかれないように外部へ画像をアップロードしてしまうため、アップロードされた画像を発見して初めて利用者が被害に気づくという形になります。