Авторы распространенного вредоносного ПО нередко прибегают к различным средствам защиты кода от обнаружения и анализа.
Зловреды для Android — не исключение. Среди злоумышленников, атакующих мобильные устройства, очень популярны, например, дропперы, такие как Badpack и Hqwar, цель которых — скрытно доставить на смартфон банковский троянец или шпионское ПО. Однако недавно мы нашли новый банкер SoumniBot, нацеленный на корейских пользователей, который отличается нестандартным подходом к защите от анализа и обнаружения, а именно — обфускацией манифеста Android.
Скорее всего, именно это побудило разработчиков SoumniBot исследовать особенности обработки манифестов в Android, что позволило им найти несколько интересных возможностей для обфускации APK.
Алгоритм распаковки файлов из libziparchive
Однако для распаковки AndroidManifest.xml разработчики Android решили не использовать эту функцию, реализовав альтернативный сценарий, в котором проверка значения поля Compression method выполняется некорректно.
Код для извлечения манифестов в Android
Если APK при распаковке манифеста встречает любое значение поля Compression method, отличное от 0x0008 (DEFLATED), то файл считается несжатым. Это позволяет разработчикам приложений указывать любое значение поля Compression method, отличное от 8, при этом записывая данные в несжатом виде. Такой манифест будет невалидным для любого распаковщика, в котором проверка метода сжатия реализована корректно, но парсер APK из фреймворка Android его распознает, и приложение установится. На рисунке ниже приведен пример исполнения этой техники в файле
Неверное значение поля Compression method, за которым следуют несжатые данные
Вредоносное приложение этим пользуется: указанный в нем размер манифеста в архиве превышает его реальный размер, в результате чего в распакованный манифест добавляется оверлей с частью содержимого самого архива. Более строгие парсеры манифестов не смогут прочитать такой файл, однако парсер манифестов Android обрабатывает некорректный манифест без ошибок.
Указанный размер манифеста гораздо больше, чем на самом деле
Стоит отметить, что, хотя такие файлы считаются валидными на реальных устройствах, с ними не справляется
Очень длинные строки в манифесте…
…которые используются в качестве названий пространств имен
Манифесты с такими строками становятся нечитаемыми как для человека, так и для программ, которым может не хватить памяти для их обработки. При этом пространства имен полностью игнорируются парсером манифестов самой ОС, в результате чего манифест обрабатывается без ошибок.
Запрос параметров
Оба параметра представляют собой адреса серверов, необходимые для корректной работы зловреда. Сервер mainsite служит для отправки собранных данных, mqtt — для обмена сообщениями по протоколу MQTT и используется преимущественно для получения команд. Если исходный сервер по какой-то причине не предоставил эти параметры, приложение использует адреса по умолчанию, которые также содержатся в его коде.
После запроса параметров запускается вредоносный сервис. Если он не сможет запуститься или по какой-то причине перестанет работать, то будет повторять попытку с периодичностью раз в 16 минут. При первом запуске троянец скрывает иконку приложения, усложняя его удаление, после чего в фоновом режиме раз в 15 секунд загружает на сервер mainsite данные с устройства жертвы: IP-адрес, страну, вычисленную на основе IP, списки контактов и аккаунтов, сообщения SMS и MMS, а также ID жертвы, сгенерированный с помощью библиотеки
Помимо этого, троянец подписывается на получение сообщений от MQTT-сервера, откуда приходят команды, описанные ниже.
Отдельного внимания заслуживает команда с номером 0. Эта команда, среди прочего, ищет файлы c расширениями .key и .der на внешнем хранилище устройства, которые содержат в пути /NPKI/yessign.
Если приложение находит такие файлы, то директория, в которой они расположены, помещается в ZIP-архив и отправляется на командный сервер. Эти файлы — цифровые сертификаты клиентов корейских банков, которые используются, например, для входа в онлайн-банкинг или подтверждения банковских операций. Такая техника очень редко применяется в мобильных банковских троянцах.
Мы рассказали о приемах троянца, чтобы исследователи по всему миру были осведомлены об этих тактиках, которые могут со временем перенять и другие зловреды. Помимо нестандартной обфускации, SoumniBot отличается тем, что похищает ключи корейских приложений для онлайн банкинга. Эта функциональность очень редко встречается среди банковских зловредов для Android.
Она позволяет злоумышленникам опустошать кошельки жертв без их ведома и преодолевать различные способы аутентификации банков. Чтобы не стать жертвой такого зловреда, мы рекомендуем использовать надежное защитное решение на вашем смартфоне, которое обнаружит вредоносное ПО и предотвратит его установку, несмотря на все его хитрые уловки.
Зловреды для 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) — при других значениях возвращается ошибка.
Для просмотра ссылки необходимо нажать
Вход или Регистрация
Алгоритм распаковки файлов из 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 | Отправка 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-архив и отправляется на командный сервер. Эти файлы — цифровые сертификаты клиентов корейских банков, которые используются, например, для входа в онлайн-банкинг или подтверждения банковских операций. Такая техника очень редко применяется в мобильных банковских троянцах.
Заключение
Создатели вредоносного ПО стремятся заразить как можно больше устройств, оставаясь при этом незамеченными. Это побуждает их исследовать новые способы затруднения обнаружения. К сожалению, благодаря недостаточно строгим проверкам в коде парсера манифестов в ОС Android изыскания разработчиков SoumniBot увенчались успехом.Мы рассказали о приемах троянца, чтобы исследователи по всему миру были осведомлены об этих тактиках, которые могут со временем перенять и другие зловреды. Помимо нестандартной обфускации, SoumniBot отличается тем, что похищает ключи корейских приложений для онлайн банкинга. Эта функциональность очень редко встречается среди банковских зловредов для Android.
Она позволяет злоумышленникам опустошать кошельки жертв без их ведома и преодолевать различные способы аутентификации банков. Чтобы не стать жертвой такого зловреда, мы рекомендуем использовать надежное защитное решение на вашем смартфоне, которое обнаружит вредоносное ПО и предотвратит его установку, несмотря на все его хитрые уловки.
Для просмотра ссылки необходимо нажать
Вход или Регистрация