JustPaste.it

Хакер - Android malware по-взрослому. Самые популярные вирусные техники 2017 года

nopaywall

https://t.me/nopaywall

С каждым годом пользователям мобильных устройств становится все сложнее избежать заражения. За первое полугодие «Лаборатория Касперского» с помощью своего антивируса зафиксировала (читай: не дала установить) более 3 миллионов вредоносных приложений. И хотя статистически по сравнению с 2016 годом особого роста нет, отчетов о мобильных зловредах стало гораздо больше. После прочтения таких отчетов не остается ощущения «мыльного пузыря», проблема действительно есть: без использования каких-либо уникальных техник людям удается сколачивать миллионные ботнеты.
warning-icon.jpg

WARNING

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

 

Источник эпидемии

Кстати, а откуда вообще берется андроид-ориентированная малварь? Наверное, из пиратских программ? С пиратских дискет? С пиратских компакт-дисков? Нет, погоди-ка, ведь сейчас у нас не 1997 год, а целый 2017-й… наверное, с подпольных репозиториев? Ан нет, оказывается, самый популярный репозиторий мобильных приложений, Google Play, серьезно подпортил свою репутацию — в 2017 году все самые успешные мобильные трояны и вирусы распространялись через него. Похоже, проблема в слишком богатом выборе для пользователя. На любой запрос найдется несколько десятков приложений, и большинство из них будет мусором.

Малоинформативные и подозрительные отзывы Малоинформативные и подозрительные отзывы

Даже если внимательно изучать описание приложения, до его установки все равно трудно понять, что именно оно делает. Опираться на опыт других пользователей тоже не получается — в Google Play очень много приложений с купленными отзывами. Как ты понимаешь, стоит один раз запустить троян и потом будет очень сложно от него избавиться. А если же у трояна будет еще и полезная нагрузка, то простому пользователю вычислить наличие вредоносного контента практически невозможно.

info-icon.jpg

INFO

Прошлогодняя статья «Анатомия Android-малвари» во многом еще актуальна.

 

Где я?

Эффективность трояна во многом зависит от того, насколько хорошо он умеет адаптироваться под разные устройства. Начинать приходится с малого — определения версии ОС на устройстве жертвы, эта информация есть в классе Build.

Build.VERSION.SDK_INT

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

public static String fullSystemProperties() { java.lang.Process p = Runtime.getRuntime().exec("getprop"); input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); while (input.readLine()!=null) { line = line + "n" + input.readLine(); } ...

Вызов getprop даст много информации, можно отбросить часть с помощью grep (более подробные исходники смотри здесь).

Довольно часто «продвинутый пользователь» получает права суперпользователя в системе. Рут открывает не только расширенные возможности для юзера, но и раздолье для трояна. Стратегий определения наличия прав на устройстве много. Самое простое — пройтись по директориям в поисках бинарника su. Вот примерный набор подходящих для него путей:

String[] places = { "/sbin/", "/system/bin/", "/system/xbin/", "/data/local/xbin/", "/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/" };

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

for (String where : places) { if (new File(where + su”).exists()) { found = true; break; } }

Если троян сможет внедриться в пространство других приложений, то пользователя спасет только полная переустановка ОС. Root-права позволяют инжектить в системные вызовы, вставляя вредоносный код в самые неожиданные места. Для таких «хуков» есть готовые фреймворки, более подробно можешь посмотреть в нашей статье про Xposed.

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

 

Старая уязвимость лучше новых двух

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

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

GmBot сделан очень качественно, и неудивительно, что появилась целая плеяда малвари, основанной на выложенном исходном коде. Один из наиболее успешных охотников за старыми устройствами — троян CopyCat. По статистике Check Point, у него 14 миллионов заражений и на восьми миллионах из них получен root-доступ. При этом CopyCat не использовал никаких секретных эксплоитов — сплошной паблик. К примеру, вот один из них на GitHub.

 

Гоним рекламу

Согласно статистике, в этом году наибольший рост показали так называемые Adware — вирусы, зарабатывающие на демонстрации рекламы пользователю. Летом в Google Play была обнаружена корейская малварь Judy: для ее распространения создали более сорока приложений, каждое из которых пользовалось большим успехом — миллионы загрузок и активных пользователей.

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

Притягательная игра с плохим содержимым Притягательная игра с плохим содержимым

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

