知っていれば防げたはずのAndroidケーススタディ
リスト1-3 shared.xmlファイルの内容
$ ls -l /data/data/com.skype.raider/files/shared.xml ls -l /data/data/com.skype.raider/files/shared.xml -rwxrw-rw- app_158 app_158 54738 2011-07-03 10:56 shared.xml $ cat /data/data/com.skype.raider/files/shared.xml cat /data/data/com.skype.raider/files/shared.xml <?xml version="1.0"?> <config version="1.0" serial="29" timestamp="1310374082.19"> <Lib> <Account> <Default>(Skype ID)</Default> </Account> <Audio> <SidIpcKeyPrefix>/tmp/</SidIpcKeyPrefix> </Audio> <BCM> <_2> (以下省略)
上記から取得したSkype IDを元に、/data/data/com.skype.raider/files/
リスト1-4 Skype IDディレクトリ
$ ls -l /data/data/com.skype.raider/files/(Skype ID) ls -l /data/data/com.skype.raider/files/(Skype ID) drwxrwxrwx app_158 app_158 2011-06-30 10:38 voicemail -rwxrw-rw- app_158 app_158 33344 2011-07-03 11:03 bistats.db-journal -rwxrw-rw- app_158 app_158 61440 2011-07-03 11:03 bistats.db -rwxrw-rw- app_158 app_158 135944 2011-07-03 11:03 main.db-journal -rwxrw-rw- app_158 app_158 327680 2011-07-03 11:03 main.db -rwxrw-rw- app_158 app_158 4904 2011-07-03 10:52 config.xml -rwxrw-rw- app_158 app_158 40960 2011-06-30 10:38 keyval.db -rwxrw-rw- app_158 app_158 0 2011-06-30 10:38 config.lck -rwxrw-rw- app_158 app_158 12824 2011-06-30 10:38 keyval.db-journal drwxrwxrwx app_158 app_158 2011-07-12 19:35 chatsync $
データベースファイルmain.dbからチャット内容を取得しています。チャット内容が暗号化されずに保存されているため、内容を読み取ることが可能です。ここではsqlite3コマンドを使用していますが、main.dbは誰でも読み書き可能なので、他のアンドロイドアプリから読み込むこともできます。
リスト1-5 main.dbファイルの内容
$ sqlite3 /data/data/com.skype.raider/files/(Skype ID)/main.db sqlite3 /data/data/com.skype.raider/files/(Skype ID)/main.db SQLite version 3.7.6.3 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select from_dispname, body_xml, timestamp from Messages; select from_dispname, body_xml, timestamp from Messages; チャット送信者1|チャット内容1|タイムスタンプ1 チャット送信者2|チャット内容2|タイムスタンプ2 チャット送信者3|チャット内容3|タイムスタンプ3
1.1.2 悪意のあるプログラム
Skype社では、悪意のあるプログラムがインストールされると個人情報が抜き取られると告知しています。情報を抜き取るプログラムを作成するのは非常に簡単です。上記の手順さえ知っていれば、rootなどの特殊な権限は必要ありません。一般的なアプリケーションの権限を使って、/data/data/com.skype.raider/files/shared.xmlを読み取り、Skype IDを取得し、そこからデータベースファイルのパスを作成します。データベースファイルも読み取り可能なので、作成したデータベースを直接読み込んだり、データベースファイル自体をネットワーク経由で送信したりすれば、個人情報を収集することが可能です(図1-1)。
図1-1:Skypeアプリからのデータの収集(クリックで拡大) |
1.1.3 なぜこのようなことが起こったのか
Skypeは、WindowsやMacなど、さまざまなプラットフォームで動作するように移植されています。Windows 7にインストールされたSkypeアプリの場合は、C:\Users\
図1-2:ユーザディレクトリ内のSkypeファイル(クリックで拡大) |
このディレクトリ構造はアンドロイド版と同じであり、shared.xmlファイルもmain.dbも暗号化されていません(図1-3)。アンドロイド版Skypeも他のプラットフォームから移植されたと考えられます。
図1-3:main.db の内部を表示(クリックで拡大) |
たとえばWindows版の場合、ユーザディレクトリ内のSkypeファイルはWindows上の他のユーザからは参照できない位置にあります。しかし、Skypeを使用しているユーザが第三者の悪意のあるプログラムをインストールした場合、アンドロイド版と同じく、Skypeに登録した個人情報やチャット履歴などのデータが漏洩することになります。本来ならばWindows版でも保存するデータを暗号化すべきところですが、受信したメールを暗号化せずに保存するアプリケーションが普通に存在するように、このレベルの問題はWindowsでは脆弱性と見なされていないと言えるでしょう。同じ仕組みであるにもかかわらず、Windows版では脆弱性として扱われないのに対し、アンドロイド版では脆弱性として扱われるということです。アンドロイドアプリはスマートフォン上で動作するため、Windowsよりも強いセキュリティが必要になります。Windowsのファイルに関する権限とユーザ権限の関係は、アンドロイドの権限構造とは異なります。セキュリティモデルについてWindowsと同じ概念を持ち込むのは非常に危険です。
Skypeは、通話データを暗号化するなど、セキュリティに関して通常より厳しいスタンスを取っています。今回そのSkype社がこのような単純な脆弱性問題※3を発生させてしまったのは、/data/data/ディレクトリの下は読み取り不能であるという勘違いと、読み取り不能なのでデータを暗号化する必要はないという判断が重なってしまったからでしょう。/data/data/の下にあるディレクトリであっても、他のアプリケーションから読み書き可能なファイルを作成できるということと、他のアプリケーションから参照可能であることは脆弱性と見なされることを知っていれば、このような問題は起きなかったのではないのでしょうか。