パンくず

Android DroidDreamは2種類の脆弱性を突いている

2011年3月3日午前8時半。ここ最近はサンプリングしたAndroidの悪意あるマルウェアにかかりきりでとても忙しい日々を送っています。 DroidDream (Android/DrdDream.A!tr)のことは恐らくご存知でしょう。このマルウェアは、Android Marketのいくつかのアプリケーションにトロイの木馬を仕掛けました。これについていくつかのブログが投稿されています。

  • Lookoutは、当該マルウェアが発見された経緯、標的となったアプリケーション、懸念すべきか否かを説明しています。 余談ですが、Lookoutにはサンプルを共有してくれたことに感謝申し上げます。
  • AndroidPoliceは、当該マルウェアがrageagainstthecageでroot権限を奪取する攻撃プログラム(エクスプロイト)を利用していること、そして、悪意あるアプリケーションが既にMarketから取り除かれたことを説明しています。
  • Kasperskyは、Android Marketの影の側面およびiPhoneのジェイルブレーキング(制限を非正規に解除すること)を指摘していています。
  • AegisLabは、当該マルウェアがJNIを利用して/proc information (AegisLabが分析するサンプルはフォーティネットがこのブログ投稿で引用するサンプルとは若干異なります)を収集すると説明しています。

当該マルウェアに関しては以上のような説明がありますが、このブログ投稿ではさらなる問いに対処するつもりです。

DroidDreamが利用する脆弱性は1つではなく2つ

フォーティネットが分析したサンプルでは、これらのファイルはそのパッケージのアセットディレクトリに置かれています。

$ ls -al
-rw-r--r-- 1 axelle users 15295 Jan 14 11:04 exploid
-rw-r--r-- 1 axelle users  3868 Jan 14 11:04 profile
-rw-r--r-- 1 axelle users  5392 Jan 14 11:04 rageagainstthecage
-rw-r--r-- 1 axelle users 14076 Feb 15 14:59 sqlite.db
drwxr-xr-x 4 axelle users  4096 Mar  2 11:04 www

exploidは、local root exploitに相当し、rageagainstthecageが機能しない場合に試行されます。 rageagainstthecageの裏にある意図は、多くのプロセスを生成し、ユーザープロセスの最大限界に到達させることです。そのため、次にadbdプロセスが実行されると、そのroot権限を放棄することはできなくなります。 両ファイルとも、ローカルroot権限のエスカレーションによる攻撃プログラムです。 以下のログには、アンドロイドエミュレーター上で攻撃プログラムが呼び出されたものの失敗していることが示されています。

W/System.err(  246): java.io.IOException: Error running exec().
Commands: [/data/data/com.droiddream.bowlingtime/files/exploid,
/dev/block/mtdblock1, yaffs2] Working Directory: null Environment: null
D/AudioSink(   31): bufferCount (4) is too small and increased to 12
W/MediaPlayer(  240): info/warning (1, 44)
W/System.err(  246): 	at java.lang.ProcessManager.exec(ProcessManager.java:196)
W/System.err(  246): 	at java.lang.Runtime.exec(Runtime.java:225)
W/System.err(  246): 	at java.lang.Runtime.exec(Runtime.java:313)
W/System.err(  246): 	at java.lang.Runtime.exec(Runtime.java:246)
W/System.err(  246): 	at com.android.root.udevRoot.runExploid(udevRoot.java:134)
W/System.err(  246): 	at com.android.root.udevRoot.go4root(udevRoot.java:230)
W/System.err(  246): 	at com.android.root.Setting.onCreate(Setting.java:265)

profileは、シェルです。このシェルについては後ほど説明します。sqlite.dbは、実際にはSQLiteデータベースではなく、マルウェアが感染デバイスにインストールする、com.android.providers.downloadsmanagerという名称のAndroidパッケージです。 最後に、wwwディレクトリには、本物のフォアグラウンドアプリケーション(たとえば、ボーリングゲーム)によって使用される本物のアセット(イメージ)が含まれます。

DroidDreamは被害者のIMEI、IMSIなどをWebに送るが、これを実行するためにAndroid端末のroot権限は必要はない

このマルウェアが最初に実行することの1つは、Android端末のIMEI、IMSI、AndroidバージョンをリモートのWebサイトに送ることです。このサイトのURLはXORで暗号化されています。 この鍵は、Setting.classという名称の別のクラスにハードコードされています。Javaを少し逆コンパイルし、手軽なスタンドアロンプログラムにコピー&ペーストして、このURLを次のように復号化しています。

情報は、XML形式を使って投稿されています(HTTPポスト)。

<?xml version="1.0" encoding="UTF-8"?>
<Request>
<Protocol>1.0</Protocol>
<Command>0</Command>
<ClientInfo>
  <Partner>502</Partner>
  <ProductId>10011</ProductId>
  <IMEI>YOUR IMEI</IMEI>
  <IMSI>YOUR IMSI</IMSI>
  <Modle>YOUR DEVICE SDK</Modle>
</ClientInfo>
</Request>

IMEI、IMSIなどを送ることがこのマルウェアの真の狙いではありません。送るためにはAndroid端末のroot権限は必要はなく、READ_PHONE_STATE権限があれば良いためです。

r00tシェル - マルウェア作者の観点からはすばらしいシェル

このマルウェア作者が本当にインストールしたいのは、プロファイルバイナリのようです(アセットディレクトリ内、上記を参照)。 一度Android端末がroot化されると、このマルウェアはプロファイルを/system/bin/profileにコピーして、このファイルにroot権限を設定します。

chown 0.0 /system/bin/profile
chown root.root /system/bin/profile
chmod 6755 /system/bin/profile

実際、/system/bin/profileファイルもr00t化されたインジケーターとしての機能を果たします。 当該ファイルが存在すればAndroid端末のroot権限は奪取されおり、ファイルがなければ当該マルウェアが端末をroot化しようとします。 そのため、暫定処置として、所有するAndroid端末上でダミーの/system/bin/profileを作成し、当該マルウェアの影響を受けないようにする(より正確には、当該マルウェアが動作できないようにする)ことを一部開発者は推奨しています。

逆アセンブラーを使用したプロファイルの迅速分析によれば、この実行ファイルは単にsetgidを実行し、その後setuidを実行して、最後に(excv)シェルを実行します。 このマルウェア作者は、感染デバイス上にrootシェルをインストールしました。 しかしこれまでのところ、このシェルはリモートからは使用されていません。
 これはサイバー犯罪者による行為というより、(卑劣な)ハッカーの仕業のように私には見えます。ただし、次のステップで、(ダウンロードマネージャーパッケージ経由で)マルウェアのアップグレードをダウンロードし、このrootシェルを収益化しない限りにおいてですが・・・

Androidの脆弱性に関してDavid Maciejak氏からいただいたご支援に感謝いたします。

 
 

日本版右カラム