HttpURLConnection connection = null; URL url = new URL(ccUrl); connection = (HttpURLConnection) url.openConnection(); connection.connect(); InputStream input = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(input)); String inputLine; while ((inputLine = br.readLine()) != null) {output.append(inputLine);} ... String webPageContent = output.toString();

На загруженной странице открывались не все ссылки подряд, а только рекламные. Для парсинга строк есть класс Pattern, полностью повторяющий синтаксис регулярных выражений языка Perl. Поначалу это похоже на мешанину, а потом разбираешься и парсинг идет на ура. У партнерки будут какие-то общие признаки — один домен, реферер и так далее. Вот такой регуляркой вытаскиваются все ссылки на поддомены google.com:

Pattern urlFinder = Pattern.compile("https://w+.google.com/w+"); Matcher matcher = urlFinder.matcher(test); List<String> links = new ArrayList<>(); while (matcher.find()) { links.add(webPageContent.substring(matcher.start(), matcher.end())); }

Хозяева рекламной площадки не должны знать, что баннеры загружаются в автоматическом режиме, значит, нужно открывать ссылки настоящим браузером. Это несложно, в Android есть класс WebView — полноценный браузер на движке Chrome. Любопытно, что, открывая страницу, малварь мимикрировала под полноценный компьютер — видимо, для таких переходов стоимость клика выше.

webView.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
 

Банковская тайна

Второй год в интернете успешно распространяется троян BankBot. Создатели модифицируют его раз за разом, маскируясь от антивирусов и заманивая пользователей простенькой игрой или подборкой юмористического контента. Как ты уже догадался, вредоносный контент публиковался в Google Play, последняя версия BankBot была выловлена в конце сентября.

Для управления чужим телефоном авторы трояна решили не связываться с эксплоитом и просто настойчиво просят об этом пользователя. В данном случае приложение пытается получить доступ ко всему, к чему можно, — от чтения окон до эмуляции нажатий. Забавно, что злоумышленники вовсю эксплуатируют социальную инженерию, без всякой ложной скромности назвав свое поделие Google Service. Пользователя убеждают, что какая-то очень важная функция не будет работать без его вмешательства.

Неправильный Google Service Неправильный Google Service

Мы уже не раз писали про волшебную силу AccessibilityService. Как видишь, некоторым она даже помогает финансово. ? Злоумышленники также нещадно эксплуатируют возможностисистемных окон, не позволяя пользователю что-либо сделать в телефоне, в то время как троян устанавливает дополнительные модули и меняет настройки телефона.

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); final WindowManager.LayoutParams params = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); wm.addView(mOverlay, params);

Любопытно, что Google наконец-то отреагировала на проблему и пометила флаг TYPE_SYSTEM_ALERT как устаревший (depticated) — это означает, что в новых версиях API он будет исключен вообще. Начиная c Android Oreo (это 8-я версия ОС, вышла в августе) вводится флаг TYPE_APPLICATION_OVERLAY, который не закрывает меню и системные уведомления.

 

Маскировка вредоноса

Как же все-таки вирусы попадают в Google Market? Все же в этой компании трудятся лучшие умы планеты, разработавшие много крутых продуктов… Все довольно просто: чаще всего такие приложения при загрузке в этот репозиторий вообще не имеют вредоносной функциональности.

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

Если ты никогда раньше не писал свои библиотеки, то знай, что делается это не сложнее обычного продукта. Для начала создаем пустой проект — empty Activity. К созданному проекту добавляем новый модуль (File → New → New module). Тут есть два варианта библиотеки: Android или Java, если у тебя будет какой-то академический код, не связанный с Android SDK. В эту библиотеку нужно поместить все, что может хоть как-то показаться подозрительным, этот код в Google Play не попадет.

Создание модуля в Android Studio Создание модуля в Android Studio

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

public String getInfo(Context ctx){ ... return "Data is: " + somedata; }

Написанный код нужно будет собрать в единый JAR-файл. Сделать это можно разными способами, проще всего через Gradle. По умолчанию такая конвертация не идет, в конфиг (файл build.gradle для созданного модуля) нужно добавить вот такие строки:

task makejar(type: Jar, dependsOn: 'assembleRelease') { from fileTree(dir: 'build/intermediates/classes/release') }

Gradle умеет много чего, для него есть отдельная панель справа в IDE. Там есть много вариантов компиляции, к ним должен добавиться еще вариант makejar, который мы только что создали.

