Авторы распространенного вредоносного ПО нередко прибегают к различным средствам защиты кода от обнаружения и анализа. Зловреды для Android — не исключение. Среди злоумышленников, атакующих мобильные устройства, очень популярны, например, дропперы, такие как Badpack и Hqwar, цель которых — скрытно доставить на смартфон банковский троянец или шпионское ПО. Однако недавно мы нашли новый банкер SoumniBot, нацеленный на корейских пользователей, который отличается нестандартным подходом к защите от анализа и обнаружения, а именно — обфускацией манифеста Android.
Как обфусцирован SoumniBot: эксплуатация багов при обработке манифестов в Android
Любой APK-файл — это ZIP-архив, в корневом каталоге которого находится файл AndroidManifest.xml. Этот файл содержит информацию о декларируемых компонентах, разрешениях и других данных приложения, а также помогает операционной системе извлекать сведения о различных точках входа в программу. Как и операционная система, аналитик в первую очередь знакомится с манифестом, откуда он узнает о точках входа, с которых следует начинать анализ кода приложения. Скорее всего, именно это побудило разработчиков SoumniBot исследовать особенности обработки манифестов в Android, что позволило им найти несколько интересных возможностей для обфускации APK.
Техника 1: неправильное значение поля Compression method
Это относительно известная техника, которую использует различное вредоносное ПО, в том числе SoumniBot. Она эксплуатирует механизм извлечения манифестов из архива. Стандартная функция распаковки из Android-библиотеки libziparchive допускает два значения поля Compression method в заголовке записи: 0x0000 (STORED, то есть без сжатия) и 0x0008 (DEFLATED, сжатие с использованием deflate из библиотеки zlib) — при других значениях возвращается ошибка.
Однако для распаковки AndroidManifest.xml разработчики Android решили не использовать эту функцию, реализовав альтернативный сценарий, в котором проверка значения поля Compression method выполняется некорректно.
Если APK при распаковке манифеста встречает любое значение поля Compression method, отличное от 0x0008 (DEFLATED), то файл считается несжатым. Это позволяет разработчикам приложений указывать любое значение поля Compression method, отличное от 8, при этом записывая данные в несжатом виде. Такой манифест будет невалидным для любого распаковщика, в котором проверка метода сжатия реализована корректно, но парсер APK из фреймворка Android его распознает, и приложение установится. На рисунке ниже приведен пример исполнения этой техники в файле b456430b4ed0879271e6164a7c0e4f6e.
Техника 2: неверный размер манифестов
Суть этой техники рассмотрим на примере файла 0318b7b906e9a34427bf6bbcf64b6fc8. В заголовке AndroidManifest.xml в ZIP-архиве указывается размер файла манифеста. Если файл хранится в несжатом виде, то он будет скопирован из архива без изменений, даже если размер указан с ошибкой. При этом в парсере манифестов любой оверлей — информация после блока полезных данных, которая не относится к манифесту, — игнорируется. Вредоносное приложение этим пользуется: указанный в нем размер манифеста в архиве превышает его реальный размер, в результате чего в распакованный манифест добавляется оверлей с частью содержимого самого архива. Более строгие парсеры манифестов не смогут прочитать такой файл, однако парсер манифестов Android обрабатывает некорректный манифест без ошибок.
Стоит отметить, что, хотя такие файлы считаются валидными на реальных устройствах, с ними не справляется apkanalyzer — официальная утилита Google, предназначенная для анализа собранных APK-файлов. Мы оповестили Google об этом.
Техника 3: использование длинных названий пространств имен
Такой техникой также пользовалось найденное нами семейство, например файл fa8b1592c9cda268d8affb6bceb7a120. Ее суть заключается в том, что в манифест добавляются очень длинные строки, которые используются в качестве названий для пространств имен в XML.
Манифесты с такими строками становятся нечитаемыми как для человека, так и для программ, которым может не хватить памяти для их обработки. При этом пространства имен полностью игнорируются парсером манифестов самой ОС, в результате чего манифест обрабатывается без ошибок.
Что скрывается за обфускацией: функциональность SoumniBot
При запуске приложение запрашивает с сервера, адрес которого представлен константой в коде, конфигурацию с двумя параметрами — mainsite и mqtt.
Оба параметра представляют собой адреса серверов, необходимые для корректной работы зловреда. Сервер mainsite служит для отправки собранных данных, mqtt — для обмена сообщениями по протоколу MQTT и используется преимущественно для получения команд. Если исходный сервер по какой-то причине не предоставил эти параметры, приложение использует адреса по умолчанию, которые также содержатся в его коде.
После запроса параметров запускается вредоносный сервис. Если он не сможет запуститься или по какой-то причине перестанет работать, то будет повторять попытку с периодичностью раз в 16 минут. При первом запуске троянец скрывает иконку приложения, усложняя его удаление, после чего в фоновом режиме раз в 15 секунд загружает на сервер mainsite данные с устройства жертвы: IP-адрес, страну, вычисленную на основе IP, списки контактов и аккаунтов, сообщения SMS и MMS, а также ID жертвы, сгенерированный с помощью библиотеки trustdevice-android. Помимо этого, троянец подписывается на получение сообщений от MQTT-сервера, откуда приходят команды, описанные ниже.
Номер | Описание | Параметры |
0 | Отправка информации о зараженном устройстве (номер телефона, оператор сотовой связи и др.), а также версии троянца, после чего следует отправка всех SMS, контактов, аккаунтов, фото, видео жертвы, а также цифровых сертификатов для онлайн-банкинга | – |
1 | Отправка списка контактов жертвы | – |
2 | Удаление контакта на устройстве жертвы | data — имя контакта, который необходимо удалить |
3 | Отправка SMS и MMS жертвы | – |
4 | Отладочная команда, вместо которой, скорее всего, в новой версии добавится функциональность отправки журнала звонков | – |
5 | Отправка фото и видео жертвы | – |
8 | Отправка SMS | data — 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-архив и отправляется на командный сервер. Эти файлы — цифровые сертификаты клиентов корейских банков, которые используются, например, для входа в онлайн-банкинг или подтверждения банковских операций. Такая техника очень редко применяется в мобильных банковских троянцах. Защитные решения «Лаборатории Касперского» обнаруживают SoumniBot, несмотря на его изощренные методы обфускации, и присваивают ему вердикт Trojan-Banker.AndroidOS.SoumniBot.
Заключение
Создатели вредоносного ПО стремятся заразить как можно больше устройств, оставаясь при этом незамеченными. Это побуждает их исследовать новые способы затруднения обнаружения. К сожалению, благодаря недостаточно строгим проверкам в коде парсера манифестов в ОС Android изыскания разработчиков SoumniBot увенчались успехом.
Мы рассказали о приемах троянца, чтобы исследователи по всему миру были осведомлены об этих тактиках, которые могут со временем перенять и другие зловреды. Помимо нестандартной обфускации, SoumniBot отличается тем, что похищает ключи корейских приложений для онлайн банкинга. Эта функциональность очень редко встречается среди банковских зловредов для Android. Она позволяет злоумышленникам опустошать кошельки жертв без их ведома и преодолевать различные способы аутентификации банков. Чтобы не стать жертвой такого зловреда, мы рекомендуем использовать надежное защитное решение на вашем смартфоне, которое обнаружит вредоносное ПО и предотвратит его установку, несмотря на все его хитрые уловки.
Индикаторы компрометации
MD5
0318b7b906e9a34427bf6bbcf64b6fc8
00aa9900205771b8c9e7927153b77cf2
b456430b4ed0879271e6164a7c0e4f6e
fa8b1592c9cda268d8affb6bceb7a120
C&C
https[://]google.kt9[.]site
https[://]dbdb.addea.workers[.]dev
SoumniBot: уникальные техники нового банкера для Android