Сегодня в выпуске: исследование эволюции мобильного ransomware от простейших локеров до продвинутых криптошифровальщиков, большое исследование безопасности загрузчиков Android-смартфонов, гайд по криминалистическому анализу iOS, инструменты исследования безопасности Android и приложений для него. А также: плагины для продуктивной Android-разработки, рассказ о DSL в Kotlin, несколько статей о реализации анимации и свежая подборка библиотек.
 

Почитать

 

Криминалистический анализ iOS

iOS forensics — огромная статья о криминалистическом анализе устройств на базе iOS. Покрывает практически все аспекты анализа, начиная от того, что делать в первую очередь (вынуть SIM, включить режим полета и засунуть девайс в клетку Фарадея), и заканчивая описанием структуры файловой системы и мест расположения самых интересных данных.

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

 

Как работает функция отключения Wi-Fi в Android

Does disabling Wi-Fi prevent my Android phone from sending Wi-Fi frames? — интересное исследование на тему того, как на самом деле работает функция отключения Wi-Fi в Android. Авторы взяли несколько смартфонов на разных версиях Android, расположили их в помещении с точкой доступа и сниффером и поиграли с настройками.

Выводы: при отключении Wi-Fi смартфон продолжает слать широковещательные запросы, чтобы выяснить, есть ли поблизости точка доступа. Смартфон использует MAC-адреса точек доступа для определения своего местоположения (у Google есть список точек доступа и их примерное положение). Проблема только в том, что периодические сканы сетей могут выдать эту информацию третьим сторонам (например, торговый центр может использовать Wi-Fi-роутеры для трекинга посетителей).

Чтобы полностью исключить утечку информации, необходимо также отменить периодические сканы сетей. В Android 6–7 для этого необходимо перейти в «Настройки → Location → Scanning» и выключить соответствующую опцию. В более старых версиях эта опция находится в Wi-Fi → Advanced.

 

Эволюция мобильного ransomware

Android Mobile Ransomware: Bigger, Badder, Better? — статья об эволюции ransomware. Основные тезисы:

  • Первый шифровальщик (именно шифровальщик, а не локер) был обнаружен в мае 2014 года и получил имя Simple Locker (ANDROIDOS_SIMPLOCK.AXM). Все, что он делал, — шифровал файлы на карте памяти.
  • Большинство шифровальщиков используют имена Adobe Flash Player, Video Player и названия популярных игр.
  • Многие шифровальщики используют имя пакета, похожее на имена пакетов встроенных в Android приложений: почтового клиента, календаря и браузера.
  • Большинство шифровальщиков нацелены на жителей Ближнего Востока.
  • Основной алгоритм шифрования — AES, место хранения ключа — в настройках приложения (ранние версии), на сервере (сейчас).
  • Для связи с CC-сервером могут использоваться HTTP/S, Tor и XMPP.
  • Нередко в качестве вспомогательного средства заработка создатели шифровальщиков встраивают в них средства отправки СМС и звонков на платные номера.
  • Часто шифровальщики получают права администратора на устройстве, но только для того, чтобы затруднить свое удаление.
Имена приложения, пакета, иконка и размер семплов ransomware
Имена приложения, пакета, иконка и размер семплов ransomware
 

Большое исследование безопасности загрузчиков

Android Bootloader Vulnerabilities in Vendor Customizations — большое исследование загрузчиков различных смартфонов на предмет уязвимостей и скрытых функций fastboot. Последний представляет собой интерфейс/протокол для управления загрузчиком и часто используется для таких операций, как разблокировка загрузчика и установка прошивок. Однако многие вендоры добавляют в него свои собственные команды, которые могут скомпрометировать механизм безопасной загрузки (verified boot), активировать небезопасные функции ОС или дать злоумышленникам возможность разблокировать загрузчик без сброса смартфона до заводских настроек.

Наиболее интересные находки исследователей:

  • Root shell с отключенным SELinux на большинстве устройств Motorola. Загрузчик Motorola поддерживает несколько специальных команд, которые после загрузки превращаются в аргументы ядра Linux. Например, после выполнения команды

    fastboot oem config carrier abc

и последующей загрузки смартфона с помощью fastboot continue ядру будет передан аргумент carrier=abc. Пока ничего криминального. Но, конечно же, здесь есть проблема валидации входных данных, то есть возможность передать ядру дополнительные параметры с помощью особым образом сформированной команды. Например, выполнение такой команды:

$ fastboot oem config carrier "a rdinit=/sbin/foo"

приведет к передаче ядру параметров carrier=a и rdinit=/sbin/foo. Это уже намного интереснее. С помощью того же параметра rdinit можно заставить ядро запустить любой бинарник из initramfs (RAM-диск Android). Но есть другая проблема: в initramfs нет бинарных файлов, подходящих для получения root-шелла.

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

