Translated ['src/mobile-pentesting/android-app-pentesting/android-applic

This commit is contained in:
Translator 2025-07-28 14:16:40 +00:00
parent 493aa7771e
commit d66311cf9c

View File

@ -7,11 +7,11 @@
**Istnieją dwie warstwy:**
- **OS**, który utrzymuje zainstalowane aplikacje w izolacji od siebie.
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie pewnych funkcjonalności** i konfiguruje możliwości aplikacji.
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie określonych funkcjonalności** i konfiguruje możliwości aplikacji.
### Separacja UID
**Każdej aplikacji przypisany jest specyficzny identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub plikami współdzielonymi**. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
**Każdej aplikacji przypisany jest określony identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub z plikami współdzielonymi**. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
### Współdzielenie UID
@ -36,8 +36,8 @@ Element uprawnienia ma trzy atrybuty:
- **poziom ochrony**, który wskazuje, jak przyznawane są uprawnienia. Istnieją cztery typy:
- **Normalne**: Używane, gdy **nie ma znanych zagrożeń** dla aplikacji. Użytkownik **nie musi ich zatwierdzać**.
- **Niebezpieczne**: Wskazuje, że uprawnienie przyznaje żądającej aplikacji pewien **podwyższony dostęp**. **Użytkownicy są proszeni o ich zatwierdzenie**.
- **Podpis**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent, mogą otrzymać uprawnienie. To najsilniejszy typ ochrony.
- **PodpisLubSystem**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent lub **aplikacje działające z dostępem na poziomie systemu** mogą otrzymać uprawnienia.
- **Podpisane**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent, mogą otrzymać uprawnienie. To najsilniejszy typ ochrony.
- **Podpisane lub systemowe**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent lub **aplikacje działające z dostępem na poziomie systemu** mogą otrzymać uprawnienia.
## Aplikacje Wstępnie Zainstalowane
@ -57,7 +57,7 @@ Gdy binarny plik su jest skonfigurowany, używana jest inna aplikacja Android do
> [!OSTRZEŻENIE]
> Należy pamiętać, że proces rootowania jest bardzo niebezpieczny i może poważnie uszkodzić urządzenie.
### ROM-y
### ROMy
Możliwe jest **zastąpienie systemu operacyjnego instalując niestandardowe oprogramowanie**. Dzięki temu można wydłużyć użyteczność starego urządzenia, obejść ograniczenia oprogramowania lub uzyskać dostęp do najnowszego kodu Androida.\
**OmniROM** i **LineageOS** to dwa z najpopularniejszych oprogramowań do użycia.
@ -91,15 +91,15 @@ Gdy urządzenie jest zrootowane, każda aplikacja może żądać dostępu jako r
- res/
- Zawiera zasoby, które nie są skompilowane w resources.arsc.
### **Dalvik & Smali**
### **Dalvik i Smali**
W rozwoju Androida, **Java lub Kotlin** używane do tworzenia aplikacji. Zamiast używać JVM jak w aplikacjach desktopowych, Android kompiluje ten kod do **bajtkodu Dalvik Executable (DEX)**. Wcześniej, maszyna wirtualna Dalvik obsługiwała ten bajtkod, ale teraz, w nowszych wersjach Androida, przejmuje go Android Runtime (ART).
W rozwoju Androida, **Java lub Kotlin** jest używane do tworzenia aplikacji. Zamiast używać JVM jak w aplikacjach desktopowych, Android kompiluje ten kod do **bajtkodu Dalvik (DEX)**. Wcześniej, maszyna wirtualna Dalvik obsługiwała ten bajtkod, ale teraz, w nowszych wersjach Androida, przejmuje go Android Runtime (ART).
Dla inżynierii odwrotnej, **Smali** staje się kluczowy. To czytelna dla człowieka wersja bajtkodu DEX, działająca jak język asemblera, tłumacząc kod źródłowy na instrukcje bajtkodu. Smali i baksmali odnoszą się do narzędzi asemblera i deasemblacji w tym kontekście.
Dla inżynierii odwrotnej, **Smali** staje się kluczowe. To czytelna dla człowieka wersja bajtkodu DEX, działająca jak język asemblera, tłumacząc kod źródłowy na instrukcje bajtkodu. Smali i baksmali odnoszą się do narzędzi asemblera i deasemblacji w tym kontekście.
## Intencje
Intencje są głównym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
Intencje są podstawowym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
Tak więc intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
Aby uprościć, intencja może być używana:
@ -114,11 +114,11 @@ Jeśli są podatne, **intencje mogą być używane do przeprowadzania różnych
### Filtr Intencji
**Filtry Intencji** definiują **jak aktywność, usługa lub Odbiornik Transmisji mogą interagować z różnymi typami Intencji**. Zasadniczo opisują one możliwości tych komponentów, takie jak jakie akcje mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem do deklarowania tych filtrów jest plik **AndroidManifest.xml**, chociaż dla Odbiorników Transmisji, kodowanie ich również jest opcją.
**Filtry Intencji** definiują **jak aktywność, usługa lub odbiornik transmisji mogą interagować z różnymi typami intencji**. Zasadniczo opisują one możliwości tych komponentów, takie jak jakie akcje mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem do deklarowania tych filtrów jest plik **AndroidManifest.xml**, chociaż dla odbiorników transmisji, kodowanie ich również jest opcją.
Filtry Intencji składają się z kategorii, akcji i filtrów danych, z możliwością dodania dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne intencje, które pasują do zadeklarowanych kryteriów.
Filtry intencji składają się z kategorii, akcji i filtrów danych, z możliwością dodania dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne intencje, które pasują do zadeklarowanych kryteriów.
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Jednak istnieje sposób, aby deweloperzy wyraźnie utrzymali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Istnieje jednak sposób, aby deweloperzy wyraźnie zachowali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
Ponadto, deweloperzy mają możliwość dalszego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
```java
@ -132,7 +132,7 @@ Intencje są programowo tworzone za pomocą konstruktora Intent:
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
**Akcja** wcześniej zadeklarowanego zamiaru to **ACTION_SEND**, a **Dodatkowe** to mailto **Uri** (Dodatkowe to dodatkowe informacje, których oczekuje zamiar).
**Akcja** wcześniej zadeklarowanego zamiaru to **ACTION_SEND**, a **Extra** to mailto **Uri** (Extra to dodatkowe informacje, których oczekuje zamiar).
Ten zamiar powinien być zadeklarowany w manifeście, jak w poniższym przykładzie:
```xml
@ -145,11 +145,11 @@ Ten zamiar powinien być zadeklarowany w manifeście, jak w poniższym przykład
```
Filtr intencji musi pasować do **akcji**, **danych** i **kategorii**, aby odebrać wiadomość.
Proces "rozwiązywania intencji" określa, która aplikacja powinna odebrać każdą wiadomość. Proces ten uwzględnia **atrybut priorytetu**, który można ustawić w **deklaracji filtru intencji**, a **ten z wyższym priorytetem zostanie wybrany**. Ten priorytet można ustawić w zakresie od -1000 do 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli wystąpi **konflikt**, pojawia się okno "wyboru", aby **użytkownik mógł zdecydować**.
Proces "rozwiązywania intencji" określa, która aplikacja powinna odebrać każdą wiadomość. Proces ten uwzględnia **atrybut priorytetu**, który można ustawić w **deklaracji filtru intencji**, a **ten z wyższym priorytetem zostanie wybrany**. Priorytet można ustawić w zakresie od -1000 do 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli wystąpi **konflikt**, pojawia się okno "wyboru", aby **użytkownik mógł zdecydować**.
### Wyraźne intencje
### Jawne intencje
Wyraźna intencja określa nazwę klasy, którą celuje:
Jawna intencja określa nazwę klasy, którą celuje:
```java
Intent downloadIntent = new (this, DownloadService.class):
```
@ -161,7 +161,7 @@ context.startService(intent);
```
### Pending Intents
Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikacji**, używając tożsamości i uprawnień twojej aplikacji. Tworząc Pending Intent, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest Explicit** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja mogłaby wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikacji**, używając tożsamości i uprawnień twojej aplikacji. Konstruując Pending Intent, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest Explicit** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja mogłaby wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
### Broadcast Intents
@ -172,7 +172,7 @@ Alternatywnie, możliwe jest również **określenie uprawnienia podczas wysyła
**dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuszcza aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
### Sticky Broadcasts
@ -213,7 +213,7 @@ Aby uzyskać do niego dostęp z sieci, można ustawić link jak:
```
Aby znaleźć **kod, który będzie wykonywany w aplikacji**, przejdź do aktywności wywoływanej przez deeplink i poszukaj funkcji **`onNewIntent`**.
Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](#exploiting-schemes-deep-links).
Dowiedz się, jak [wywoływać deeplinki bez użycia stron HTML](#exploiting-schemes-deep-links).
## AIDL - Android Interface Definition Language
@ -235,7 +235,7 @@ Obejmują: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
W aplikacjach Android **aktywności** są jak ekrany, pokazujące różne części interfejsu użytkownika aplikacji. Aplikacja może mieć wiele aktywności, z których każda prezentuje unikalny ekran dla użytkownika.
**Aktywność uruchamiająca** jest głównym wejściem do aplikacji, uruchamianym po naciśnięciu ikony aplikacji. Jest zdefiniowana w pliku manifestu aplikacji z określonymi intencjami MAIN i LAUNCHER:
**Aktywność uruchamiająca** jest głównym wejściem do aplikacji, uruchamianym, gdy dotkniesz ikony aplikacji. Jest zdefiniowana w pliku manifestu aplikacji z określonymi intencjami MAIN i LAUNCHER:
```html
<activity android:name=".LauncherActivity">
<intent-filter>
@ -250,13 +250,13 @@ Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznac
```markdown
<service android:name=".ExampleExportedService" android:exported="true"/>
```
Jednak dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Obawy pojawiają się, jeśli wrażliwe dane są udostępniane niewłaściwie, co może prowadzić do wycieków informacji.
Jednak dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Obawy pojawiają się, gdy wrażliwe dane są udostępniane niewłaściwie, co może prowadzić do wycieków informacji.
Cykl życia aktywności **zaczyna się od metody onCreate**, która ustawia interfejs użytkownika i przygotowuje aktywność do interakcji z użytkownikiem.
### Podklasa Aplikacji
### Podklasa aplikacji
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem reszty aplikacji.
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem działania reszty aplikacji.
```java
public class MyApp extends Application {
@Override
@ -276,7 +276,7 @@ super.onCreate();
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na inne aplikacje, co sprawia, że usługi są kluczowe dla **długoterminowych operacji**.
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punktu wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używa się metody `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używana jest metoda `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto, usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
```xml
@ -286,17 +286,17 @@ Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danyc
**Broadcast receivers** działają jako słuchacze w systemie wiadomości, umożliwiając wielu aplikacjom reagowanie na te same wiadomości z systemu. Aplikacja może **zarejestrować odbiornik** na **dwa główne sposoby**: poprzez **Manifest** aplikacji lub **dynamicznie** w kodzie aplikacji za pomocą API **`registerReceiver`**. W Manifeście, transmisje są filtrowane za pomocą uprawnień, podczas gdy dynamicznie zarejestrowane odbiorniki mogą również określać uprawnienia podczas rejestracji.
**Filtry intencji** są kluczowe w obu metodach rejestracji, określając, które transmisje uruchamiają odbiornik. Gdy odpowiednia transmisja zostanie wysłana, metoda **`onReceive`** odbiornika jest wywoływana, co umożliwia aplikacji odpowiednią reakcję, na przykład dostosowanie zachowania w odpowiedzi na alert o niskim poziomie baterii.
**Filtry intencji** są kluczowe w obu metodach rejestracji, określając, które transmisje uruchamiają odbiornik. Gdy odpowiednia transmisja jest wysyłana, metoda **`onReceive`** odbiornika jest wywoływana, co umożliwia aplikacji odpowiednią reakcję, na przykład dostosowanie zachowania w odpowiedzi na alert o niskim poziomie naładowania baterii.
Transmisje mogą być **asynchroniczne**, docierając do wszystkich odbiorników bez kolejności, lub **synchronizowane**, gdzie odbiorniki otrzymują transmisję na podstawie ustalonych priorytetów. Ważne jest jednak, aby zauważyć potencjalne ryzyko bezpieczeństwa, ponieważ każda aplikacja może nadać sobie priorytet, aby przechwycić transmisję.
Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceive`** w jego klasie. Kod tej metody może manipulować otrzymanym Intentem, co podkreśla potrzebę walidacji danych przez odbiorniki, szczególnie w **Ordered Broadcasts**, które mogą modyfikować lub pomijać Intent.
Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceive`** w jego klasie. Kod tej metody może manipulować otrzymaną Intencją, co podkreśla potrzebę walidacji danych przez odbiorniki, szczególnie w **Ordered Broadcasts**, które mogą modyfikować lub odrzucać Intencję.
### Content Provider
**Content Providers** są niezbędne do **dzielenia się danymi strukturalnymi** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany za pomocą ustawień **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
**Content Providers** są niezbędne do **dzielenia się uporządkowanymi danymi** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany poprzez ustawienia **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()`, i `query()`, ułatwiając manipulację danymi i ich udostępnianie między aplikacjami.
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()` i `query()`, ułatwiając manipulację danymi i ich dzielenie się między aplikacjami.
**FileProvider**, wyspecjalizowany Content Provider, koncentruje się na bezpiecznym udostępnianiu plików. Jest definiowany w manifeście aplikacji z określonymi atrybutami do kontrolowania dostępu do folderów, oznaczonymi przez `android:exported` i `android:resource` wskazującymi na konfiguracje folderów. Należy zachować ostrożność przy udostępnianiu katalogów, aby uniknąć przypadkowego ujawnienia wrażliwych danych.
@ -310,7 +310,7 @@ android:exported="false">
android:resource="@xml/filepaths" />
</provider>
```
I przykład określania folderów udostępnionych w `filepaths.xml`:
I przykład określania folderów współdzielonych w `filepaths.xml`:
```xml
<paths>
<files-path path="images/" name="myimages" />
@ -330,13 +330,13 @@ Android oferuje dwa główne typy WebView:
- **WebViewClient** jest świetny do podstawowego HTML, ale nie obsługuje funkcji alert JavaScript, co wpływa na to, jak można testować ataki XSS.
- **WebChromeClient** działa bardziej jak pełne doświadczenie przeglądarki Chrome.
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą się ciasteczkami** z główną przeglądarką urządzenia.
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą ciasteczek** z główną przeglądarką urządzenia.
Do ładowania treści dostępne są metody takie jak `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ważne jest, aby upewnić się, że te adresy URL lub pliki są **bezpieczne do użycia**. Ustawienia zabezpieczeń można zarządzać za pomocą klasy `WebSettings`. Na przykład, wyłączenie JavaScript za pomocą `setJavaScriptEnabled(false)` może zapobiec atakom XSS.
Do ładowania treści dostępne są metody takie jak `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ważne jest, aby upewnić się, że te adresy URL lub pliki są **bezpieczne do użycia**. Ustawienia bezpieczeństwa można zarządzać za pomocą klasy `WebSettings`. Na przykład, wyłączenie JavaScript za pomocą `setJavaScriptEnabled(false)` może zapobiec atakom XSS.
JavaScript "Bridge" pozwala obiektom Java na interakcję z JavaScript, wymagając, aby metody były oznaczone jako `@JavascriptInterface` dla bezpieczeństwa od Androida 4.2 wzwyż.
Zezwolenie na dostęp do treści (`setAllowContentAccess(true)`) pozwala WebView na dostęp do Content Providers, co może stanowić ryzyko, chyba że adresy URL treści są weryfikowane jako bezpieczne.
Zezwolenie na dostęp do treści (`setAllowContentAccess(true)`) pozwala WebView na dostęp do Content Providers, co może stanowić ryzyko, chyba że adresy URL treści są zweryfikowane jako bezpieczne.
Aby kontrolować dostęp do plików:
@ -346,7 +346,7 @@ Aby kontrolować dostęp do plików:
### **Digital Signing of Applications**
- **Podpis cyfrowy** jest koniecznością dla aplikacji Android, zapewniając, że są one **autentycznie stworzone** przed instalacją. Proces ten wykorzystuje certyfikat do identyfikacji aplikacji i musi być weryfikowany przez menedżera pakietów urządzenia podczas instalacji. Aplikacje mogą być **podpisane samodzielnie lub certyfikowane przez zewnętrzne CA**, chroniąc przed nieautoryzowanym dostępem i zapewniając, że aplikacja pozostaje nienaruszona podczas dostarczania do urządzenia.
- **Podpis cyfrowy** jest koniecznością dla aplikacji Android, zapewniając, że są **autentycznie napisane** przed instalacją. Proces ten wykorzystuje certyfikat do identyfikacji aplikacji i musi być zweryfikowany przez menedżera pakietów urządzenia podczas instalacji. Aplikacje mogą być **podpisane samodzielnie lub certyfikowane przez zewnętrzne CA**, chroniąc przed nieautoryzowanym dostępem i zapewniając, że aplikacja pozostaje nienaruszona podczas dostarczania do urządzenia.
### **App Verification for Enhanced Security**
@ -365,4 +365,109 @@ if (dpm.isAdminActive(adminComponent)) {
dpm.setPasswordMinimumLength(adminComponent, 8);
}
```
## Enumerowanie i wykorzystywanie usług AIDL / Binder
Android *Binder* IPC udostępnia wiele **usług systemowych i dostarczanych przez dostawców**. Usługi te stają się **powierzchnią ataku**, gdy są eksportowane bez odpowiedniej kontroli uprawnień (warstwa AIDL sama w sobie *nie* wykonuje kontroli dostępu).
### 1. Odkrywanie działających usług
```bash
# from an adb shell (USB or wireless)
service list # simple one-liner
am list services # identical output, ActivityManager wrapper
```
1. Wprowadzenie do testowania aplikacji mobilnych
2. Zrozumienie architektury aplikacji Android
3. Kluczowe komponenty aplikacji Android
4. Proces instalacji aplikacji na urządzeniu Android
5. Analiza manifestu aplikacji
6. Zrozumienie uprawnień aplikacji
7. Techniki inżynierii odwrotnej
8. Narzędzia do testowania aplikacji mobilnych
9. Wykrywanie luk w zabezpieczeniach
10. Przykłady ataków na aplikacje Android
```
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
146 wifi : [android.net.wifi.IWifiManager]
```
* **Indeks** (pierwsza kolumna) jest przypisywany w czasie wykonywania ***nie*** polegaj na nim po ponownych uruchomieniach.
* **Nazwa Binder** (np. `mtkconnmetrics`) to to, co zostanie przekazane do `service call`.
* Wartość wewnątrz nawiasów to w pełni kwalifikowany **interfejs AIDL**, z którego został wygenerowany stub.
### 2. Uzyskaj opis interfejsu (PING)
Każdy stub Binder automatycznie implementuje **kod transakcji `0x5f4e5446`** (`1598968902` w systemie dziesiętnym, ASCII "_NTF").
```bash
# "ping" the service
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
```
Aby uzyskać ważną odpowiedź, interfejs musi być zwrócony jako ciąg UTF-16 zakodowany wewnątrz `Parcel`.
### 3. Wywoływanie transakcji
Składnia: `service call <name> <code> [type value ...]`
Typowe specyfikatory argumentów:
* `i32 <int>` wartość 32-bitowa ze znakiem
* `i64 <long>` wartość 64-bitowa ze znakiem
* `s16 <string>` ciąg UTF-16 (Android 13+ używa `utf16`)
Przykład rozpocznij monitorowanie sieci z uid **1** na urządzeniu MediaTek:
```bash
service call mtkconnmetrics 8 i32 1
```
### 4. Brute-forcing unknown methods
Gdy pliki nagłówkowe są niedostępne, możesz **iterować kod** aż do momentu, gdy błąd zmieni się z:
```
Result: Parcel(00000000 00000000) # "Not a data message"
```
do normalnej odpowiedzi `Parcel` lub `SecurityException`.
```bash
for i in $(seq 1 50); do
printf "[+] %2d -> " $i
service call mtkconnmetrics $i 2>/dev/null | head -1
done
```
Jeśli usługa została skompilowana **z proguard**, mapowanie musi być odgadnięte zobacz następny krok.
### 5. Mapowanie kodów ↔ metod za pomocą onTransact()
Dezkompiluj jar/odex, który implementuje interfejs (dla stubów AOSP sprawdź `/system/framework`; OEM-y często używają `/system_ext` lub `/vendor`).
Szukaj `Stub.onTransact()` zawiera ogromny `switch(transactionCode)`:
```java
case TRANSACTION_updateCtaAppStatus: // 5
data.enforceInterface(DESCRIPTOR);
int appId = data.readInt();
boolean ok = data.readInt() != 0;
updateCtaAppStatus(appId, ok);
reply.writeNoException();
return true;
```
Teraz prototyp i **typy parametrów** są całkowicie jasne.
### 6. Wykrywanie brakujących sprawdzeń uprawnień
Implementacja (często klasa wewnętrzna `Impl`) jest odpowiedzialna za autoryzację:
```java
private void updateCtaAppStatus(int uid, boolean status) {
if (!isPermissionAllowed()) {
throw new SecurityException("uid " + uid + " rejected");
}
/* privileged code */
}
```
Brak takiej logiki lub biała lista uprzywilejowanych UID (np. `uid == 1000 /*system*/`) jest **wskaźnikiem podatności**.
Studium przypadku *MediaTek* `startMonitorProcessWithUid()` (transakcja **8**) w pełni wykonuje wiadomość Netlink **bez** żadnej bramy uprawnień, co pozwala nieuprzywilejowanej aplikacji na interakcję z modułem Netfilter jądra i spamowanie dziennika systemowego.
### 7. Automatyzacja oceny
Narzędzia / skrypty, które przyspieszają rozpoznawanie Binder:
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) udostępnia `/dev/binderfs` z węzłami per-usługa
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) przeszukuje tabelę binder i drukuje ACL
* Skrót Frida: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
---
## Odniesienia
- [Android Services 101 Pentest Partners](https://www.pentestpartners.com/security-blog/android-services-101/)
- [Android Developer Docs AIDL](https://developer.android.com/guide/components/aidl)
- [Android Developer Docs IBinder](https://developer.android.com/reference/android/os/IBinder)
- [Understanding Binder, Talk @ Google](https://www.youtube.com/watch?v=O-UHvFjxwZ8)
{{#include ../../banners/hacktricks-training.md}}