В этом выпуске: 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

Безопасность смарт-контрактов. Топ-10 уязвимостей децентрализованных приложений на примере спецификации DASP

Количество смарт-контрактов в блокчейне Ethereum только за первую половину 2018 года вырос…