Чтобы использовать эту возможность, достаточно собрать debug-версию initramfs, которая включает в себя работающий с правами root ADB, не требующий авторизации. Загрузить этот initramfs в смартфон, дампнуть оперативную память смартфона, чтобы узнать адрес загрузки, и передать этот адрес ядру с помощью аргумента initrd:

$ fastboot oem config fsg-id "a initrd=0x11000000,1518172"
$ fastboot flash aleph malicious.cpio.gz
... загрузчик сообщит, что прошить файл не удалось, но файл останется в памяти ...
$ fastboot continue
$ adb shell
shamu:/ # id
uid=0(root) gid=0(root) groups=0(root),[...] context=u:r:su:s0
shamu:/ # setenforce permissive
shamu:/ # getenforce
Permissive
shamu:/ #

Получив права root, атакующий также может перезаписать boot-раздел, внедрив в него эксплоит (на Nexus 6 такое возможно из-за неполной реализации verified boot), произвести даунгрейд загрузчика, раздела TrustZone, разблокировать загрузчик, если такая процедура уже проводилась, и перезаписать некоторые разделы.

  • Разблокировка загрузчика и отключение verified boot в OnePlus 3/3T. Здесь все намного проще, с помощью такой команды разблокируем загрузчик без сброса до заводских настроек:

    fastboot oem 4F500301

С помощью такой — отключаем механизм verified boot:

$ fastboot oem disable dm verity
  • Дамп оперативной памяти Nexus 5X. Загрузчик смартфона позволяет вызвать kernel panic с помощью команды fastboot oem panic. В результате появляется возможность снять дамп оперативной памяти с помощью интерфейса serial over USB.

  • Доступ к скрытым функциям. Некоторые модели смартфонов позволяют получить доступ к функциям отладки и диагностики. Например, в Nexus 6 можно получить доступ к интерфейсу диагностики модема и в результате прослушивать телефонные разговоры, снифать трафик, получать информацию о звонках и совершать их, читать СМС.
Процесс загрузки смартфона
Процесс загрузки смартфона
 

Инструменты

  • twiga — скрипт для получения исчерпывающей информации об Android-устройстве. Умеет показывать имя устройства, версию Android, версию модема, ядра, запущенные процессы, сетевую статистику, таблицу разделов и многое другое.
  • node-google-play — библиотека и набор примеров для скачивания приложений и получения информации из Google Play с помощью эмуляции Nexus 5X.
  • abootool — инструмент для поиска скрытых (и потенциально небезопасных) fastboot-команд в загрузчиках смартфонов. Все, что нужно, — это скачать образ загрузчика и натравить на него скрипт.
  • objection — инструмент исследования, позволяющий внедриться в приложение iOS или Android и провести анализ его приватного каталога, памяти, классов, методов, извлечь содержимое базы SQLite, обойти SSL-пиннинг. Objection основан на Frida и умеет запускать гаджеты и скрипты, созданные для нее.

Пример просмотра приватного каталога приложения с помощью objection
Пример просмотра приватного каталога приложения с помощью objection

 

Разработка

 

Анимация на основе физики

Introduction to Physics-based animations in Android — статья о том, как анимировать объекты так, чтобы их перемещения подчинялись законам физики. Например, реализовать эффект пружины, когда отдаленный на некоторое расстояние от своего текущего положения объект притягивается обратно, или переместить объект с постепенным затуханием его скорости и отскоком от других объектов.

Все это можно реализовать с помощью стандартной библиотеки support-dynamic-animation. Она включает в себя два класса: SpringAnimation и FlingAnimation. Первый реализует тот самый эффект пружины, второй позволяет создать нечто вроде эффекта скольжения по льду. Использовать их очень просто. Например, можно создать GuestorListener и повесить его на нужный View:

private GestureDetector.OnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
    ...
    @Override
    public boolean onFling(MotionEvent downEvent, MotionEvent moveEvent, float velocityX, float velocityY) {
        //Fling Right/Left
        FlingAnimation flingX = new FlingAnimation(mViewTobeFlung, DynamicAnimation.TRANSLATION_X);
        flingX.setStartVelocity(velocityX)
          .setMinValue(MIN_TRANSLATION) // minimum translationX property
          .setMaxValue(maxTranslationX)  // maximum translationX property
          .setFriction(FRICTION)
          .start();

        return true;
    }
};
 

Что такое интерполяторы

Understanding Interpolators in Android — хорошая статья, простым языком поясняющая идею интерполяторов, используемых при анимации объектов в Android. В статье есть математика, но для понимания логики происходящего она не нужна. К тому же все примеры можно найти в исходном коде.

 

