Хакер - Android: как Google следит за тобой, новая атака Man-in-the-Disk и реверс вирусов
Содержание статьи
- Инструменты
- Почитать
- Google следит за тобой
- «Новый» вектор атак: Man-in-the-Disk
- 47 уязвимостей в устройствах Android
- Как реверсят вирусы
- Анализ исходного кода Android
- Разработчику
- Онлайн-инструменты разработчика Android
- Более дружелюбный к языку Kotlin Android SDK
- Как правильно отвечать на отзывы в Play Store / App Store
- Скрытые бриллианты стандартной библиотеки 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.
Количество данных, отправленных 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 делается так:
- Поиск
LIBXPOSED_ART.SO
иXPOSEDBRIDGE.JAR
в файле/proc/self/maps
(этот файл показывает все отображенные в текущий процесс файлы, в том числе библиотеки). - Поиск любого из двух методов
de/robv/android/xposed/XC_MethodHook
,de/robv/android/xposed/XposedBridge
с помощью JNI-метода FindClass().
Анализ исходного кода 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-разработчику.
Дизайн:
- Три инструмента: Figma, InvisionApp, Zeplin.
Разработка:
- 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 — мощный инструмент для работы с регулярными выражениями.
Более дружелюбный к языку Kotlin Android SDK
Android Pie SDK is now more Kotlin-friendly — анонс нового Android SDK, содержащего так называемые Nullable-аннотации для языка Kotlin. Такие аннотации позволяют компилятору (и среде разработки) Kotlin узнать, могут ли возвращаемые объекты быть null. Важные моменты:
- Аннотации касаются не всех, а только наиболее используемых API.
- В целях совместимости компилятор будет выдавать только предупреждения, а не ошибки.
- Даже если твой проект на Java, ты все равно получишь выгоду от нововведения: Android Studio будет предупреждать тебя, например, о передаче функции параметра Null, если аргумент помечен как не nullable.
Как включить:
- Установи SDK Android API 28 с помощью Tools → SDK Manager.
- Укажи в build.gradle:
compileSdkVersion 28
. - Обнови 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 — достаточно очевидная, но, возможно, полезная подборка советов, как правильно отвечать на отзывы о приложении.
- Отвечайте как можно быстрее.
- Убедитесь, что вы правильно поняли то, что сказал пользователь.
- Покажите свою заботу о пользователе.
- Отвечайте в стиле своего бренда: серьезным тоном, если это бизнес-приложение, или шутливо в случае игры.
- Не используйте шаблонные ответы.
- Не растекайтесь мыслью по древу.
- Не используйте слова с отрицательным оттенком: не могу, невозможно, никогда.
- Не делайте ошибок.
- Будьте честны, объясняйте причины и говорите о сроках.
- Не извиняйтесь без необходимости.
- Предоставьте возможность связаться с вами напрямую.
- Подавите свой гнев.
- Говорите спасибо.
Fun fact: 77% пользователей читают хотя бы один отзыв перед установкой приложений, а 13% — как минимум семь.
Скрытые бриллианты стандартной библиотеки Kotlin
Hidden Gems In Kotlin StdLib — статья о неочевидных и неизвестных многим возможностях стандартной библиотеки Kotlin.
-
Класс 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() // Возвращает ""
-
Коллекции в 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>>
-
Деструкция. Это уже встроенная возможность 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