- 本文はフォーティネット セキュリティ ブログの抄訳です。
執筆者: Axelle Apvrille
2011年6月9日7:37am
"Crypto Girl"と名乗っている以上、最新のAndroidマルウェアであるAndroid/DroidKungFuがAES暗号を使用していることについて言及したいと思います。
Androidマルウェアが暗号を使用するのはもちろんこれが初めてではありません。Android/GeinimiやAndroid/HongTouTouでDESが使用されているのは見たことがありますが、AndroidでAESが使用されているのはこれが初めてのようです(AESはすでにSymbOS/InSpiritなどのSymbianマルウェアではすでに発見されています)。
Android/DroidKungFuでは、AES暗号を使用して、このマルウェアが利用する2つの攻撃コードを暗号化しています。
- CVE-2009-1185:gjsvroとしてパッケージ化され、当該マルウェアのアセット内に置かれる。
- CVE-2010-EASY(Rage Against The Cage):RATCと名付けられ、当該マルウェアのアセット内に置かれる。
攻撃コード上のシンプルなXORでハッシュベースのAVシグネチャ(当該実行ファイルのハッシュをベースとしたシグネチャ)をバイパスできるであろうに、マルウェア作成者がなぜ特にAESを使用したのか全く理解できません。単純に、利用できるAESクラスがあったからであると考えます。
Android/HongTouTouは、悪意あるユーティリティクラス(Utilsと呼ばれている)にあるハードコードされたキーを使用してファイルを復号します。
private static byte[] defPassword = { 70, 117, 99, 107, 95, 115, 69, 120,
121, 45, 97, 76, 108, 33, 80, 119 };
攻撃コードを復号するためにわれわれができることは、何らかのJavaのソースコードを書くことによって、暗号化されたアセットを読み込み、ハードコードされたキーを使用してAESで復号し、復号されたデータをダンプすることです。
この復号のルーティンは、当該マルウェアの逆アセンブリからコピー&ペーストできます。
public static byte[] decrypt(byte[] paramArrayOfByte)
throws Exception {
byte[] arrayOfByte = defPassword;
SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");
localCipher.init(2, localSecretKeySpec);
return localCipher.doFinal(paramArrayOfByte);
}
つぎに、アセットを読み込み、出力をダンプします。これは、単にJava FileInput/OutputStreamとByteArrayInput/OutputStreamクラスを使用するということです。
ByteArrayOutputStream bout = new ByteArrayOutputStream();
FileInputStream fin = new FileInputStream(filename);
int c;
while ((c = fin.read()) != -1) {
bout.write(c);
}
bout.close();
fin.close();
byte [] decrypted = decrypt(bout.toByteArray());
ByteArrayInputStream bin = new ByteArrayInputStream(decrypted);
String outputfilename = filename + ".decrypt";
FileOutputStream fout = new FileOutputStream(outputfilename);
while ((c = bin.read()) != -1) {
fout.write(c);
}
fout.close();
bin.close();
これらの文字列をちょっと見てみると、アセットの復号に成功していることが分かります。
$ strings ratc.decrypted ... /system/lib/proc/%d/cmdline/sbin/adb [*] CVE-2010-EASY Android local root exploit (C) 2010 by 743C [*] checking NPROC limit ... [-] getrlimit...
次回もお見逃しなく!