Android: як Google стежить за тобою, нова атака Man-in-the-Disk і реверс вірусів
- Зміст статті
- Інструменти
- Почитати
- Google стежить за тобою
- «Новий» вектор атак: Man-in-the-Disk
- 47 вразливостей в пристроях Android
- Як реверс віруси
- Аналіз вихідного коду Android
- розробнику
- Онлайн-інструменти розробника Android
- Більш доброзичливий до мови Kotlin Android SDK
- Як правильно відповідати на відгуки в Play Store / App Store
- Приховані діаманти стандартної бібліотеки Kotlin
- Інструменти
- бібліотеки
Зміст статті
У цьому випуску: 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.
«Новий» вектор атак: 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-розробнику.
Дизайн:
Розробка:
- 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 - інструмент автоматизованого тестування інтерфейсу додатку.
бібліотеки
- 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 - бібліотека для виконання складних маніпуляцій над текстом.
ZipWithNext () // [(A, B) , (B, C), (C, D)] val nullableString: String?