Команда УЦСБ провела независимое исследование для того, чтобы протестировать работу популярных антивирусных приложений для Android. С результатами этого исследования я делилась на конференции phdays VI, но хотелось бы более подробно остановиться на применении обфускаторов для обхода механизмов обнаружения вирусов.
Методы обфускации
В свободном доступе существует довольно много различных обфускаторов. Для применения в рамках исследования были выбраны три бесплатных, а в качестве дополнения был написан еще один, выполняющий функции, которых на наш взгляд не хватало в предыдущих.
Во-первых, были выбраны два обфускатора, работающих с исходным кодом – это Proguard и Alatori.
ProGuard внедрен в систему сборки Android приложений – Android Studio и запускается вместе со сборкой приложения в «release» режиме. Официально эта утилита предназначена для сокращения, оптимизации и обфускации кода.
ProGuard умеет переименовывать имена методов и некоторых классов, а в качестве уникальной особенности можно выделить то, что данный обфускатор единственный удаляет всю отладочную информацию (имена файлов с исходным кодом класса и номера строк в коде).
Аналогично рассмотренному Proguard, Alatori умеет переименовывать имена свойств и методов, а также некоторые имена классов, а еще частично удаляет отладочную информацию — меняет имя файла с исходным кодом, не удаляя при этом номера строк. Главным отличием Alatori является шифрование строк (алгоритмом xor с ключем 0x20).
Во-вторых, был рассмотрен обфускатор, работающий с байт-кодом в формате smali – Adam.
А поскольку утилита apktool легко генерирует такой байт-код из apk-файла, то для обфускации приложения при помощи Adam не требуется исходный код этого приложения.
Адам поддерживает 4 метода обфускации, на примере которых можно наглядно рассмотреть, как видоизменяется код после обфускации:
1) Добавление в код каждого класса дополнительного метода.
БЫЛО | СТАЛО |
Код метода1 Код метода2 |
Код метода1 .method public SparkLog(Ljava/lang/String;)V const-string v0, «SparkLog» invoke-static {v0, p0}, Lcom/lohan/lohanLog;->Log(Ljava/lang/String;Ljava/lang/String;)V .end method Код метода2 |
2) Изменение имён методов классов
БЫЛО | СТАЛО |
.method private capitalize(Ljava/lang/String;)Ljava/lang/String; |
.method private capitalizeabc123 (Ljava/lang/String;)Ljava/lang/String; |
3) Изменение потока выполнения.
Вначале реализации каждого метода ставится goto инструкция безусловного перехода в конец метода. После происходит безусловный переход в начало, сразу за инструкцией перехода, где продолжится нормальное выполнение кода.
БЫЛО | СТАЛО |
.method private capitalize(Ljava/lang/String;)Ljava/lang/String; Кодметода .end method |
.method private capitalize(Ljava/lang/String;)Ljava/lang/String; goto :CFGGoto2 :CFGGoto1 Кодметода :CFGGoto2 goto :CFGGoto1 .end method |
4) Шифрование строк кода.
Все инструкции объявления строковых переменных заменяются на инструкции объявления зашифрованной строковой переменной и вызовом статического метода, расшифровывающую строку.
БЫЛО | СТАЛО |
const-string v5, «http.protocol.content-charset» | const-string v5, "rddz.zbydymyv.myxdoxd-mrkbcod" invoke-static {v5}, Lcom/mzhengDS;->DecryptString(Ljava/lang/String;)Ljava/lang/String; move-result-object v5 |
Тестирование антивирусов на обфусцированных приложениях
Для тестирования обфусцированных приложений было решено взять один новый троян (приложение malware.apk, включающее некоторый опасный потенциал) и один известный – дендроид (известный, потому что его сигнатуры определяют многие антивирусы). Кроме того, тестирование проводили еще и на модифицированном дендроид – почищенном от мусора в исходном коде, например, от неиспользуемых функции. К слову, даже просто убрав мусор, и пересобрав вредоносное приложение, некоторые антивирусы уже переставали на него реагировать.
Результаты сканирования на virustotal отображены в таблице 1.
Таблица 1 – результаты сканирования на virustotal
Clean | Proguard | Alatori | ADAM | |
Malware.apk | 26 | 17 | 10 | 18 |
Dendroid | 35 | 31 | 24 | 25 |
Dendroid (модифицированный) |
28 | 28 | 21 | 17 |
Результаты сканирования на топовых мобильных антивирусных приложениях, установленных на смартфоне показаны в таблице 2.
Таблица 2 – результаты сканирования мобильными антивирусами
Clean | Proguard | Alatori | ADAM | |
Malware.apk | 6 | 4 | 4 | 3 |
Dendroid | 12 | 11 | 9 | 11 |
Dendroid (модифицированный) |
10 | 9 | 5 | 9 |
В большинстве случаев Alatory показал наилучшие результаты, предположительно, благодаря функции шифрования строк кода, кроме сканирования обфусцированного Malware.apk мобильными антивирусами. В этой ситуации лучше всех с заданием справился ADAM, а тремя антивирусами, обнаружившими вирус, стали Kaspersky, LookOut и AVAST.
Снижение числа детектов до трёх – это конечно хорошо, но мы хотели добиться нулевого распознавания обфусцированного приложения (чего, кстати, сделать так и не удалось).
Поэтому был разработан еще один обфускатор, умеющий работать с байт-кодом и сочетающий лучшие стороны уже рассмотренных обфускаторов. А в следствие того, что он прекрасно дополнил ADAM умением шифровать имена пакетов и классов (алгоритмом xor как в Alatori, но на этот раз с переменным ключом), обфускатор был назван – EVA.
На рисунке 1 показан фрагмент AndroidManifest.xml после обфускации EVA, в котором были изменены (зашифрованы) все имена классов и пакетов. После работы EVA обфусцированный байт-код необходимо пересобрать с помощью apktool обратно в apk-файл и переподписать его.
Рисунок 1 – фрагмент AndroidManifest.xml после обфускации EVA
Результаты сканирования приложений, обфусцированных EVA приведены в таблицах 3 и 4.
Таблица 3 – результаты сканирования на virustotal
Clean | Eva | |
Malware.apk | 26 | 3 |
Dendroid | 35 | 12 |
Таблица 4 — результаты сканирования мобильными антивирусами
Clean | Eva | |
Malware.apk | 6 | 1 |
Dendroid | 12 | 11 |
Таким образом, EVA показала наилучшие результаты среди обфускаторов. Для malware.apk удалось добиться единичного детекта со стороны мобильных антивирусов, причем единственным антивирусом, обнаружившим вирус оказался AVAST.
Но и это еще не всё!
Во-первых, простая перепаковка приложения с помощью apktool уменьшает число детектов уже в несколько раз.
Во-вторых, комбинация различных методов и обфускаторов значительно улучшает результаты. Так применение EVA, ADAM и Proguard в любой последовательности и любое количество раз позволило снизить число детектов на virustotal тоже до 1. Здесь нулевого детекта, к сожалению, также добиться не удалось. А вот единственным антивирусом, обнаружившим вирус, на этот раз оказался некий Ahnlab-V3.
В-третьих, было подмечено, что Kaspersky перестает реагировать на вирус после применения любого шифрующего метода, правда через некоторое время его базы обновляются и детект возобновляется.
Вместо заключения
Поскольку приложение malware.apk в части запрашиваемых прав на устройстве ничем не отличалось от стандартного мессенджера, был взят и прообфусцирован популярный WhatsApp, который, естественно, не является вредоносным изначально.
Обфускация мессенджера проводилась тремя способами:
1) простой перепаковкой;
2) обфускацией байт-кода с использованием ADAM;
3) обфускацией байт-кода с использованием EVA.
Правда при попытке обфускации имен классов и пакетов трансформация приложения оказывалась слишком сильной и приложение аварийно завершалось.
Кроме этого, из-за наличия у WhatsApp проверки контрольной суммы образа, даже в случае успешной обфускации, приложение отказывалось работать, предлагая себя переустановить.
В итоге, обфусцированный WhatsApp, во всех 3х случаях, определялся в качестве вредоносного ПО двумя антивирусами – Avast и Lookout.
Автор: USSCLTD