image
Команда УЦСБ провела независимое исследование для того, чтобы протестировать работу популярных антивирусных приложений для 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-файл и переподписать его.
image
Рисунок 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.
Поделиться с друзьями
-->

Комментарии (8)


  1. trilodi
    15.07.2016 14:33

    Что касательно EVA. Вы планируете его выложить в открытый доступ или на платной основе? Или это лишь для тестирования?


    1. USSCLTD
      15.07.2016 14:38
      +1

      нет, не планируем, разрабатывали для тестирования


      1. trilodi
        15.07.2016 14:40

        Очень жаль, было бы интересно протестировать в живую


  1. teecat
    15.07.2016 16:12
    +2

    Вот почему народ думает, что внутри антивируса некий исcкуственный интеллект, который магически взглянув на программу определяет ее вредоносность?


    1. trilodi
      15.07.2016 16:14

      Практически у всех антивирусов сейчас имеется эвристический анализ, который по определенным критериям может с большой вероятностью определить направленность программы.


      1. teecat
        15.07.2016 16:24
        +2

        Эвристический анализ может определять новые модификации известных угроз. Написав новый обфускатор/перепаковщик вы эвристик обойдете. Посему статей на хабре по типу я написал новый вирус, а он не ловится никем — тележка наберется. Новая угроза ловится поведенческим анализатором. Но по малости ресурсов таковых в андроидных решениях не водится.
        А вот если бы вы провели тесты на самозащиту и лечение активных угроз — вот это было бы реально нужно для людей, выбирающих решение.
        И кстати отмеченный вами рост распознавания на вирустотале — это действительно проблема безопасности


        1. USSCLTD
          15.07.2016 16:42
          +1

          Настоящая статья затрагивает только вопрос детекта обфусцированных приложений и не раскрывает полной сути исследования, которое было значительно шире. С обобщенными результатами исследования можно ознакомиться на сайте securitylab http://www.securitylab.ru/analytics/483120.php, там кстати приводятся имена антивирусов, справившихся с проверкой.


          1. teecat
            15.07.2016 16:53

            Да. я видел. Собственно и мнение высказал по итогам этих двух статей