Разработчик
0,1
рейтинг
5 октября 2014 в 12:38

Разработка → Троян в highscreen, или как телефон начал творить чудеса

Добрый день, Хабр!
Хочу поведать вам историю, которая чуть не спровоцировала поседение моей, еще молодой, головы.
Предыстория
Все началось с того, что я приобрел себе Highscreen Omega Prime S пару месяцев назад, был доволен как слон, никак не мог нарадоваться этому чудесному аппарату, который работал шустро и почти без нареканий. И все бы было отлично, если бы я однажды не увидел кучу нотификаций, которые выглядели как-то так:


И я уж начал думать — что же это такое, откуда оно взялось, может быть, мой телефон сломали, но как?! Но через несколько секунд паника стихла, я зажал одно из уведомлений, выбрал пункт «Информация о приложении», и был очень удивлен, увидев то, что уведомления вывело приложение «Обновление ПО»…

Еще больше меня удивило то, что этому приложению требуются разрешения для отправки SMS, определения местоположения, установка шорткатов и спаривание с Bluetooth устройствами.
Полный список разрешений
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="com.android.vending.BILLING"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.REBOOT"/>


Пока я думал, как бы мне избавиться от этого приложения, скачивал утилиту для рутования и просто размышлял о том, как такое вообще возможно — у меня появилось штук 5 шотркатов (точнее, я заметил их наличие, вероятно, они появились вместе с нотификациями):


Я сразу же утащил APK файл с телефона, разобрал его на составляющие части с помощью утилит apktool, dex2jar и jd-gui — и приступил к изучению.

Изучение

Изучение началось с анализа AndroidManifest.xml, и второе, что меня смутило в нём — это наличие сервисов и ресиверов, находящихся внутри пакета com.gmobi.trade (при том, что само приложение в com.redbend.dmClient).
Перечень сервисов и ресиверов
<activity android:name="com.gmobi.trade.ActionActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
<service android:name="com.gmobi.trade.ActionService"/>
<receiver android:enabled="true" android:name="com.gmobi.trade.ActionMonitor">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED"/>
        <action android:name="android.intent.action.PACKAGE_REPLACED"/>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <data android:scheme="package"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>


И тут виден очень подозрительный ресивер — зачем приложению, которое обновляет систему, отслеживать добавление/удаление приложений? А также при беглом просмотре кода было обнаружено то, что ActionMonitor запускает ActionService, который в свою очередь запускает TradeService, который же, в свою очередь, запускает что-то неведомое и обфусцированное. К сожалению, большинство кода, который мне выдал jd-gui, не поддается анализу на трезвую голову.

SMS

Да, и код для отправки SMS в этом приложении имеется: откуда-то приходит JSON, из которого создается AlertDialog, и в обработчике нажатия positive button происходит отправка SMS. Радует что хотя бы не в фоне это происходит. Но все равно неясно, зачем утилите для обновления ПО вообще отправлять куда-то SMS-сообщения.
Код отправки SMS
AlertDialog.Builder localBuilder2 = new AlertDialog.Builder(this);
localBuilder2.setTitle(str14);
localBuilder2.setMessage(str15);
localBuilder2.setPositiveButton(str16, new DialogInterface.OnClickListener(locallqe, str1, str19, str18, localNotificationManager, i) {
    public final void onClick(DialogInterface paramDialogInterface, int paramInt) {
        b.b(c, 3);
        SmsManager localSmsManager = SmsManager.getDefault();
        dfe.a("Sending [" + d + "] to [" + e + "]");
        localSmsManager.sendTextMessage(e, null, d, null, null);
        f.cancel(g);
        finish();
        b.b(c, 5);
    }
});
localBuilder2.setNegativeButton(str17, new DialogInterface.OnClickListener(locallqe, str1) {
    public final void onClick(DialogInterface paramDialogInterface, int paramInt) {
        b.b(c, 4);
        finish();
    }
});
localBuilder2.setCancelable(false);
localBuilder2.create().show();



Bluetooth, геокоординаты и прочее

