JustPaste.it
User avatar
@anonymous · Sep 7, 2018

Хакер - Android: как Google следит за тобой, новая атака Man-in-the-Disk и реверс вирусов

https://t.me/hacker_frei

Евгений Зобнин

В этом выпуске: Google следит за тобой, новый вектор атак на мобильные устройства, реверс зашифрованных вирусов, анализ исходного кода Android на уязвимости и 47 уязвимостей в Android-устройствах. А также: лучшие онлайн-инструменты разработчика Android, скрытые возможности Kotlin и свежие библиотеки для программистов.
 

Инструменты

  • ARTist — DBI-фреймворк, подобный Frida, но использующий намного более интересный метод модификации приложения: подмену скомпилированного на устройстве OAT-файла приложения на другой; более подробно описан в документе, опубликованном на сайте Black Hat;
  • House — очередная обертка вокруг Frida для новичков;
  • jelbrekTime — джейлбрейк для Apple watch S3 watchOS 4.1;
  • Sirius Obfuscator — обфускатор исходного кода на языке Swift.
 

Почитать

 

Google следит за тобой

Google Data Collection — доклад исследователей из университета Вандербильта, посвященный сервисам компании Google, а точнее тому, как компания использует эти сервисы для сбора информации о пользователях. Общий вывод таков, что от Google не скрыться при всех стараниях, а конкретные данные следующие:

  • смартфон Android в спящем режиме с активированным браузером Google Chrome передает информацию о местоположении 340 раз в сутки. В целом смартфон с установленным Chrome отправляет данные в 50 раз чаще, чем iOS с Safari;
  • неактивное Android-устройство взаимодействует с Google почти в десять раз чаще, чем устройство Apple взаимодействует с серверами Apple;
  • используя рекламные сети, Google может связать анонимные данные с личной информацией пользователя; например, если искать информацию через Google, используя браузер Firefox, Google может определить, что тот, кто ищет, — владелец такого-то телефона;
  • большую часть данных Google собирает в то время, когда пользователь не взаимодействует напрямую с каким-либо из продуктов Google.

 

33da1cd3c1872ba1cb353aed4c52d339.jpg

Количество данных, отправленных Android и iOS в сутки

«Новый» вектор атак: Man-in-the-Disk

Man-in-the-Disk: A New Attack Surface for Android Apps — так называемый новый вектор атак на приложения для Android от компании Check Point. Суть в том, что в Android внешний накопитель, а именно карта памяти (даже если она внутренняя), использует файловую систему без разделения прав доступа, а значит, если одно из приложений сохранит что-то на карту памяти, любое другое приложение сможет это что-то прочитать и/или изменить.

 

Атака как раз и заключается в том, что злоумышленник создает приложение, которое затирает или подменяет чужие файлы. Например, можно вызвать сбой в Google Translate, Yandex Translate, Google Voice Typing и Google Text-to-Speech. Но, что более интересно, в некоторых случаях можно подменить установленное приложение затрояненным вариантом. Например, если приложение сохраняет файл своего обновления на карту памяти, достаточно подменить его, и в качестве обновления будет установлено совсем не то, что нужно. Так, например, можно сделать с Xiaomi Browser.

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

 

47 уязвимостей в устройствах Android

DEF CON 2018: Vulnerable Out of the Box — An Evaluation of Android Carrier Devices — исследование компании Kryptowire, посвященное поиску уязвимостей в Android-устройствах различных производителей: Alcatel, ASUS, LG, ZTE, Sony, Nokia, Orbic, Oppo, MXQ и других.

Итог: в общей сложности найдено 47 уязвимостей, включая крах прошивки, очистку всех данных пользователя, скрытое создание скриншотов и скринкастов, получение root, незаметную установку приложений, скрытую отправку SMS и доступ к адресной книге.

Стоит отметить, что все эти уязвимости отсутствуют в чистом Android (том, что установлен на Google Pixel или Essential, например) и выявлены в модифицированных производителем частях прошивки и драйверах.

 

Как реверсят вирусы

Unpacking the Packed Unpacker — интересная презентация девушки из команды Android Security Team и по совместительству разработчика IDAPython о том, как отреверсить приложение, запакованное зашифрованным пакером.

Главный интерес здесь, конечно же, не в уникальности материала, а в его подаче. Несмотря на то что это не статья и не вайтпейпер, а всего лишь набор слайдов, он легко читается и полностью вводит в курс дела: зачем нужны нативные библиотеки, как они используются в приложении, что такое формат JNI, как определить, что библиотека зашифрована (отсутствие JNI-функций и повторяющийся луп в начале), как сделать дешифратор (самый простой вариант: переписать ассемблерный код на Python и использовать IDAPython, чтобы дешифровать код), как вирусы проверяют, что находятся в эмулируемой среде, и как эту проверку обойти.

