В этом выпуске: 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.
Количество данных, отправленных Android и iOS в сутки
Количество данных, отправленных 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().
Как вирусы выполняют проверку на процессор
Как вирусы выполняют проверку на процессор
 

Анализ исходного кода 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 — мощный инструмент для работы с регулярными выражениями.
App Launch Pad
App Launch Pad
 

Более дружелюбный к языку 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 — инструмент автоматизированного тестирования интерфейса приложения.
 

Библиотеки

  • Listn — простой музыкальный плеер, построенный на API SoundCloud;
  • CrunchyCalendar — календарь в стиле Material Design с бесконечным скроллингом, выбором периодов и многими другими функциями;
  • folding-cell-android — эффект складывающегося листа бумаги;
  • multiplatform-settings — мультиплатформенная библиотека для сохранения значений key:value, использует SharedPreferences на Android и NSUserDefaults на iOS;
  • DrawableToolbox — библиотека для создания Drawable нужных форм и оттенков на лету, без необходимости использования файлов drawable.xml;
  • twinkle — добавляет эффект мерцания к элементам интерфейса;
  • HorizontalCalendarView-Android — прокручиваемый в сторону календарь;
  • Flair — фреймворк для создания комплексных приложений с разными архитектурами (MVC ready, MVP, MVVM, MVI);
  • Philology — библиотека, позволяющая распространять переводы приложения отдельно от самого приложения;
  • DroidArt — библиотека для выполнения сложных манипуляций над текстом.

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

Check Also

Итальянская нефтегазовая компания Saipem SpA пострадала от новой версии вайпера Shamoon

Исследователи зафиксировали появление новой версии малвари Shamoon. Новый «штамм» загрузил…