Тут все более-менее безопасно. Ну, как “безопасно”… приложение всего лишь получает MAC-адрес bt-адаптера, получает геокоординаты, проверяет, включен ли Wi-Fi, получает MAC-адрес wifi-адаптера и отправляет эти данные в неизвестность :)
Код сбора информации
public final JSONObject f() {
    JSONObject localJSONObject1 = new JSONObject();
    try {
        localJSONObject1.put("sdk", "go2sync");
        localJSONObject1.put("sdk_v", "1.2");
        localJSONObject1.put("sdk_b", "2014.03.06.1");
        localJSONObject1.put("app", a.getPackageName());
        localJSONObject1.put("ch", t);
        localJSONObject1.put("app_v", opt.e(a));
        localJSONObject1.put("imsi", q.j);
        localJSONObject1.put("imei", q.k);
        localJSONObject1.put("wifi", k);
        localJSONObject1.put("gprs", l);
        localJSONObject1.put("brand", g());
        localJSONObject1.put("sd", opt.c());
        localJSONObject1.put("id", c());
        azw.lqe.azw localazw = opt.c(a);
        StringBuilder localStringBuilder = new StringBuilder("ua:")
                .append(opt.a(false))
                .append("|imei:")
                .append(localazw.a())
                .append("|imsi:")
                .append(localazw.b())
                .append("|wmac:")
                .append(opt.b(a))
                .append("|bmac:");
        localJSONObject1.put("cid", opt.a(opt.a() + "|sn:" + opt.a(a)))
        localJSONObject1.put("ua", opt.a(false));
        localJSONObject1.put("os", "android");
        localJSONObject1.put("os_v", opt.b());
        localJSONObject1.put("lang", Locale.getDefault().getLanguage())
        localJSONObject1.put("country", opt.h(a));
        localJSONObject1.put("gp", q.n);
        localJSONObject1.put("wmac", opt.b(a));
        localJSONObject1.put("bmac", opt.a());
        localJSONObject1.put("sn", opt.a(a));
        localJSONObject1.put("sa", opt.g(a));
        localJSONObject1.put("sw", opt.j(a));
        localJSONObject1.put("sh", opt.k(a));
        Location localLocation = opt.f(a);
        if (localLocation != null) {
            JSONObject localJSONObject2 = new JSONObject();
            localJSONObject2.put("lng", localLocation.getLongitude());
            localJSONObject2.put("lat", localLocation.getLatitude());
            localJSONObject1.put("loc", localJSONObject2);
        }
        localJSONObject1.put("roaming", opt.o(a));
        return localJSONObject1;
    } catch (JSONException localJSONException) {
        dfe.a(localJSONException);
    }
    return localJSONObject1;
}



Итоги

Телефон пришлось рутануть, чтобы удалить это приложение. Как обновлять теперь систему — неизвестно.

P.S.

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

UPD1: Virustotal — www.virustotal.com/ru/file/108299c363e361d85b8e34676806373c7e445ae6731b3f3400d77cf947550b6c/analysis/1412500174

