Translated ['mobile-pentesting/android-app-pentesting/android-applicatio

This commit is contained in:
Translator 2024-10-05 13:17:24 +00:00
parent a7032c7ad9
commit d8935aa511

View file

@ -34,7 +34,7 @@
### Пісочниця
**Пісочниця Android-додатків** дозволяє запускати **кожен додаток** як **окремий процес під окремим ідентифікатором користувача**. Кожен процес має свою віртуальну машину, тому код додатка виконується в ізоляції від інших додатків.\
З Android 5.0(L) **впроваджено SELinux**. В основному, SELinux забороняє всі взаємодії процесів, а потім створює політики, щоб **дозволити лише очікувані взаємодії між ними**.
З Android 5.0(L) **SELinux** є обов'язковим. В основному, SELinux забороняє всі взаємодії процесів, а потім створює політики, щоб **дозволити лише очікувані взаємодії між ними**.
### Дозволи
@ -54,7 +54,7 @@
## Попередньо встановлені додатки
Ці додатки зазвичай знаходяться в каталогах **`/system/app`** або **`/system/priv-app`**, і деякі з них **оптимізовані** (ви навіть можете не знайти файл `classes.dex`). Ці додатки варто перевірити, оскільки іноді вони **працюють з надто багатьма дозволами** (як root).
Ці додатки зазвичай знаходяться в каталогах **`/system/app`** або **`/system/priv-app`**, і деякі з них є **оптимізованими** (ви навіть можете не знайти файл `classes.dex`). Ці додатки варто перевірити, оскільки іноді вони **працюють з надто багатьма дозволами** (як root).
* Ті, що постачаються з **AOSP** (Android OpenSource Project) **ROM**
* Додані виробником **пристрою**
@ -62,7 +62,7 @@
## Рутування
Щоб отримати доступ root на фізичному пристрої Android, вам зазвичай потрібно **експлуатувати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
Щоб отримати доступ root на фізичному пристрої Android, вам зазвичай потрібно **використати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
Після того, як експлуатація спрацювала, зазвичай бінарний файл Linux `su` копіюється в місце, вказане в змінній середовища PATH користувача, наприклад, `/system/xbin`.
Після налаштування бінарного файлу su використовується інший Android-додаток для взаємодії з бінарним файлом `su` та **обробки запитів на доступ root**, таких як **Superuser** та **SuperSU** (доступні в Google Play Store).
@ -74,7 +74,7 @@
### ROM
Можливо **замінити ОС, встановивши власне програмне забезпечення**. Це дозволяє розширити корисність старого пристрою, обійти програмні обмеження або отримати доступ до останнього коду Android.\
**OmniROM** та **LineageOS** є двома з найпопулярніших прошивок для використання.
**OmniROM** та **LineageOS** є двома найпопулярнішими прошивками для використання.
Зверніть увагу, що **не завжди необхідно рутувати пристрій**, щоб встановити власне програмне забезпечення. **Деякі виробники дозволяють** розблокування своїх завантажувачів у добре задокументований і безпечний спосіб.
@ -97,7 +97,7 @@
- lib/
- Містить рідні бібліотеки, розділені за архітектурою ЦП в підкаталогах.
- `armeabi`: код для процесорів на базі ARM
- `armeabi-v7a`: код для процесорів ARMv7 та вище
- `armeabi-v7a`: код для процесорів ARMv7 і вище
- `x86`: код для процесорів X86
- `mips`: код лише для процесорів MIPS
- assets/
@ -107,7 +107,7 @@
### **Dalvik & Smali**
У розробці Android використовується **Java або Kotlin** для створення додатків. Замість використання JVM, як у настільних додатках, Android компілює цей код у **Dalvik Executable (DEX) байт-код**. Раніше цим байт-кодом займалася віртуальна машина Dalvik, але тепер Android Runtime (ART) бере на себе цю функцію в новіших версіях Android.
У розробці Android використовується **Java або Kotlin** для створення додатків. Замість використання JVM, як у настільних додатках, Android компілює цей код у **Dalvik Executable (DEX) байт-код**. Раніше байт-код обробляв віртуальна машина Dalvik, але тепер Android Runtime (ART) бере на себе цю функцію в новіших версіях Android.
Для реверс-інжинірингу **Smali** стає критично важливим. Це читабельна людиною версія DEX байт-коду, яка діє як асемблерна мова, перетворюючи вихідний код на інструкції байт-коду. Smali та baksmali відносяться до інструментів асемблювання та розбирання в цьому контексті.
@ -115,7 +115,7 @@
Інтенти є основним засобом, за допомогою якого Android-додатки спілкуються між своїми компонентами або з іншими додатками. Ці об'єкти повідомлень також можуть переносити дані між додатками або компонентами, подібно до того, як використовуються запити GET/POST у HTTP-комунікаціях.
Отже, Інтент - це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути спрямовані** на конкретні компоненти або додатки, **або можуть бути надіслані без конкретного отримувача**.\
Отже, Інтент це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути надіслані** конкретним компонентам або додаткам, **або можуть бути надіслані без конкретного отримувача**.\
Простими словами, Інтент можна використовувати:
* Для запуску Activity, зазвичай відкриваючи інтерфейс користувача для додатку
@ -128,13 +128,13 @@
### Фільтр Інтентів
**Фільтри Інтентів** визначають **як активність, сервіс або приймач трансляцій можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів - це файл **AndroidManifest.xml**, хоча для приймачів трансляцій також є можливість їх кодування.
**Фільтри Інтентів** визначають **як Activity, сервіс або Broadcast Receiver можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів — це **файл AndroidManifest.xml**, хоча для Broadcast Receiver також є можливість їх кодування.
Фільтри Інтентів складаються з категорій, дій та фільтрів даних, з можливістю включення додаткових метаданих. Ця конфігурація дозволяє компонентам обробляти конкретні Інтенти, які відповідають оголошеним критеріям.
Критичним аспектом Android-компонентів (активності/сервіси/постачальники контенту/приймачі трансляцій) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`експортується`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак є спосіб для розробників явно зберегти ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`експортується`** на **`false`** у їхніх визначеннях маніфесту.
Критичним аспектом Android-компонентів (активності/сервіси/постачальники контенту/трансляційні приймачі) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`exported`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак є спосіб для розробників явно зберегти ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`exported`** на **`false`** у їхніх визначеннях маніфесту.
Більше того, розробники мають можливість додатково захистити доступ до цих компонентів, вимагаючи специфічних дозволів. Атрибут **`permission`** може бути встановлений, щоб забезпечити доступ лише для додатків з призначеним дозволом, додаючи додатковий рівень безпеки та контролю над тим, хто може з ним взаємодіяти.
Більше того, розробники мають можливість додатково захистити доступ до цих компонентів, вимагаючи специфічних дозволів. Атрибут **`permission`** може бути встановлений, щоб забезпечити доступ лише для додатків з призначеним дозволом, додаючи додатковий рівень безпеки та контролю над тим, хто може взаємодіяти з ним.
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
@ -146,9 +146,9 @@
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
The **Action** of the previously declared intent is **ACTION\_SEND** and the **Extra** is a mailto **Uri** (the Extra if the extra information the intent is expecting).
The **Action** of the previously declared intent is **ACTION\_SEND** and the **Extra** is a mailto **Uri** (додаткова інформація, яку очікує намір).
Цей намір повинен бути оголошений у маніфесті, як у наступному прикладі:
This intent should be declared inside the manifest as in the following example:
```xml
<activity android:name="ShareActivity">
<intent-filter>
@ -167,7 +167,7 @@ The **Action** of the previously declared intent is **ACTION\_SEND** and the **E
```java
Intent downloadIntent = new (this, DownloadService.class):
```
В інших додатках, щоб отримати доступ до раніше оголошеного наміру, ви можете використовувати:
В інших додатках для доступу до раніше оголошеного наміру ви можете використовувати:
```java
Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName");
@ -185,7 +185,7 @@ context.startService(intent);
Існує **два типи** широкомовлень: **Звичайні** (асинхронні) та **Упорядковані** (синхронні). **Порядок** базується на **налаштованому пріоритеті в елементі отримувача**. **Кожен додаток може обробляти, передавати або відхиляти широкомовлення.**
Можливо **відправити** **широкомовлення** за допомогою функції `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
Можна **відправити** **широкомовлення**, використовуючи функцію `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
Ви також можете використовувати функцію **`sendBroadcast`** з **`LocalBroadCastManager`**, яка забезпечує, що **повідомлення ніколи не покидає додаток**. Використовуючи це, вам навіть не потрібно експортувати компонент отримувача.
### Sticky Broadcasts
@ -198,9 +198,9 @@ context.startService(intent);
## Deep links / URL schemes
У додатках Android **глибокі посилання** використовуються для ініціювання дії (Intent) безпосередньо через URL. Це робиться шляхом оголошення конкретної **схеми URL** в межах активності. Коли пристрій Android намагається **доступитися до URL з цією схемою**, вказана активність в додатку запускається.
У додатках Android **глибокі посилання** використовуються для ініціювання дії (Intent) безпосередньо через URL. Це робиться шляхом оголошення конкретного **схеми URL** в межах активності. Коли пристрій Android намагається **доступитися до URL з цією схемою**, вказана активність в додатку запускається.
Схема повинна бути оголошена в файлі **`AndroidManifest.xml`**:
Схема повинна бути оголошена у файлі **`AndroidManifest.xml`**:
```xml
[...]
<activity android:name=".MyActivity">
@ -212,9 +212,9 @@ context.startService(intent);
</intent-filter>
[...]
```
Схема з попереднього прикладу - `exampleapp://` (також зверніть увагу на **`category BROWSABLE`**)
Схема з попереднього прикладу - `examplescheme://` (також зверніть увагу на **`категорія BROWSABLE`**)
Тоді в полі даних ви можете вказати **host** та **path**:
Тоді в полі даних ви можете вказати **хост** та **шлях**:
```xml
<data android:scheme="examplescheme"
android:host="example"
@ -231,7 +231,7 @@ android:host="example"
## AIDL - Мова визначення інтерфейсу Android
**Мова визначення інтерфейсу Android (AIDL)** призначена для полегшення зв'язку між клієнтом і сервісом в Android-додатках через **міжпроцесорну комунікацію** (IPC). Оскільки безпосередній доступ до пам'яті іншого процесу не дозволений в Android, AIDL спрощує процес, перетворюючи об'єкти в формат, зрозумілий операційній системі, що полегшує зв'язок між різними процесами.
**Мова визначення інтерфейсу Android (AIDL)** призначена для полегшення зв'язку між клієнтом і сервісом в Android-додатках через **міжпроцесорну комунікацію** (IPC). Оскільки безпосередній доступ до пам'яті іншого процесу не дозволений в Android, AIDL спрощує процес, перетворюючи об'єкти в формат, зрозумілий операційній системі, що полегшує комунікацію між різними процесами.
### Ключові концепції
@ -243,13 +243,13 @@ android:host="example"
## Компоненти
Це включає: **Активності, Сервіси, Отримувачі трансляцій та Провайдери.**
До них відносяться: **Активності, Сервіси, Отримувачі трансляцій та Провайдери.**
### Активність запуску та інші активності
У Android-додатках **активності** подібні до екранів, що показують різні частини інтерфейсу користувача додатку. Додаток може мати багато активностей, кожна з яких представляє унікальний екран для користувача.
**Активність запуску** є основним шлюзом до додатку, запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними MAIN та LAUNCHER намірами:
**Активність запуску** є основним шлюзом до додатку, який запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними MAIN та LAUNCHER намірами:
```markup
<activity android:name=".LauncherActivity">
<intent-filter>
@ -266,7 +266,7 @@ android:host="example"
```
Однак доступ до активності з іншого додатку не завжди є ризиком для безпеки. Проблема виникає, якщо чутливі дані передаються неналежним чином, що може призвести до витоків інформації.
Життєвий цикл активності **починається з методу onCreate**, налаштовуючи UI та готуючи активність до взаємодії з користувачем.
Життєвий цикл активності **починається з методу onCreate**, налаштовуючи інтерфейс користувача та готуючи активність до взаємодії з користувачем.
### Підклас додатку
@ -358,7 +358,7 @@ JavaScript "Bridge" дозволяє Java об'єктам взаємодіяти
### **Цифровий підпис додатків**
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичне авторство** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, захищаючи від несанкціонованого доступу та забезпечуючи, щоб додаток залишався незмінним під час доставки на пристрій.
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичне авторство** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, захищаючи від несанкціонованого доступу та забезпечуючи, щоб додаток залишався незмінним під час його доставки на пристрій.
### **Перевірка додатків для підвищення безпеки**