Androidマルウェアのsmaliガジェット挿入による動的分析手法

Androidマルウェアを動的分析する場合、Windowsマルウェアのようにデバッカーを使ってコードを追いかけることは難しいのが現状です。Frida[1]によって動的にメソッドをフックする方法[2]がありますが、メソッドの途中の状態を取得することは難しく、また、FridaはAndroid専用のツールではないため、取得できる情報に限りがあります。今回は、Androidマルウェアをより柔軟に動的分析する方法として、smaliガジェット挿入手法を紹介します。
smaliガジェット挿入手法は、APKファイル内に分析用ガジェットを作成・挿入し、リパッケージしたAPKファイルを作成することで、動的分析を可能にする方法です。

逆コンパイル結果の確認

まず初めに、Androidマルウェアのどの部分を動的分析したいかを特定するために、Androidマルウェアのコードを確認します。APKファイルは、JADXや、JEB Proなどの逆コンパイラツールを使用することでJavaのコードとして逆コンパイル結果を確認することができます。図1に逆コンパイル結果の例を示します。本手法では、逆コンパイル結果などから、デコードするメソッドやアンパックを行うメソッドなどを事前に把握しておく必要があります。図1の例では、com.fky.lblabjglabというパッケージにあるクラスaメソッドaにて、String型の引数を受け取り、文字列を復号し、String型の変数を返していることがわかります。なお、暗号化にはRC4が使用されていますが、本手法では暗号化アルゴリズムを特定する必要はありません。

図1: JADXを使ったRC4による文字列の復号を行うメソッドのデコンパイル結果


smaliファイルの抽出とガジェットの挿入

分析したい箇所が決定したら、次にAndroidマルウェアを展開します。APKファイルの展開には、Apktool[3]を使用します。次に示すコマンドを実行することで、指定したAPKファイルが図2のように展開されるため、ガジェット挿入対象のsmaliファイルを編集することができます。ガジェット挿入対象のsmaliファイルはJADXなどで確認した逆コンパイル結果を参照することで見つけることができます。今回の例では、RC4の復号関数を呼び出しているsmali/com/fky/lblabjglab/a.smaliのsmaliファイルへガジェットを挿入することを考えます。

$ apktool d mal.apk

図2: 展開されたAPKファイルのディレクトリ構造


ここでは例として、ガジェット挿入対象のsmali/com/fky/lblabjglab/a.smali をテキストエディターで開き、引数と返り値をデバッグログへ出力するガジェットを図3に示すようにそれぞれ挿入しています。なお、表示させたい各変数を指定していますが、メソッドにおいて、p0はthisポインター、p1が第1引数に相当するため、第1引数の値を確認したい場合、p1 を指定し、文字列のログ出力をandroid.util.Log.e にて行っています。

図3: 分析用ガジェットの挿入例


smaliファイルのアセンブルと署名

分析用ガジェットを挿入した後、smaliファイルをアセンブルし、APKファイルを作成します。その後、証明書ファイルを作成し、作成されたAPKファイルに署名します。次の各コマンドを実行することで分析用ガジェットを挿入したAPKファイルを作成することが可能です。

$ apktool b mal
$ keytool -genkey -v -keystore test.store -alias example -keyalg RSA -validity 32767
$ apksigner sign --ks test.store -v --v2-signing-enabled true --ks-key-alias example mal.apk

リパッケージしたAPKファイルの実行

最後に、動的分析を行います。Android Studio[4]などを使用し、Androidの仮想デバイスを図4のように起動します。起動した仮想デバイス上でリパッケージしたAPKファイルをインストールします。注意点として、Androidマルウェアを実行する場合、事前に仮想デバイスの環境をインターネットから切り離しておくことが必要です。

図4: Android StudioによるエミュレーターへのAPKファイルのインストール


APKファイルのインストール後、仮想デバイス上で該当アプリを起動します。その後、図5に示すようにLogcatのタブを参照し、適切なfilterを設定することで、復号前の文字列と復号後の文字列をそれぞれ確認することができます。この手法を応用することで、メソッドの途中で変数の内容を参照、変更したり、途中で別のメソッドを呼び出すことなどさまざまな分析が可能です。

図5: 復号された文字列の出力結果


おわりに

事前に逆コンパイル結果の確認や適切なsmaliガジェット等の準備が必要ですが、本手法を活用することで、これまでAndroidマルウェアでは実現が難しかった柔軟な動的分析が可能です。なお、本手法のテストに使用したAndroidマルウェアをAppendixに記載しています。

インシデントレスポンスグループ 増渕 維摩

参考情報

[1] Frida
https://frida.re/

[2] How-to Guide: Defeating an Android Packer with FRIDA
https://www.fortinet.com/blog/threat-research/defeating-an-android-packer-with-frida

[3] Apktool
https://apktool.org/

[4] Android Studio
https://developer.android.com/studio

Appendix: 使用したAndroidマルウェアのハッシュ値

  • Cerberus: 1249c4d3a4b499dc8a9a2b3591614966145daac808d440e5202335d9a4226ff8
≪ 前へ
トップに戻る
次へ ≫