UPD2: Как оказалось, highscreen признал проблему, сославшись на то, что это ошибка GMobi. Ссылка: highscreen.org/babltrabl
Но только есть одно НО: highscreen сослался на FOTA-провайдера, но на мой девайс через OTA не прилетало еще ни одного обновления.
Спасибо Peyt за информацию!
Виктор Супрун @POPSuL
карма
36,2
рейтинг 0,1
Разработчик
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

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

  • +1
    Аналогичная история у меня была с Fly Era sytle 3
  • +2
    Подтверждаю, на Highscreen Boost II SE тоже вылезло уведомление. Только линк другой был. Но я даже идти по нему не стал, а сразу убрал уведомление. Посему ничего не установилось.
  • 0
    Результаты с Virustotal или хэш семпла есть?
    • +2
      Да, есть.

      SHA256: 108299c363e361d85b8e34676806373c7e445ae6731b3f3400d77cf947550b6c
      Имя файла: DMClient.apk
      Показатель выявления: 0 / 54

      Ну и два минуса кто-то поставил уже для этого файла.
  • +2
    Аналогичная ситуация на Highscreen Boost II SE, так же много думал. Обновил прошивку отсюда support.highscreen.org/index.php?/Knowledgebase/Article/View/144/89/bet-versija-obnovlenija-24-dlja-highscreen-boost-2se — вроде, пропали левые уведомления…
    • +1
      К сожалению, девайс у меня еще очень молодой (выпустили его только в июле этого года), поэтому, для него еще нет никаких обновлений. Даже на 4pda не так давно появилось обсуждение этого девайса.
    • +2
      У меня несколько дней назад тоже на Boost II SE такая же история случилась. Причём, обновления ставил только официальные, и с июля месяца сидел на прошивке 2.7 (её потом убрали из-за того, что телефоны уходили на ней в ребут с синим экраном). Пришлось рутовать апаарат, заодно перепрошился на официальную же 2.4 (батарею гораздо дольше на ней держит) и удалил это приложение вообще. Причём, на 2.4 у приложения тоже были слишком большие права почему-то.
  • +1
    Omega Prime Mini SE
    У девушки такая же ситуация. Там правда все усложняется тем, что рутануть не получилось никак.
    • +2
      Рутовал по этому мануалу 4pda.ru/forum/index.php?showtopic=601622&st=0#entry34511537
      Не сразу (кликал не ту кнопку), но рутанул.
      • 0
        VRoot я пробовал. Не может в перезагрузку. Пытается восстановить из контейнера резервной копи на теле и выдает на пк ошибку о невозможности рутирования.
  • 0
    Ну хоть ситуацию прояснили, а то я все думал где же вляпался и во что.
    • 0
      Судя по сообщениям выше — это, скорее бекдор, оставленный нанятым программистом, или же просто банальный взлом серверов OTA. Судя по исходникам похоже скорее на первое.
      • 0
        У меня есть подозрение, что эту утилиту писали ребята из www.redbend.com/ судя по тому, что основной пакет com.redbend в этом приложении, и скорее всего, они же и оставили там эту гадость.
        И вот неизвестно, к кому и куда обращаться по поводу этого трояна. Либо в highscreen, либо в redbend, либо еще куда-нибудь…
        • +1
          Разумеется, спрашивать надо с производителя, который вам предоставляет конечный продукт. Их подрядчики и наемники вас не касаются.
  • +1
    Когда хотел маме zera f от highscreen купить мне его продавать отказались. Сказали, что партия какая-то левая пришла и они с этим разбираются. Потом на форумах прочитал, что они каким-то трояном заражены были.
  • 0
    Это оператор fota highscreen накосячил highscreen.org/babltrabl/
    • +5
      Это они так говорят :)
    • 0
      Спасибо за информацию, добавил в конец статьи.
  • +1
    highscreen zeraf такая же история, думал из за утилит для печати которые я ставил с маркета, оказалось вот оно что =(,
    • 0
      у меня тоже zeraf, началась такая же ерунда несколько дней назад. Это мой второй хайскрин, и больше никогда, нет, вернее так, НИКОГДА не куплю эту марку, и не только из-за этой проблемы, есть косяки с тачем.
  • +8
    Зато не гнутся.
    • +2
      Боюсь что Prime S сломается сразу же. Он тонкий и легкий. С батарейкой вроде 100 грамм весит :)
  • +4
    Это второй троян в Highscreen.
    У меня в моем (в стандартной прошивке) был другой, который SMS на иностранный номер отправлял.

    На 4pda сразу закреплена инструкция, как его удалять.

    После вот таких вот финтов пропало совсем желание покупать российскую (highscreen — российская фирма) технику.
    Я лучше поддержу США, Корею или Китай, производители из которых пользователя за лоха не держат.
    • +1
      Не поделитесь ли линком на инструкцию? А то что-то не встречал ее.
      • +3
        Скорее всего речь идет о трояне в Highscreen Zera F, информация тут.
        Вообще в случае с китайфонами такое бывает достаточно часто, причем не обязательно на Android. Помню был у меня какой-то запасной китайфон на MTK, который отсылал сообщение на русский платный номер (т.е. при запуске игры в фоне отсылалось 3 смски по 150 руб каждая).

        Кстати, мой LG P880 тоже при первом включении отсылает SMS с IMEI и еще какой-то информацией на какой-то европейский номер. Правда он об этом предупреждает, но номер платный (не слишком дорогой, рублей 30 снимают), а об этом в предупреждении ни слова.
      • 0
        4pda.ru/forum/index.php?showtopic=555057&st=540#entry30277330

        Vilgelm Это не совсем китайфон. Highscreen — российский производитель.
        • +2
          Они сами разрабатывают железо\прошивки, или просто покупают noname\OEM китайские устройства и продают их под своим брендом?
          Вообще я сталкивался с устройствами Highscreen и они мне понравились (как раз просили удалить smssecurity.apk), но в такие тонкости не вникал.
          • 0
            Железки делают китайцы, андроид ванильный.
            То, что в ванильный андроид встроены трояны, и причем только у этого производителя — понятно чья вина.
            • +2
              Ну тогда это такой же российский производитель, как и Explay, например. Если китайцы сами разрабатывают железки и драйвера.
              • +1
                Да, как Explay, Digma, teXet и т.д.

                Важно понимать, что задают рамки характеристик и контролируют качество именно эти заказчики.
          • +3
            Через своих обзорщиков хайскрин утверждают что всё разрабатывают сами club.dns-shop.ru/IAA-MR/blog/Highscreen-Zera-F-когда-смартфон-делают-русские-Видеообзор/
            Но одновременно с выходом на российский рынок (или чуть раньше), обычно появляются аналоги в других странах третьего мира. Также странно обилие иероглифов в глубине прошивок, даже трояны китайские.
            • +6
              Теоретически появление схожих моделей у китайцев ничего не доказывает, т.к. китайцы очень любят все копировать. Но вот количество иероглифов явно говорит о китайском происхождении прошивки, а наличие троянов о том, что сама компания даже не проверяет что ей китайцы поставили.
            • –7
              Так и есть, но у нас нет возможности проверять все на этапе обновления, хитрый китаес может подсунуть в последний момент любую гадость. Но заметьте из всех компаний только мы признали эту ошибку:)
              • +3
                Не думаете сменить поставщика прошивок на такого, кому можно доверять?
                Или начать проверять обновления — хотя бы на наличие ТАКОГО
                • –4
                  Мы проверяем все обновления, этот косяк именно от провайдера fota gmobi
                  • +4
                    В прошивке 2.4 для Boost II SE свежескачнной и установленной с вашего сайта у приложения «Обновление ПО» уже были права на отправку платных СМС, получение координат, доступ к контактам и управлению учётными записями. Пришлось рутоваться и удалять насильно эту штуку.
                    Кстати, ни Др.Веб, ни Касперский вообще на зловред не реагировали, а всякие уведомления с иероглифами и BrendonsURL прога показывала.

                    Но сам аппарат отличный, пользуюсь с февраля (до последнего времени аппаратат не рутовал, проблем со зловредным ПО не было). И замечательное соотношение качество/цена.
                    Вам нужно выпускать побольше аппаратов с ёмкими батареями — это киллерфича прям. 3000-ый аккумулятор вообще не использую, хожу исключительно с 6000-ком.
                    • 0
                      … И продавать ещё и кобуру для толстого телефона.
                  • +3
                    У меня так же как и UMAX, через OTA обновлений не было. Девайс продавался (можно читать как «поставлялся в магазины») уже с трояном.
                    Предполагаю что этот «обновлятор ПО» живет в системах пользователей не менее полугода, а вы его только что заметили. :)
        • +1
          Надо будет проверить у себя еще остальные пакеты на наличие подобных гадостей. Спасибо!
        • +2
          Это китайфон чистой воды. Платформа Innos. Загуглите Innos D10, отличие от Boost 2 SE только в надписи Highscreen.
          • +3
            Ну собственно первый буст это тоже Innos D9, а вот делал картинку: image
            Ну стоит отметить что Boost разогнан и у него два микрофона в остальном собственно тоже самое. На платах везде Innos D9, а вот на наклейках платы DNS написано. А так писал уже Highscreen — это тот же китай (о качестве), разве что сервис (качество которого сомнительно, а цены вообще невменяемые — речь о ремонте и замене) в России и купить чуть проще.
    • +2
      Это вообще, по-моему, троян от MTK. По крайней мере, я его даже за ZTE видел.
      • +1
        Видел тоже самое на своём Fly (проц MTK6582), но решил, что это из-за программы, которой я рут получал.
  • +11
    Highscreen изначально крайне сомнительная контора, которая активно пиарилась через спам-агенство рожковой. Не проще купить какой one+?
    • 0
      Как только какой one+ заимеет батарейку, живущую дольше чем полдня и будет стоит 300 баксов, а не 600 — я задумаюсь.
      • +1
        Вы будете удивлены — oneplus.net/one#specifications
        • +3
          Не понял, пардон, показалось, вы о HTC One. Об этом One+ не знал, спасибо
      • +3
        Oneplus one. Обычно вот так:
    • +1
      Да, были мысли взять OnePlus One, но т.к. телефон покупался в срочном порядке (предыдущий уничтожил, и срочно нужен был новый), поэтому взял более дешевый аппарат. Да и в наличии OnePlus One в моем регионе нет.
      Сейчас жду свежий nexus :)
  • +1
    У меня Boost первый. С версии 2.8 появилось приложение DMClient.apk. Провел его анализ и написал на C# приложение, которое общалось с FOTA-провайдером. Было просто крайне интересно почему через него обновления не прилетали. Поняв что смысла в нем особо нет — удалил.
    • +1
      Перезалейте, пожалуйста, pdf-ку. А то не открывается.
      • +1
        Хм не скачивается… Вот выложил тут.
  • 0
    Автору спасибо! 5 антивирусов попробовал, ничего не помогло. А оказывается нужно было кэш почистить…
  • +3
    Вот уж телефон с киллер-фичей

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.