SoumniBot: уникальные техники нового банкера для Android

BOOX

Стаж на ФС с 2012 года
Команда форума
Служба безопасности
Private Club
Регистрация
23/1/18
Сообщения
29.110
Репутация
11.695
Реакции
61.895
RUB
50
Авторы распространенного вредоносного ПО нередко прибегают к различным средствам защиты кода от обнаружения и анализа.


Зловреды для Android — не исключение. Среди злоумышленников, атакующих мобильные устройства, очень популярны, например, дропперы, такие как Badpack и Hqwar, цель которых — скрытно доставить на смартфон банковский троянец или шпионское ПО. Однако недавно мы нашли новый банкер SoumniBot, нацеленный на корейских пользователей, который отличается нестандартным подходом к защите от анализа и обнаружения, а именно — обфускацией манифеста Android.

sl-abstract-mobile-phone-malware-danger-blue-red-binary-code-1-1200x600.jpg

Как обфусцирован SoumniBot: эксплуатация багов при обработке манифестов в Android

Любой APK-файл — это ZIP-архив, в корневом каталоге которого находится файл AndroidManifest.xml. Этот файл содержит информацию о декларируемых компонентах, разрешениях и других данных приложения, а также помогает операционной системе извлекать сведения о различных точках входа в программу. Как и операционная система, аналитик в первую очередь знакомится с манифестом, откуда он узнает о точках входа, с которых следует начинать анализ кода приложения.

Скорее всего, именно это побудило разработчиков SoumniBot исследовать особенности обработки манифестов в Android, что позволило им найти несколько интересных возможностей для обфускации APK.

Техника 1: неправильное значение поля Compression method

Это техника, которую использует различное вредоносное ПО, в том числе SoumniBot. Она эксплуатирует механизм извлечения манифестов из архива. Стандартная функция распаковки из Android-библиотеки libziparchive допускает два значения поля Compression method в заголовке записи: 0x0000 (STORED, то есть без сжатия) и 0x0008 (DEFLATED, сжатие с использованием deflate из библиотеки zlib) — при других значениях возвращается ошибка.


Алгоритм распаковки файлов из libziparchive

Однако для распаковки AndroidManifest.xml разработчики Android решили не использовать эту функцию, реализовав альтернативный сценарий, в котором проверка значения поля Compression method выполняется некорректно.


Код для извлечения манифестов в Android

Если APK при распаковке манифеста встречает любое значение поля Compression method, отличное от 0x0008 (DEFLATED), то файл считается несжатым. Это позволяет разработчикам приложений указывать любое значение поля Compression method, отличное от 8, при этом записывая данные в несжатом виде. Такой манифест будет невалидным для любого распаковщика, в котором проверка метода сжатия реализована корректно, но парсер APK из фреймворка Android его распознает, и приложение установится. На рисунке ниже приведен пример исполнения этой техники в файле .


Неверное значение поля Compression method, за которым следуют несжатые данные

Техника 2: неверный размер манифестов​

Суть этой техники рассмотрим на примере файла . В заголовке AndroidManifest.xml в ZIP-архиве указывается размер файла манифеста. Если файл хранится в несжатом виде, то он будет скопирован из архива без изменений, даже если размер указан с ошибкой. При этом в парсере манифестов любой оверлей — информация после блока полезных данных, которая не относится к манифесту, — игнорируется.

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


Указанный размер манифеста гораздо больше, чем на самом деле

Стоит отметить, что, хотя такие файлы считаются валидными на реальных устройствах, с ними не справляется — официальная утилита Google, предназначенная для анализа собранных APK-файлов. Мы оповестили Google об этом.

Техника 3: использование длинных названий пространств имен

Такой техникой также пользовалось найденное нами семейство, например файл . Ее суть заключается в том, что в манифест добавляются очень длинные строки, которые используются в качестве названий для пространств имен в XML.


Очень длинные строки в манифесте…


…которые используются в качестве названий пространств имен

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

Что скрывается за обфускацией: функциональность SoumniBot