Например, проверка на запуск приложения под управлением Xposed делается так:

  1. Поиск LIBXPOSED_ART.SO и XPOSEDBRIDGE.JAR в файле /proc/self/maps (этот файл показывает все отображенные в текущий процесс файлы, в том числе библиотеки).
  2. Поиск любого из двух методов de/robv/android/xposed/XC_MethodHook, de/robv/android/xposed/XposedBridge с помощью JNI-метода FindClass().

eb83f8d0375dfff0c16af03d32484a82.jpg

Как вирусы выполняют проверку на процессор
 

Анализ исходного кода Android

Проверили с помощью PVS-Studio исходные коды Android, или Никто не идеален — статья разработчиков статического анализатора PVS-Studio о проверке исходных текстов Android на наличие ошибок. Результат достаточно ожидаем для такого объема кода.

  • Бессмысленные сравнения:

    pr2.mStretchMode == pr2.mStretchMode ns != 1 || ns !=1
  • Разыменование нулевого указателя:

    if (xmlProxyLib == nullptr) { ALOGE("effectProxy must contain a <%s>: %s", tag, dump(*xmlProxyLib)); return false; }
  • Приватные данные не затираются в памяти. Это уже более сложная ошибка, когда программист все делает правильно, затирая память нулями в конце работы с важными данными, но не учитывает того факта, что компилятор, скорее всего, удалит операцию заполнения памяти нулями, как бессмысленную. Например, в этом случае компилятор, вероятнее всего, удалит обращение к функции memset:

    static void FwdLockGlue_InitializeRoundKeys() { unsigned char keyEncryptionKey[KEY_SIZE]; ... memset(keyEncryptionKey, 0, KEY_SIZE); // Zero out key data. }
  • Не учитывается порядок вычисления аргументов. Еще один пример незнания работы компилятора, который может считать аргументы функции в произвольном порядке. В следующем примере функции readSigned будут вызваны в неопределенной последовательности:

    mHal.setLayerCursorPosition(...., readSigned(), readSigned());

А также:

  • игнорирование результатов исполнения функции;
  • код, который никогда не выполняется;
  • забытый break внутри switch;
  • возврат уже не существующих данных;
  • выход за границу массива;
  • повторное присваивание переменной и другое.

Автор исследования утверждает, что PVS-Studio выявил более чем одну потенциальную уязвимость на 4000 строк кода. Однако стоит иметь в виду, что речь именно о потенциальных уязвимостях, в число которых входят, например, всегда истинные или всегда ложные условия. Другими словами, это просто места, на которые программистам стоит обратить внимание.

 

Разработчику

 

Онлайн-инструменты разработчика Android

Awesome List Of Online Tools For Android Developers — список онлайн-инструментов, которые пригодятся любому Android-разработчику.

Дизайн:

Разработка:

  • AndroidStarters — создает Android-проект на базе выбранной архитектуры в три клика;
  • MaterialPalette — генератор цветовой палитры на базе Material Design;
  • Android Asset Studio — инструмент для быстрой генерации иконок;
  • Android SDK search — расширение Chrome для быстрого поиска по документации Android SDK;
  • Gradle, please — вводишь название библиотеки, получаешь строчку для вставки в build.gradle;
  • Kotlin extensions — список самых полезных функций-расширений Kotlin;
  • JsonStub — фейковый бэкенд, способный генерировать любые запросы и ответы JSON.

Тестирование и внедрение:

  • APK method count — инструмент для подсчета количества методов в приложении, чтобы убедиться, что не пересекаешь лимит в 65K методов;
  • Appetize — инструмент для запуска приложений в браузере;
  • Appstore screenshot generator — генератор скриншотов с рамкой смартфона для Play Store;
  • App Launch Pad — похожий инструмент с более интересными вариантами оформления.

Продуктивность:

  • Android arsenal — список лучших инструментов и библиотек с каталогизатором и поиском;
  • Mindorks App Store — еще один подобный каталог;
  • Octotree — расширение Chrome для быстрой навигации по GitHub;
  • RegExr — мощный инструмент для работы с регулярными выражениями.

7bb13c7cd7b62e912d6e62d3e7b83a16.jpg

Более дружелюбный к языку Kotlin Android SDK

Android Pie SDK is now more Kotlin-friendly — анонс нового Android SDK, содержащего так называемые Nullable-аннотации для языка Kotlin. Такие аннотации позволяют компилятору (и среде разработки) Kotlin узнать, могут ли возвращаемые объекты быть null. Важные моменты:

  1. Аннотации касаются не всех, а только наиболее используемых API.
  2. В целях совместимости компилятор будет выдавать только предупреждения, а не ошибки.
  3. Даже если твой проект на Java, ты все равно получишь выгоду от нововведения: Android Studio будет предупреждать тебя, например, о передаче функции параметра Null, если аргумент помечен как не nullable.

Как включить:

  1. Установи SDK Android API 28 с помощью Tools → SDK Manager.
  2. Укажи в build.gradle: compileSdkVersion 28.
  3. Обнови Kotlin до версии 1.2.60: Tools → Kotlin → Configure Kotlin Plugin Updates.
 

Как правильно отвечать на отзывы в Play Store / App Store

How to Reply to iOS and Google Play Reviews Like a Pro — 13 Power Tips You Should Always Keep In Mind — достаточно очевидная, но, возможно, полезная подборка советов, как правильно отвечать на отзывы о приложении.

  1. Отвечайте как можно быстрее.
  2. Убедитесь, что вы правильно поняли то, что сказал пользователь.
  3. Покажите свою заботу о пользователе.
  4. Отвечайте в стиле своего бренда: серьезным тоном, если это бизнес-приложение, или шутливо в случае игры.
  5. Не используйте шаблонные ответы.
  6. Не растекайтесь мыслью по древу.
  7. Не используйте слова с отрицательным оттенком: не могу, невозможно, никогда.
  8. Не делайте ошибок.
  9. Будьте честны, объясняйте причины и говорите о сроках.
  10. Не извиняйтесь без необходимости.
  11. Предоставьте возможность связаться с вами напрямую.
  12. Подавите свой гнев.
  13. Говорите спасибо.

Fun fact: 77% пользователей читают хотя бы один отзыв перед установкой приложений, а 13% — как минимум семь.

 

Скрытые бриллианты стандартной библиотеки Kotlin

Hidden Gems In Kotlin StdLib — статья о неочевидных и неизвестных многим возможностях стандартной библиотеки Kotlin.

  1. Класс String в Kotlin гораздо развитее своего аналога в Java и позволяет делать такое:

    val blank = " ".isBlank() // Also: CharSequence?.isNullOrBlank val first = "Adam.McNeilly".substringBefore('.') // "Adam" val last = "Adam.McNeilly".substringAfter('.') // "McNeilly" val withSpaces = "1".padStart(2) // "1" val endSpaces = "1".padEnd(3, '0') // "100" val dropStart = "Adam".drop(2) // "am" val dropEnd = "Adam".dropLast(2) // "Ad" "A\nB\nC".lines() // [A, B, C] "One.Two.Three".substringAfterLast('.') // "Three" "One.Two.Three".substringBeforeLast('.') // "One.Two" "ABCD".zipWithNext() // [(A, B), (B, C), (C, D)] val nullableString: String? = null nullableString.orEmpty() // Возвращает ""
  2. Коллекции в Kotlin тоже имеют множество удобных методов:

    myList.sort() myList.max() myList.min() myList.shuffle() myList.reverse() myList.swap(1, 2) myList.filter { } myList.filterNot { } myList.filterIsInstance() myList.filterNotNull { } myList.first { } // Также: indexOfFirst { } myList.firstOrNull { } myList.last { } // Также: indexOfLast { } myList.lastOrNull { } myList.single { } myList.singleOrNull { } myList.any { } myList.none { } myList.all { } myList.partition { } // Pair<List<T>, List<T>>
  3. Деструкция. Это уже встроенная возможность Kotlin, о которой автор все равно решил упомянуть, так как посчитал важной. Деструкция позволяет заменить такой код:

    val coordinates = arrayOf(5, 10, 15) val x = coordinates[0] val y = coordinates[1] val z = coordinates[2]

    на такой:

    val coordinates = arrayOf(5, 10, 15) val (x, y, z) = coordinates

    Но что гораздо более важно, деструкция работает также в отношении data-классов. И это позволяет тебе вернуть из функции два значения разных типов:

    data class Result(val result: Int, val status: Status) fun function(...): Result { return Result(result, status) } val (result, status) = function(...)

    Деструкции можно подвергнуть также map:

    val actionsMap: Map<String, Action> = hashMapOf(...) for ((key, action) in actionsMap) { // ... }
 

Инструменты

  • GradientDrawableTuner — инструмент для быстрой генерации градиентных Drawable, с возможностью последующего сохранения в XML-файл;
  • Language-Switcher-Tile — кнопка для меню быстрых настроек, позволяющая быстро переключать язык устройства (пригодится для оценки переводов);
  • Detox — инструмент автоматизированного тестирования интерфейса приложения.

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