Как работает runOnUiThread

Understanding Activity.runOnUiThread() — небольшая заметка, посвященная тому, как работает метод runOnUiThread, предназначенный для запуска кода в основном потоке приложения. В целом все очень просто:

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
...
}

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

 

Валидация входных данных в Kotlin

Preconditions.kt: Validate Your Kotlin — статья с описанием двух встроенных в Kotlin инструментов для валидации входных данных. Например, когда переданный функции массив должен быть определенной длины или не быть пустым. Рассмотренные в статье инструменты:

  • require() — проверяет условие и, если оно не выполнено, выбрасывает исключение IllegalArgumentException. Пример:

    fun getFifthElement(array: Array): T {
    require(array.size >= 5) {
    "array should have at least five elements, but has ${array.size}!"
    }
    return array[4]
    }

  • check() — аналог require, выбрасывающий исключение IllegalStateException (что означает «не вовремя, чувак»).
 

Как писать DSL в Kotlin

Creating DSL with Kotlin Introducing a TLSLibrary — хорошая вводная статья о создании своего собственного DSL (Domain Specific Languages) поверх Kotlin.

DSL — это некий узкоспециализированный мини-язык. Хороший пример такого языка — система программирования интерфейса в библиотеке Anko. Написанный с ее помощью код остается корректным кодом Kotlin, но выглядит как набор строк на другом языке. DSL хорошо подходит для задач, требующих выполнения множества однотипных действий. Он позволяет сделать код более чистым и понятным.

В статье автор демонстрирует пример создания DSL для работы с библиотекой SSL/TLS. Ключевую роль здесь играют так называемые литералы функций с объектом-приемником (function literals with receiver), которые представляют собой сплав лямбд и функций-расширений. Другими словами, это лямбды, которые работают в пространстве имен указанного объекта.

С помощью таких лямбд можно создать мини-язык внутри языка:

val fac = socketFactory {
    keyManager {
        open("certsandstores/clientkeystore") withPass "123456" beingA "jks"
    }
    trustManager {
        open("certsandstores/myTruststore") withPass "123456" beingA "jks"
    }
    sockets {
        cipherSuites =
        listOf("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
                "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
                "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
                "TLS_DHE_RSA_WITH_AES_256_CBC_SHA")
        timeout = 10_000
    }
}

val socket = fac.createSocket("192.168.3.200", 9443)
 

Плагины Android Studio для более эффективной разработки

How to become more productive in android with android studio plugins (перевод) — статья с обзором плагинов Android Studio, помогающих при разработке. Краткий пересказ:

  • MVP Generator — подготавливает каркас MVP-приложения;
  • Parcelable generator — генератор для быстрого создания сериализуемых объектов;
  • DTOnator — позволяет создать класс на основе JSON;
  • ButterKnifeZelezny — генерирует инъекции ButterKnife на основе кода XML;
  • CodeGlance — мини-карта кода в стиле Sublime;
  • Advanced Java Folding — более продвинутая система свертывания участков кода;
  • Android DPI Calculator — калькулятор величин для различных значений DPI;
  • JVM Debugger Memory View — плагин для более точной оценки потребления памяти;
  • Android Resource Usage Count — подсчитывает, сколько раз ресурс используется приложением, и выводит информацию рядом с его декларацией;
  • BIU — плагин для сжатия PNG-изображений;
  • Folding Plugin — позволяет группировать файлы, располагая их в виртуальных папках;
  • GitIgnore — автоматически добавляет в .gitignore все, что не относится к исходному коду;
  • Android Localizationer — плагин для автоматического перевода строк приложения на другие языки с помощью Microsoft Translator;
  • Android Wifi ADB — позволяет работать с устройством через Wi-Fi вместо USB-кабеля.
 

Библиотеки

  • UberUX — копия стека анимаций в приложении Uber: переходы между активностями, поля ввода, карта с оверлеями и многое другое;
  • AnyMaps — библиотека-обертка, позволяющая использовать Google Maps, OpenStreet Maps или Baidu, не меняя код;
  • NoiseView — простая библиотека, позволяющая добавить шум на фотографию;
  • Kotlin Resources — каталог библиотек, написанных на языке Kotlin и для использования в написанных на Kotlin приложениях;
  • App Store ScreenShot — веб-сайт, позволяющий быстро создать красивую рамку для скриншота приложения.

Оставить мнение

Check Also

Конкурс хаков: пишем на PowerShell скрипт, который уведомляет о днях рождения пользователей Active Directory

В компаниях часто встречается задача уведомлять сотрудников о приближающихся днях рождения…