При запуске приложение запрашивает с сервера, адрес которого представлен константой в коде, конфигурацию с двумя параметрами — mainsite и mqtt.


Запрос параметров

Оба параметра представляют собой адреса серверов, необходимые для корректной работы зловреда. Сервер mainsite служит для отправки собранных данных, mqtt — для обмена сообщениями по протоколу MQTT и используется преимущественно для получения команд. Если исходный сервер по какой-то причине не предоставил эти параметры, приложение использует адреса по умолчанию, которые также содержатся в его коде.

После запроса параметров запускается вредоносный сервис. Если он не сможет запуститься или по какой-то причине перестанет работать, то будет повторять попытку с периодичностью раз в 16 минут. При первом запуске троянец скрывает иконку приложения, усложняя его удаление, после чего в фоновом режиме раз в 15 секунд загружает на сервер mainsite данные с устройства жертвы: IP-адрес, страну, вычисленную на основе IP, списки контактов и аккаунтов, сообщения SMS и MMS, а также ID жертвы, сгенерированный с помощью библиотеки .

Помимо этого, троянец подписывается на получение сообщений от MQTT-сервера, откуда приходят команды, описанные ниже.

НомерОписаниеПараметры
0Отправка информации о зараженном устройстве (номер телефона, оператор сотовой связи и др.), а также версии троянца, после чего следует отправка всех SMS, контактов, аккаунтов, фото, видео жертвы, а также цифровых сертификатов для онлайн-банкинга
1Отправка списка контактов жертвы
2Удаление контакта на устройстве жертвыdata — имя контакта, который необходимо удалить
3Отправка SMS и MMS жертвы
4Отладочная команда, вместо которой, скорее всего, в новой версии добавится функциональность отправки журнала звонков
5Отправка фото и видео жертвы
8Отправка SMSdata — ID сообщения для дальнейшей отправки. Троянец передает его на сервер mainsite, который возвращает текст сообщения
24Отправка списка установленных приложений
30Добавление нового контакта на устройствоname — имя контакта; phoneNum — номер телефона
41Получение информации об уровне громкости рингтонов на устройстве
42Включение или отключение беззвучного режимаdata — флаг: если он принимает значение 1, будет установлен беззвучный режим, если 0 — отменен
99Отправка сообщения pong в ответ на ping-запрос сервера MQTT
100Включение отладочного режима
101Выключение отладочного режима

Отдельного внимания заслуживает команда с номером 0. Эта команда, среди прочего, ищет файлы c расширениями .key и .der на внешнем хранилище устройства, которые содержат в пути /NPKI/yessign.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static List getAllBankingKeys(Context context) {
List list = new ArrayList();
Cursor cursor = context.getContentResolver().query(MediaStore.Files.getContentUri("external"),
new String[]{"_id", "mime_type", "_size", "date_modified", "_data"},
"(_data LIKE \'%.key\' OR _data LIKE \'%.der\')", null, null);
int index = cursor == null ? 0 : cursor.getColumnIndexOrThrow("_data");
if (cursor != null) {
while (cursor.moveToNext()) {
String s = cursor.getString(index);
If (!s.contains("/NPKI/yessign")) {
continue;
}
Logger.log("path is:" + s);
list.add(s);
break;
}
cursor.close();
}
return list;
}

Если приложение находит такие файлы, то директория, в которой они расположены, помещается в ZIP-архив и отправляется на командный сервер. Эти файлы — цифровые сертификаты клиентов корейских банков, которые используются, например, для входа в онлайн-банкинг или подтверждения банковских операций. Такая техника очень редко применяется в мобильных банковских троянцах.

Заключение

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

Мы рассказали о приемах троянца, чтобы исследователи по всему миру были осведомлены об этих тактиках, которые могут со временем перенять и другие зловреды. Помимо нестандартной обфускации, SoumniBot отличается тем, что похищает ключи корейских приложений для онлайн банкинга. Эта функциональность очень редко встречается среди банковских зловредов для Android.

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


 
  • Теги
    apk-файл soumnibot банковский троянец зловреды для android
  • Сверху Снизу