Android Data Stealing Vulnerability(情報漏えいの問題)の脅威を調べてみる

2010 年 10 月、Thomas Cannon 氏が Android における情報漏えいの問題(Bugtraq ID:45048)を公開しました。公開当初、Thomas Cannon 氏はこの問題の実証コードを公開していませんでした。しかし 2011 年 1 月、この問題を実証する Metasploit Framework モジュールがリリースされました。このモジュールを基に、実際にどのファイルを外部に送信できてしまうかを調べてみました。
なお、この日記では Metasploit Framework モジュールの詳細については書きません。興味がある方は Metasploit Framework の該当モジュールを参照してください。

問題の実証環境と手順

Xperia(SO-01B)*1Androidアプリ「ブラウザ」を用いて、下図の環境で問題を実証しました。

実証手順は以下の通りです。

  1. Androidアプリ「ブラウザ」で Web サーバに設置した実証コードを閲覧する。
  2. 実証コードが Xperia 上で動作する(動作するためにはユーザの操作が必要)。
  3. 実証コードが Xperia 上の特定のファイルを Web サーバに送信する。
  4. Xperia 上のファイルの MD5 ハッシュと、Web サーバに送信されたファイルの MD5 ハッシュを比較する。

手順 4 まで実施した結果、2 つの MD5 ハッシュが一致した場合「ファイルの送信に成功した」と判断しました。MD5 ハッシュが一致しない場合や、なんらかの原因で Web サーバにファイルが送信されなかった場合「ファイルの送信に失敗した」と判断しました。
なお実証コードには、Metasploit Framework モジュールを基に僕が作成したものを使用しました。

実証:どのファイルを外部に送信できてしまうか

前述の実証手順で、僕が思いつく範囲のファイルを外部の Web サーバに送信できるか実証してみました。

問題を実証した結果、Xperia から外部の Web サーバに以下のファイルを送信できてしまいました。

ファイルパス ファイル内容
/proc/version Android のバージョン情報
/system/etc/hosts 名前解決に使用されるファイル(参考:英語版Wikipedia記事
/sdcard/FxCamera/FxCam_1300978166959.jpg Androidアプリ「FxCamera」で撮影した画像ファイル(50,435 bytes)
/sdcard/backups/apps/net.uhmaro.android.rosen.apk Androidアプリ「アストロファイルマネージャ」でバックアップしたAndroidアプリ「路線ドロイド」の apk ファイル(60,323 bytes)
/sdcard/SD_PIM/PIM00001.vcf Androidアプリ「電話帳」でエクスポートした連絡先情報(59,356 bytes)

外部のサーバに送信できなかったファイルには、以下のものがありました。

ファイルパス ファイル内容
/data/system/accouts.db アカウント情報が保存されている sqllite データベース*2
/sdcard/DCIM/100ANDRO/DSC_0295.jpg Androidアプリ「カメラ」で撮影した画像ファイル(795,527 bytes)

/data/system/accounts.db の送信を試したとき、「logcat」で Android のログを確認したところ、以下の警告メッセージが出力されていました。このファイルのアクセス権限をエミュレータで確認したところ*3、ユーザ「system」、グループ「system」のみ、このファイルの読み取りが許可されていました。このことから、実証コードが /data/system/accounts.db の読み取りに失敗したため、警告が生じたと考えます。

W/browser (13568): Console: Error: NETWORK_ERR: XMLHttpRequest Exception 101 content://com.android.htmlfileprovider/sdcard/download/a.html:42

/sdcard/DCIM/100ANDRO/DSC_0295.jpg の送信を試した際、Android アプリ「ブラウザ」が異常終了しました。このとき Android のログには 以下のデバッグメッセージ(一部のみ抜粋)が出力されていました。同ディレクトリに保存したテキストファイルの送信には成功したため、このファイルは(論理的には)外部に送信できるファイルです。この結果から、何らかの原因(Android 端末、アプリ、実証コード等)により送信に失敗するファイルもあると言えます。

I/DEBUG   ( 2974): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 2974): Build fingerprint: 'docomo/SO-01B_1233-7397/SO-01B/es209ra:2.1-update1/2.0.1.B.0.19/ExBC:user/release-keys'
I/DEBUG   ( 2974): pid: 14156, tid: 14171  >>> com.android.browser <<<
I/DEBUG   ( 2974): signal 11 (SIGSEGV), fault addr deadd00d
I/DEBUG   ( 2974):  r0 00000026  r1 afe13359  r2 afe13359  r3 00000000
I/DEBUG   ( 2974):  r4 ad081f50  r5 ad081f50  r6 00343d48  r7 00000000
I/DEBUG   ( 2974):  r8 47f08da8  r9 42bccf1c  10 42bccf04  fp 00343d48
I/DEBUG   ( 2974):  ip deadd00d  sp 47f08288  lr afe143a3  pc ad035c4c  cpsr 20000030
I/DEBUG   ( 2974):          #00  pc 00035c4c  /system/lib/libdvm.so
(以下、略)

実証結果から分かること

この日記の実証結果から Android における情報漏えいの問題が悪用されてしまった場合でも、Androidファイルシステムでアクセス制御しているファイルを外部に送信できないと考えます。実証結果では /data/system/accounts.db がアクセス制御されているファイルに該当します。他には、個々の Android アプリがローカル(SDカード除く)に保存するファイル*4も該当します。

外部に送信されるファイルには、SD カードに保存しているファイルが該当します。ただし、SD カードに保存しているファイルでも、送信に失敗するものがありました。少なくとも公開されている実証コードでは、SD カードに保存しているすべてのファイルを送信できないと考えます。実証コード次第になると思います。

実証結果から思うこと

最近 Android に関連する脆弱性が発見されるようになりましたが、「その脆弱性を悪用されると、どんな被害が生じるのか」、「どの機種が影響を受けるのか」等がきちんと実証されていない印象があります。今後これらをきちんと実証していく必要があるのかなと思っています。あとは、Android に関連する脆弱性情報に CVE 番号をきちんと割り当ててほしいです:(

*1:この日記執筆時点の最新バージョンを使用しています。Xperia のバージョンはNTTドコモのサポート情報を参照してください。

*2:2011年2月11日に開催された「AccountManagerのソースコードを読む会」の議事録を参照してください。

*3:Xperia, エミュレータに「adb shell」で接続し「ls -l」した結果を pastie.org に張り付けています。興味ある方はどうぞ。

*4:Android アプリがローカルに保存する場合、/data/data/(パッケージ名)/files/(ファイル名) に保存されるようです。