脆弱性体験

Preferenceファイルのアクセス制限不備による脆弱性が悪用された場合の被害について、サンプルアプリを使って体験してみましょう。

サンプルアプリについて

サンプルアプリは、以下の想定で作成されています。
アプリ名 03SNSモバイル
アプリの概要 架空のWebサービス「SNSモバイル」にログインし、日記の作成、つぶやき(コメントの投稿)等を行うアプリを想定しています。
アプリを使用するメリット 利用者はこのアプリを利用する事で、Android端末を使っていつでもどこでも「SNSモバイル」のサービスを利用することができます。
主な動作 サンプルアプリは、「SNSモバイル」のクライアントアプリとして動作します。サンプルアプリを起動すると、認証画面を表示してID、パスワードの入力を要求します。入力された値を使って認証を行い、認証後に、サンプルアプリの各種機能が使えるようになります。
サンプルアプリの実装範囲 サンプルアプリは、認証画面で入力したID、パスワードをPreferenceに保存する機能のみ実装しています。認証処理は実装されておらず、任意のID、パスワードを受け入れ、認証成功と判定します。
サンプルアプリ内の脆弱性 このアプリの開発者は、Android OSのファイルアクセス制限について誤った理解をしていたため、Preferenceファイルを作成する際に、MODE_WORLD_READABLEを指定していた、という想定です。

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

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

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

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

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

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

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

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

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


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

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

  • メインメニュー画面表示
    メインメニュー画面が表示されます。

  • 登録データの確認
    ログイン時に入力した情報は、Preferenceに登録されます。再度アプリを立ち上げると、前回入力したID、パスワードがあらかじめ入力された状態になります。
    入力した情報が正しく登録されているか確認してみましょう。
次は、登録されたデータを盗み出す攻撃アプリの説明です。

攻撃アプリについて

攻撃アプリは以下のような想定で作成されています。

アプリ名 03SNSモバイルスパイ
攻撃者の目的 「攻撃者は、サンプルアプリ「03SNSモバイル」アプリのPreferenceファイルに保存している情報(IDやパスワード)を盗み出し、正規の利用者になりすますことを目的としています。
攻撃方法
  • 攻撃アプリのインストール・実行
    攻撃アプリが情報を盗み出すためには、サンプルアプリ「03SNSモバイル」が作成するファイルのフルパスが必要です。
    ファイルのフルパスを調べるには、「アプリが出力する情報から類推する」、「サンプルアプリを解析する」などの方法が考えられます。
    フルパスが判明すれば、サンプルアプリ「03SNSモバイル」のPreferenceファイルを、攻撃アプリによって読み取り、情報を外部に送信できます。
    なお、この攻撃アプリはサンプルなので、情報を外部に送信することはありません。
  • 攻撃実行
    攻撃アプリが情報を盗み出すためには「03SNSモバイル」アプリが作成するファイルのフルパスが必要になりますが、ここでは説明しません。
    例えば、アプリが出力したログからパス名を類推する、アプリを解析してパス名を求める、などの方法が考えられます。
    フルパスが求められれば、攻撃アプリは「03SNSモバイル」アプリがPreferenceファイルを読み取り、外部に送信することが可能になります。
    なお、この攻撃アプリはサンプルなので情報を外部に送信することはありません。
  • 情報の入手
    攻撃者は入手したIDとパスワード等を入手し、記録します。そして、被害者が利用している各種のSNSへ被害者になり済ましてログインし、不正にサービスを利用します。

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

では、攻撃者の立場に立って、実際に脆弱性のあるサンプルアプリが作成した情報を盗み出してみましょう。
まず、「攻撃アプリをダウンロード」ボタンをクリックし、「FileaccessPreferenceSpyware.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つだけ表示される状態にしてください。

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

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

  • 実行結果の確認
    攻撃アプリを実行すると、「03SNSモバイル」アプリが保存した情報が画面に一覧表示されます。

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