Генерация JAR через Gradle Генерация JAR через Gradle

Теперь сконвертируем библиотеку в dex-файл — это особым образом собранный java-код, подходящий для исполнения виртуальной машиной Dalvik и ее наследником ART, которые отвечают за запуск приложений в Android. Для такой конвертации в стандартном SDK есть компилятор dx.

/.../Android/Sdk/build-tools/версия_Sdk/dx --dex --output="/path/xakep.dex" "/path/xakep.jar"

Конечно, динамическая загрузка модулей — это не изобретение вирусописателей, такая схема вполне легальна и используется повсеместно. Эту возможность Google добавила очень давно, еще в 2011 году. Главная причина такого решения — ограничение на количество методов, используемых в приложении, их не может быть больше 65 тысяч.

Кроме того, удобнее разбить приложение на несколько составляющих — бинарный файл размером в несколько гигабайтов совершенно неудобно распространять. Ты мог заметить, что большинство игр под мобильные платформы выкладываются в Google Play только в виде базового лаунчера, остальное пользователь скачивает напрямую с сервера разработчиков.

Для подгрузки таких модулей создан класс DexClassLoader. У него доступен только конструктор, который всю работу и выполняет.

new DexClassLoader(pathToDex, internalStorage, null, classLoaderInstance);

В качестве аргумента у него пути к dex-файлу pathToDex и внутреннему хранилищу internalStorage, путь к дополнительным библиотекам (не нужны) и экземпляр класса ClassLoader. Но прежде чем подгружать библиотеку, ее нужно скачать и разместить во внутренней памяти, она может быть прочитана только оттуда. Но тут никакой магии не нужно — хватит классов AsyncTask и HttpURLConnection.

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

Class<?> wordClass = dexClassLoader.loadClass("xakep.com.mylibrary.LibraryClass"); Class<?>[] args = new Class[1]; args[0] = Context.class; Method libMethod = wordClass.getDeclaredMethod("getInfo", args); String libMethod = (String) libMethod.invoke(wordClass.newInstance(), this);

Тем, кто до этого с проблемой не сталкивался, происходящее будет малопонятно, и таким читателям помогут исходники готового проекта.

 

PlayProtect, или костыль от Google

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

Компания Google решила, что ей следует начать еще больше контролировать устройства пользователей, и выпустила продукт под названием Play Protect, который в русском варианте звучит как «Play защита». Похоже, это обычный мобильный антивирус с интересным лозунгом «Спокойствие у вас на ладони» (да, лозунг выглядит как пропаганда онанизма, это вообще легально? — Прим. ред.).

Я защищен, ура! Я защищен, ура!

Устанавливать его не нужно, он уже встроен в пакет Google Play Service, найти его можно в меню приложения Play Market. На рынке мобильных антивирусов у специалистов Google серьезное преимущество — им раньше других доступны для анализа все приложения из Google Play, и при условии оптимизации бизнес-процессов вирусы они будут находить первыми.

Как ты мог заметить из отчетов, троян может активно распространяться несколько лет и только затем попасть в антивирусные базы. На практике это означает, что зловред, особенно если он не заражает все подряд и распространен на тысяче-двух устройств, в антивирусных базах окажется очень нескоро. Надеяться на антивирус как панацею я бы не стал, нужно продолжать держать голову светлой и не искать в Google Play халявы или глупых развлечений — именно такие люди составляют целевую аудиторию троянов.

 

Строим прогнозы

Как и ожидалось, с ростом пользователей количество угроз тоже увеличивается. Наверное, нужно ждать, что Google введет какие-то новшества в своем репозитории, слишком уж много там мусора. Отмечу, что экосистема Apple выглядит гораздо лучше — массовых заражений нет, украсть данные гораздо сложнее.

Есть и хорошие новости: в Android-мире доля старых устройств быстро падает, к октябрю ОС KitKat (4.4) и старее уже занимают менее 20% рынка. Если контроль над качеством кода не ослабнет, то следующий год будет спокойней — серьезные уязвимости появляются редко, и главной проблемой становится человеческий фактор.

Ну а наш журнал будет все так же держать тебя в курсе происходящего — естественно, чтобы ты применял эти знания только во благо. Если я что-то упустил или есть вопросы, обязательно пиши. Удачи!

Читайте ещё больше платных статей бесплатно: https://t.me/nopaywall