From d66311cf9ce16f94a3b9b89020dd9c897696598e Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 28 Jul 2025 14:16:40 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/android-applic --- .../android-applications-basics.md | 171 ++++++++++++++---- 1 file changed, 138 insertions(+), 33 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md index 58f9daab4..ba9884dc3 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md +++ b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md @@ -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** są 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 Są **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 @@ -250,13 +250,13 @@ Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznac ```markdown ``` -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" /> ``` -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 @@ -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 [type value ...]` + +Typowe specyfikatory argumentów: +* `i32 ` – wartość 32-bitowa ze znakiem +* `i64 ` – wartość 64-bitowa ze znakiem +* `s16 ` – 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}}