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 30eebde6a..723aada14 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md +++ b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md @@ -9,18 +9,18 @@ - **OS**, koji drži instalirane aplikacije izolovane jedna od druge. - **sama aplikacija**, koja omogućava programerima da **izlože određene funkcionalnosti** i konfigurišu mogućnosti aplikacije. -### UID Razdvajanje +### Razdvajanje UID -**Svakoj aplikaciji se dodeljuje specifični User ID**. Ovo se dešava tokom instalacije aplikacije tako da **aplikacija može da komunicira samo sa datotekama koje pripadaju njenom User ID-u ili deljenim** datotekama. Stoga, samo sama aplikacija, određeni delovi OS-a i root korisnik mogu pristupiti podacima aplikacije. +**Svakoj aplikaciji se dodeljuje specifični ID korisnika**. Ovo se dešava tokom instalacije aplikacije tako da **aplikacija može da komunicira samo sa datotekama koje pripadaju njenom ID-u korisnika ili deljenim** datotekama. Stoga, samo sama aplikacija, određene komponente OS-a i root korisnik mogu pristupiti podacima aplikacije. -### UID Deljenje +### Deljenje UID **Dve aplikacije mogu biti konfigurisane da koriste isti UID**. Ovo može biti korisno za deljenje informacija, ali ako je jedna od njih kompromitovana, podaci obe aplikacije će biti kompromitovani. Zato se ovo ponašanje **ne preporučuje**.\ -**Da bi delile isti UID, aplikacije moraju definisati istu `android:sharedUserId` vrednost u svojim manifestima.** +**Da bi delile isti UID, aplikacije moraju definisati istu vrednost `android:sharedUserId` u svojim manifestima.** -### Sandbox +### Sandboxing -**Android Application Sandbox** omogućava da se **svaka aplikacija** pokreće kao **poseban proces pod posebnim korisničkim ID-om**. Svaki proces ima svoju virtuelnu mašinu, tako da se kod aplikacije izvršava u izolaciji od drugih aplikacija.\ +**Android aplikacioni sandbox** omogućava da se **svaka aplikacija** pokreće kao **poseban proces pod posebnim ID-om korisnika**. Svaki proces ima svoju virtuelnu mašinu, tako da se kod aplikacije izvršava u izolaciji od drugih aplikacija.\ Od Android 5.0(L) **SELinux** se primenjuje. U suštini, SELinux je odbio sve interakcije procesa i zatim stvorio politike da **dozvoli samo očekivane interakcije između njih**. ### Dozvole @@ -33,11 +33,11 @@ Element dozvole ima tri atributa: - **ime** dozvole - **permission-group** atribut, koji omogućava grupisanje povezanih dozvola. -- **protection-level** koji označava kako se dozvole dodeljuju. Postoje četiri vrste: +- **protection-level** koji označava kako se dozvole dodeljuju. Postoje četiri tipa: - **Normal**: Koristi se kada nema **poznatih pretnji** za aplikaciju. Korisnik **nije obavezan da je odobri**. -- **Dangerous**: Ukazuje da dozvola dodeljuje traženoj aplikaciji neki **povišeni pristup**. **Korisnici se traže da ih odobre**. -- **Signature**: Samo **aplikacije potpisane istim sertifikatom kao onaj** koji izlaže komponentu mogu dobiti dozvolu. Ovo je najjači tip zaštite. -- **SignatureOrSystem**: Samo **aplikacije potpisane istim sertifikatom kao onaj** koji izlaže komponentu ili **aplikacije koje rade sa pristupom na sistemskom nivou** mogu dobiti dozvole. +- **Dangerous**: Ukazuje da dozvola dodeljuje tražećoj aplikaciji neku **povišenu pristupnost**. **Korisnici se traže da ih odobre**. +- **Signature**: Samo **aplikacije potpisane istim sertifikatom kao onaj** koji izvozi komponentu mogu dobiti dozvolu. Ovo je najjači tip zaštite. +- **SignatureOrSystem**: Samo **aplikacije potpisane istim sertifikatom kao onaj** koji izvozi komponentu ili **aplikacije koje rade sa pristupom na sistemskom nivou** mogu dobiti dozvole. ## Preinstalirane Aplikacije @@ -50,7 +50,7 @@ Ove aplikacije se obično nalaze u **`/system/app`** ili **`/system/priv-app`** ## Rootovanje Da biste dobili root pristup na fizičkom android uređaju, obično morate **iskoristiti** 1 ili 2 **ranjivosti** koje su obično **specifične** za **uređaj** i **verziju**.\ -Kada eksploatacija uspe, obično se Linux `su` binarni fajl kopira na lokaciju koja je navedena u korisničkoj PATH env varijabli kao što je `/system/xbin`. +Kada je eksploatacija uspela, obično se Linux `su` binarni fajl kopira na lokaciju koja je navedena u korisničkoj PATH env varijabli kao što je `/system/xbin`. Kada je su binarni fajl konfiguran, koristi se druga Android aplikacija za interakciju sa `su` binarnim fajlom i **obrađivanje zahteva za root pristup** kao što su **Superuser** i **SuperSU** (dostupni u Google Play prodavnici). @@ -66,11 +66,11 @@ Napomena da **nije uvek potrebno rootovati uređaj** da bi se instalirao prilago ### Implikaacije -Kada je uređaj rootovan, svaka aplikacija može zatražiti pristup kao root. Ako zlonamerna aplikacija dobije taj pristup, moći će da pristupi gotovo svemu i moći će da ošteti telefon. +Kada je uređaj rootovan, svaka aplikacija može zatražiti pristup kao root. Ako zlonamerna aplikacija dobije taj pristup, imaće pristup gotovo svemu i moći će da ošteti telefon. -## Osnovni principi Android Aplikacija +## Osnovni principi Android aplikacija -- Format Android aplikacija se naziva _APK format datoteke_. To je u suštini **ZIP datoteka** (preimenovanjem ekstenzije datoteke u .zip, sadržaj se može ekstrahovati i pregledati). +- Format Android aplikacija se naziva _APK format datoteke_. U suštini, to je **ZIP datoteka** (preimenovanjem ekstenzije datoteke u .zip, sadržaj se može izdvojiti i pregledati). - Sadržaj APK-a (nije iscrpan) - **AndroidManifest.xml** - resources.arsc/strings.xml @@ -81,21 +81,21 @@ Kada je uređaj rootovan, svaka aplikacija može zatražiti pristup kao root. Ak - **classes.dex** - Sadrži Dalvik bajtkod, koji predstavlja kompajlirani Java (ili Kotlin) kod koji aplikacija izvršava po defaultu. - lib/ -- Sadrži native biblioteke, razdvojene po CPU arhitekturi u poddirektorijumima. +- Sadrži nativne biblioteke, razdvojene po CPU arhitekturi u poddirektorijumima. - `armeabi`: kod za ARM procesore - `armeabi-v7a`: kod za ARMv7 i više procesore - `x86`: kod za X86 procesore - `mips`: kod samo za MIPS procesore - assets/ -- Čuva razne datoteke potrebne aplikaciji, potencijalno uključujući dodatne native biblioteke ili DEX datoteke, ponekad korišćene od strane autora malvera za prikrivanje dodatnog koda. +- Čuva razne datoteke potrebne aplikaciji, potencijalno uključujući dodatne nativne biblioteke ili DEX datoteke, ponekad korišćene od strane autora malvera za prikrivanje dodatnog koda. - res/ - Sadrži resurse koji nisu kompajlirani u resources.arsc. ### **Dalvik & Smali** -U Android razvoju, **Java ili Kotlin** se koriste za kreiranje aplikacija. Umesto korišćenja JVM-a kao u desktop aplikacijama, Android kompajlira ovaj kod u **Dalvik Executable (DEX) bajtkod**. Ranije je Dalvik virtuelna mašina obrađivala ovaj bajtkod, ali sada, Android Runtime (ART) preuzima u novijim verzijama Android-a. +U Android razvoju, **Java ili Kotlin** se koriste za kreiranje aplikacija. Umesto korišćenja JVM-a kao u desktop aplikacijama, Android kompajlira ovaj kod u **Dalvik izvršne (DEX) bajtkod**. Ranije je Dalvik virtuelna mašina obrađivala ovaj bajtkod, ali sada, Android Runtime (ART) preuzima u novijim verzijama Android-a. -Za obrnuto inženjerstvo, **Smali** postaje ključan. To je ljudski čitljiva verzija DEX bajtkoda, koja deluje kao asemberski jezik prevodeći izvorni kod u bajtkod instrukcije. Smali i baksmali se odnose na alate za asembler i disassembler u ovom kontekstu. +Za obrnuto inženjerstvo, **Smali** postaje ključan. To je ljudski čitljiva verzija DEX bajtkoda, koja deluje kao asemblažni jezik prevodeći izvorni kod u instrukcije bajtkoda. Smali i baksmali se odnose na alate za asemblažu i disasembliranje u ovom kontekstu. ## Intenti @@ -114,11 +114,11 @@ Ako su ranjivi, **Intenti se mogu koristiti za izvođenje raznih napada**. ### Intent-Filter -**Intent Filteri** definišu **kako aktivnost, usluga ili Broadcast Receiver mogu interagovati sa različitim tipovima Intenta**. U suštini, oni opisuju mogućnosti ovih komponenti, kao što su koje akcije mogu izvršiti ili koje vrste emitovanja mogu obraditi. Primarno mesto za deklarisanje ovih filtera je unutar **AndroidManifest.xml datoteke**, iako je za Broadcast Receivere kodiranje takođe opcija. +**Intent Filteri** definišu **kako aktivnost, usluga ili Broadcast Receiver mogu interagovati sa različitim tipovima Intent-a**. U suštini, oni opisuju mogućnosti ovih komponenti, kao što su koje akcije mogu izvršiti ili koje vrste emitovanja mogu obraditi. Primarno mesto za deklarisanje ovih filtera je unutar **AndroidManifest.xml datoteke**, iako je kodiranje za Broadcast Receivere takođe opcija. Intent Filteri se sastoje od kategorija, akcija i filtera podataka, sa mogućnošću uključivanja dodatnih metapodataka. Ova postavka omogućava komponentama da obrađuju specifične Intente koji se poklapaju sa deklarisanim kriterijumima. -Kritičan aspekt Android komponenti (aktivnosti/usluge/content provideri/broadcast receiveri) je njihova vidljivost ili **javnost**. Komponenta se smatra javnom i može interagovati sa drugim aplikacijama ako je **`exported`** sa vrednošću **`true`** ili ako je Intent Filter deklarisan za nju u manifestu. Međutim, postoji način za programere da eksplicitno zadrže ove komponente privatnim, osiguravajući da ne interaguju sa drugim aplikacijama nenamerno. Ovo se postiže postavljanjem **`exported`** atributa na **`false`** u njihovim manifest definicijama. +Kritičan aspekt Android komponenti (aktivnosti/usluge/provideri sadržaja/broadcast receiveri) je njihova vidljivost ili **javnost**. Komponenta se smatra javnom i može interagovati sa drugim aplikacijama ako je **`exported`** sa vrednošću **`true`** ili ako je za nju deklarisan Intent Filter u manifestu. Međutim, postoji način za programere da eksplicitno zadrže ove komponente privatnim, osiguravajući da ne interaguju sa drugim aplikacijama nenamerno. Ovo se postiže postavljanjem **`exported`** atributa na **`false`** u njihovim manifest definicijama. Pored toga, programeri imaju opciju da dodatno osiguraju pristup ovim komponentama zahtevajući specifične dozvole. **`permission`** atribut može biti postavljen da osigura da samo aplikacije sa dodeljenom dozvolom mogu pristupiti komponenti, dodajući dodatni sloj sigurnosti i kontrole nad tim ko može da interaguje sa njom. ```java @@ -134,7 +134,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); ``` **Akcija** prethodno deklarisanog namera je **ACTION_SEND** i **Ekstra** je mailto **Uri** (Ekstra je dodatna informacija koju namera očekuje). -Ova namera treba da bude deklarisana unutar manifest-a kao u sledećem primeru: +Ova namera treba da bude deklarisana unutar manifesta kao u sledećem primeru: ```xml @@ -145,7 +145,7 @@ Ova namera treba da bude deklarisana unutar manifest-a kao u sledećem primeru: ``` An intent-filter treba da odgovara **akciji**, **podacima** i **kategoriji** da bi primio poruku. -Proces "rezolucije intencija" određuje koja aplikacija treba da primi svaku poruku. Ovaj proces uzima u obzir **atribut prioriteta**, koji može biti postavljen u **deklaraciji intent-filter-a**, i **ona sa višim prioritetom će biti odabrana**. Ovaj prioritet može biti postavljen između -1000 i 1000, a aplikacije mogu koristiti `SYSTEM_HIGH_PRIORITY` vrednost. Ako dođe do **konflikta**, pojavljuje se "chooser" prozor kako bi **korisnik mogao da odluči**. +Proces "rezolucije intencija" određuje koja aplikacija treba da primi svaku poruku. Ovaj proces uzima u obzir **atribut prioriteta**, koji može biti postavljen u **deklaraciji intent-filter-a**, i **onaj sa višim prioritetom će biti izabran**. Ovaj prioritet može biti postavljen između -1000 i 1000, a aplikacije mogu koristiti `SYSTEM_HIGH_PRIORITY` vrednost. Ako dođe do **konflikta**, pojavljuje se "chooser" prozor kako bi **korisnik mogao da odluči**. ### Eksplicitne Intencije @@ -161,30 +161,30 @@ context.startService(intent); ``` ### Pending Intents -Oni omogućavaju drugim aplikacijama da **preuzmu akcije u ime vaše aplikacije**, koristeći identitet i dozvole vaše aplikacije. Prilikom konstruisanja Pending Intent-a, treba **navesti intent i akciju koja se izvršava**. Ako **deklarisani intent nije Eksplicitan** (ne navodi koji intent može da ga pozove), **maliciozna aplikacija bi mogla da izvrši deklarisanu akciju** u ime žrtvinske aplikacije. Štaviše, **ako akcija nije navedena**, maliciozna aplikacija će moći da izvrši **bilo koju akciju u ime žrtve**. +Oni omogućavaju drugim aplikacijama da **preduzimaju akcije u ime vaše aplikacije**, koristeći identitet i dozvole vaše aplikacije. Prilikom konstruisanja Pending Intent-a, **treba da se specificira intent i akcija koja će se izvršiti**. Ako **deklarisani intent nije eksplicitan** (ne navodi koji intent može da ga pozove), **maliciozna aplikacija bi mogla da izvrši deklarisanu akciju** u ime žrtvovane aplikacije. Štaviše, **ako akcija nije specificirana**, maliciozna aplikacija će moći da izvrši **bilo koju akciju u ime žrtve**. ### Broadcast Intents -Za razliku od prethodnih intent-a, koji se primaju samo od jedne aplikacije, broadcast intent-i **mogu biti primljeni od više aplikacija**. Međutim, od API verzije 14, **moguće je odrediti aplikaciju koja treba da primi** poruku koristeći Intent.setPackage. +Za razliku od prethodnih intent-a, koji se primaju samo od jedne aplikacije, broadcast intent-i **mogu biti primljeni od više aplikacija**. Međutim, od API verzije 14, **moguće je specificirati aplikaciju koja treba da primi** poruku koristeći Intent.setPackage. -Alternativno, takođe je moguće **navesti dozvolu prilikom slanja broadcast-a**. Aplikacija primaoc će morati da ima tu dozvolu. +Alternativno, takođe je moguće **specificirati dozvolu prilikom slanja broadcast-a**. Aplikacija primaoc će morati da ima tu dozvolu. -Postoje **dva tipa** Broadcast-a: **Normalni** (asinkroni) i **Poručeni** (sinhroni). **Redosled** se zasniva na **konfigurisanoj prioritetu unutar elementa primaoca**. **Svaka aplikacija može obraditi, preneti ili odbaciti Broadcast.** +Postoje **dva tipa** Broadcast-a: **Normalni** (asinkroni) i **Ordered** (sinhroni). **Redosled** se zasniva na **konfigurisanoj prioritetu unutar elementa primaoca**. **Svaka aplikacija može obraditi, preneti ili odbaciti Broadcast.** -Moguće je **poslati** **broadcast** koristeći funkciju `sendBroadcast(intent, receiverPermission)` iz klase `Context`.\ +Moguće je **poslati** **broadcast** koristeći funkciju `sendBroadcast(intent, receiverPermission)` iz `Context` klase.\ Takođe možete koristiti funkciju **`sendBroadcast`** iz **`LocalBroadCastManager`** koja osigurava da **poruka nikada ne napusti aplikaciju**. Koristeći ovo, nećete ni morati da izvozite komponentu primaoca. ### Sticky Broadcasts Ova vrsta Broadcast-a **može se pristupiti dugo nakon što su poslati**.\ -Oni su obeleženi kao zastareli u API nivou 21 i preporučuje se da **ih ne koristite**.\ +Oni su deprecated u API nivou 21 i preporučuje se da **ih ne koristite**.\ **Oni omogućavaju bilo kojoj aplikaciji da prisluškuje podatke, ali i da ih modifikuje.** Ako pronađete funkcije koje sadrže reč "sticky" kao što su **`sendStickyBroadcast`** ili **`sendStickyBroadcastAsUser`**, **proverite uticaj i pokušajte da ih uklonite**. ## Deep links / URL schemes -U Android aplikacijama, **deep links** se koriste za pokretanje akcije (Intent) direktno putem URL-a. To se postiže deklarisanjem specifičnog **URL shema** unutar aktivnosti. Kada Android uređaj pokuša da **pristupi URL-u sa ovom shemom**, određena aktivnost unutar aplikacije se pokreće. +U Android aplikacijama, **deep links** se koriste za pokretanje akcije (Intent) direktno putem URL-a. To se postiže deklarisanjem specifičnog **URL shema** unutar aktivnosti. Kada Android uređaj pokuša da **pristupi URL-u sa ovom shemom**, specificirana aktivnost unutar aplikacije se pokreće. Shema mora biti deklarisana u **`AndroidManifest.xml`** datoteci: ```xml @@ -198,7 +198,7 @@ Shema mora biti deklarisana u **`AndroidManifest.xml`** datoteci: [...] ``` -Šema iz prethodnog primera je `examplescheme://` (napomena takođe **`kategorija BROWSABLE`**) +Šema iz prethodnog primera je `examplescheme://` (napomena takođe **`category BROWSABLE`**) Zatim, u polju podataka, možete navesti **host** i **path**: ```xml @@ -225,7 +225,7 @@ Saznajte kako da [pozovete deep linkove bez korišćenja HTML stranica](#exploit - **Messenger**: Kao povezani servis, Messenger olakšava IPC sa fokusom na obradu podataka putem metode `onBind`. Bitno je pažljivo pregledati ovu metodu zbog bilo kakvog nesigurnog rukovanja podacima ili izvršavanja osetljivih funkcija. -- **Binder**: Iako je direktna upotreba klase Binder manje uobičajena zbog AIDL-ove apstrakcije, korisno je razumeti da Binder deluje kao drajver na nivou kernela koji olakšava prenos podataka između memorijskih prostora različitih procesa. Za dalju pomoć, resurs je dostupan na [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8). +- **Binder**: Iako je direktna upotreba klase Binder manje uobičajena zbog apstrakcije AIDL-a, korisno je razumeti da Binder deluje kao drajver na nivou jezgra koji olakšava prenos podataka između memorijskih prostora različitih procesa. Za dalju pomoć, resurs je dostupan na [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8). ## Komponente @@ -235,7 +235,7 @@ Ove uključuju: **Aktivnosti, Servise, Broadcast Receivere i Provajdere.** U Android aplikacijama, **aktivnosti** su poput ekrana, prikazujući različite delove korisničkog interfejsa aplikacije. Aplikacija može imati mnogo aktivnosti, od kojih svaka predstavlja jedinstveni ekran za korisnika. -**Aktivnost pokretača** je glavni ulaz u aplikaciju, pokreće se kada dodirnete ikonu aplikacije. Definisana je u manifest fajlu aplikacije sa specifičnim MAIN i LAUNCHER intencijama: +**Aktivnost pokretača** je glavni ulaz u aplikaciju, pokreće se kada dodirnete ikonu aplikacije. Definisana je u manifestu aplikacije sa specifičnim MAIN i LAUNCHER namerama: ```html @@ -244,9 +244,9 @@ U Android aplikacijama, **aktivnosti** su poput ekrana, prikazujući različite ``` -Не све апликације требају активност покретача, посебно оне без корисничког интерфејса, као што су позадинске услуге. +Неће све апликације требати активност покретача, посебно оне без корисничког интерфејса, као што су позадинске услуге. -Активности могу бити доступне другим апликацијама или процесима означавањем као "извозне" у манифесту. Ова подешавања омогућавају другим апликацијама да покрену ову активност: +Активности могу бити доступне другим апликацијама или процесима означавањем као "извозне" у манифесту. Овај параметар омогућава другим апликацијама да покрену ову активност: ```markdown ``` @@ -274,19 +274,19 @@ super.onCreate(); ``` ### Usluge -[Usluge](https://developer.android.com/guide/components/services) su **pozadinski operativci** sposobni za izvršavanje zadataka bez korisničkog interfejsa. Ovi zadaci mogu nastaviti da se izvršavaju čak i kada korisnici pređu na različite aplikacije, što usluge čini ključnim za **dugotrajne operacije**. +[Usluge](https://developer.android.com/guide/components/services) su **pozadinske operacije** sposobne za izvršavanje zadataka bez korisničkog interfejsa. Ovi zadaci mogu nastaviti da se izvršavaju čak i kada korisnici pređu na različite aplikacije, što usluge čini ključnim za **dugotrajne operacije**. Usluge su svestrane; mogu se pokrenuti na različite načine, pri čemu su **Intents** primarna metoda za njihovo pokretanje kao ulaznu tačku aplikacije. Kada se usluga pokrene koristeći metodu `startService`, njena metoda `onStart` se aktivira i nastavlja da radi dok se ne pozove metoda `stopService`. Alternativno, ako je uloga usluge zavisna od aktivne klijentske veze, koristi se metoda `bindService` za povezivanje klijenta sa uslugom, angažujući metodu `onBind` za prenos podataka. -Zanimljiva primena usluga uključuje reprodukciju muzike u pozadini ili preuzimanje mrežnih podataka bez ometanja interakcije korisnika sa aplikacijom. Pored toga, usluge se mogu učiniti dostupnim drugim procesima na istom uređaju putem **izvoza**. Ovo nije podrazumevano ponašanje i zahteva eksplicitnu konfiguraciju u Android Manifest datoteci: +Zanimljiva primena usluga uključuje reprodukciju muzike u pozadini ili preuzimanje mrežnih podataka bez ometanja interakcije korisnika sa aplikacijom. Štaviše, usluge se mogu učiniti dostupnim drugim procesima na istom uređaju putem **izvoza**. Ovo nije podrazumevano ponašanje i zahteva eksplicitnu konfiguraciju u Android Manifest datoteci: ```xml ``` ### Broadcast Receivers -**Broadcast receivers** deluju kao slušatelji u sistemu poruka, omogućavajući više aplikacija da reaguju na iste poruke iz sistema. Aplikacija može **registrovati prijemnik** na **dva osnovna načina**: kroz **Manifest** aplikacije ili **dinamički** unutar koda aplikacije putem **`registerReceiver`** API-ja. U Manifestu, emitovanja se filtriraju sa dozvolama, dok dinamički registrovani prijemnici takođe mogu specificirati dozvole prilikom registracije. +**Broadcast receivers** deluju kao slušatelji u sistemu poruka, omogućavajući više aplikacija da reaguju na iste poruke iz sistema. Aplikacija može **registrovati prijemnik** na **dva osnovna načina**: kroz **Manifest** aplikacije ili **dinamički** unutar koda aplikacije putem **`registerReceiver`** API-ja. U Manifestu, emitovanja se filtriraju sa dozvolama, dok dinamički registrovani prijemnici takođe mogu odrediti dozvole prilikom registracije. -**Intent filteri** su ključni u obe metode registracije, određujući koja emitovanja aktiviraju prijemnik. Kada se pošalje odgovarajuće emitovanje, poziva se **`onReceive`** metoda prijemnika, omogućavajući aplikaciji da reaguje u skladu sa tim, kao što je prilagođavanje ponašanja u odgovoru na upozorenje o niskoj bateriji. +**Intent filteri** su ključni u obe metode registracije, određujući koja emitovanja aktiviraju prijemnik. Kada se pošalje odgovarajuće emitovanje, poziva se **`onReceive`** metoda prijemnika, omogućavajući aplikaciji da reaguje u skladu s tim, kao što je prilagođavanje ponašanja u odgovoru na upozorenje o niskoj bateriji. Emitovanja mogu biti **asinkrona**, dostižući sve prijemnike bez reda, ili **sinhrona**, gde prijemnici dobijaju emitovanje na osnovu postavljenih prioriteta. Međutim, važno je napomenuti potencijalni bezbednosni rizik, jer svaka aplikacija može dati prioritet sebi da presretne emitovanje. @@ -296,7 +296,7 @@ Da biste razumeli funkcionalnost prijemnika, potražite **`onReceive`** metodu u **Content Providers** su ključni za **deljenje strukturiranih podataka** između aplikacija, naglašavajući važnost implementacije **dozvola** za obezbeđivanje bezbednosti podataka. Oni omogućavaju aplikacijama da pristupaju podacima iz različitih izvora, uključujući baze podataka, datotečne sisteme ili web. Specifične dozvole, kao što su **`readPermission`** i **`writePermission`**, su ključne za kontrolu pristupa. Pored toga, privremeni pristup može biti odobren putem **`grantUriPermission`** podešavanja u manifestu aplikacije, koristeći atribute kao što su `path`, `pathPrefix` i `pathPattern` za detaljnu kontrolu pristupa. -Validacija ulaza je od suštinskog značaja za sprečavanje ranjivosti, kao što je SQL injekcija. Content Providers podržavaju osnovne operacije: `insert()`, `update()`, `delete()`, i `query()`, olakšavajući manipulaciju i deljenje podataka među aplikacijama. +Validacija unosa je od suštinskog značaja za sprečavanje ranjivosti, kao što je SQL injekcija. Content Providers podržavaju osnovne operacije: `insert()`, `update()`, `delete()`, i `query()`, olakšavajući manipulaciju i deljenje podataka među aplikacijama. **FileProvider**, specijalizovani Content Provider, fokusira se na sigurno deljenje datoteka. Definisan je u manifestu aplikacije sa specifičnim atributima za kontrolu pristupa folderima, označenim sa `android:exported` i `android:resource` koji upućuju na konfiguracije foldera. Preporučuje se oprez prilikom deljenja direktorijuma kako bi se izbeglo nenamerno izlaganje osetljivih podataka. @@ -316,25 +316,25 @@ I primer specificiranja deljenih foldera u `filepaths.xml`: ``` -For further information check: +Za dodatne informacije proverite: - [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers) - [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing) ## WebViews -WebViews su kao **mini web pregledači** unutar Android aplikacija, koji povlače sadržaj ili sa interneta ili iz lokalnih datoteka. Suočen su sa sličnim rizicima kao obični pregledači, ali postoje načini da se **smanje ovi rizici** kroz specifične **postavke**. +WebViews su kao **mini web pregledači** unutar Android aplikacija, koji preuzimaju sadržaj ili sa interneta ili iz lokalnih datoteka. Suočavaju se sa sličnim rizicima kao i obični pregledači, ali postoje načini da se **smanje ovi rizici** kroz specifične **postavke**. -Android nudi dva glavna tipa WebView: +Android nudi dve glavne vrste WebView: - **WebViewClient** je odličan za osnovni HTML, ali ne podržava JavaScript alert funkciju, što utiče na to kako se XSS napadi mogu testirati. - **WebChromeClient** deluje više kao potpuno iskustvo Chrome pregledača. Ključna tačka je da WebView pregledači **ne dele kolačiće** sa glavnim pregledačem uređaja. -Za učitavanje sadržaja, dostupne su metode kao što su `loadUrl`, `loadData`, i `loadDataWithBaseURL`. Ključno je osigurati da su ovi URL-ovi ili datoteke **sigurni za korišćenje**. Bezbednosne postavke mogu se upravljati putem `WebSettings` klase. Na primer, onemogućavanje JavaScripta sa `setJavaScriptEnabled(false)` može sprečiti XSS napade. +Za učitavanje sadržaja dostupne su metode kao što su `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ključno je osigurati da su ovi URL-ovi ili datoteke **sigurni za korišćenje**. Bezbednosne postavke mogu se upravljati putem `WebSettings` klase. Na primer, onemogućavanje JavaScripta sa `setJavaScriptEnabled(false)` može sprečiti XSS napade. -JavaScript "Bridge" omogućava Java objektima da komuniciraju sa JavaScript-om, zahtevajući da metode budu označene sa `@JavascriptInterface` radi bezbednosti od Android 4.2 nadalje. +JavaScript "Bridge" omogućava Java objektima interakciju sa JavaScript-om, zahtevajući da metode budu označene sa `@JavascriptInterface` radi bezbednosti od Android 4.2 pa nadalje. Dozvoljavanje pristupa sadržaju (`setAllowContentAccess(true)`) omogućava WebView-ima pristup Content Providers, što može predstavljati rizik osim ako su URL-ovi sadržaja verifikovani kao sigurni. @@ -342,19 +342,19 @@ Da biste kontrolisali pristup datotekama: - Onemogućavanje pristupa datotekama (`setAllowFileAccess(false)`) ograničava pristup datotečnom sistemu, sa izuzecima za određene resurse, osiguravajući da se koriste samo za nesenzitivni sadržaj. -## Other App Components and Mobile Device Management +## Ostale komponente aplikacija i upravljanje mobilnim uređajima -### **Digital Signing of Applications** +### **Digitalno potpisivanje aplikacija** - **Digitalno potpisivanje** je obavezno za Android aplikacije, osiguravajući da su **autentično napisane** pre instalacije. Ovaj proces koristi sertifikat za identifikaciju aplikacije i mora biti verifikovan od strane menadžera paketa uređaja prilikom instalacije. Aplikacije mogu biti **samo-potpisane ili sertifikovane od strane eksternog CA**, štiteći od neovlašćenog pristupa i osiguravajući da aplikacija ostane neizmenjena tokom isporuke na uređaj. -### **App Verification for Enhanced Security** +### **Verifikacija aplikacija za poboljšanu bezbednost** - Počevši od **Android 4.2**, funkcija pod nazivom **Verify Apps** omogućava korisnicima da provere aplikacije na bezbednost pre instalacije. Ovaj **proces verifikacije** može upozoriti korisnike na potencijalno štetne aplikacije, ili čak sprečiti instalaciju posebno zlonamernih, poboljšavajući bezbednost korisnika. -### **Mobile Device Management (MDM)** +### **Upravljanje mobilnim uređajima (MDM)** -- **MDM rešenja** pružaju **nadzor i bezbednost** za mobilne uređaje putem **Device Administration API**. Oni zahtevaju instalaciju Android aplikacije za efikasno upravljanje i obezbeđivanje mobilnih uređaja. Ključne funkcije uključuju **sprovodjenje politika lozinki**, **obavezno šifrovanje skladišta**, i **dozvoljavanje daljinskog brisanja podataka**, osiguravajući sveobuhvatan nadzor i bezbednost nad mobilnim uređajima. +- **MDM rešenja** pružaju **nadzor i bezbednost** za mobilne uređaje putem **Device Administration API**. Oni zahtevaju instalaciju Android aplikacije za efikasno upravljanje i obezbeđivanje mobilnih uređaja. Ključne funkcije uključuju **sprovođenje politika lozinki**, **obavezno šifrovanje skladišta**, i **dozvoljavanje daljinskog brisanja podataka**, osiguravajući sveobuhvatan nadzor i bezbednost mobilnih uređaja. ```java // Example of enforcing a password policy with MDM DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); @@ -365,4 +365,109 @@ if (dpm.isAdminActive(adminComponent)) { dpm.setPasswordMinimumLength(adminComponent, 8); } ``` +## Enumerating and Exploiting AIDL / Binder Services + +Android *Binder* IPC izlaže mnoge **sistemske i usluge koje pruža dobavljač**. Te usluge postaju **površina za napad** kada se izvezu bez odgovarajuće provere dozvola (AIDL sloj sam ne vrši *nikakvu* kontrolu pristupa). + +### 1. Otkrijte aktivne usluge +```bash +# from an adb shell (USB or wireless) +service list # simple one-liner +am list services # identical output, ActivityManager wrapper +``` +1. Razumevanje Android aplikacija +2. Osnovne komponente Android aplikacija +3. Razvoj Android aplikacija +4. Sigurnosni aspekti Android aplikacija +5. Tehnike testiranja sigurnosti Android aplikacija +6. Alati za pentesting Android aplikacija +7. Analiza i inženjering povratnog koda +8. Uobičajene ranjivosti u Android aplikacijama +9. Pristup podacima i skladištenje +10. Mrežne komunikacije u Android aplikacijama +``` +145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics] +146 wifi : [android.net.wifi.IWifiManager] +``` +* **Indeks** (prva kolona) se dodeljuje u vreme izvršavanja – ***ne*** oslanjajte se na njega između ponovnih pokretanja. +* **Binder ime** (npr. `mtkconnmetrics`) je ono što će biti prosleđeno `service call`. +* Vrednost unutar zagrada je potpuno kvalifikovani **AIDL interfejs** iz kojeg je stub generisan. + +### 2. Dobijanje deskriptora interfejsa (PING) +Svaki Binder stub automatski implementira **transakcioni kod `0x5f4e5446`** (`1598968902` decimalno, ASCII "_NTF"). +```bash +# "ping" the service +service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32 +``` +Važeći odgovor vraća ime interfejsa kodirano kao UTF-16 string unutar `Parcel`. + +### 3. Pozivanje transakcije +Sintaksa: `service call [type value ...]` + +Uobičajeni specifikatori argumenata: +* `i32 ` – potpisana 32-bitna vrednost +* `i64 ` – potpisana 64-bitna vrednost +* `s16 ` – UTF-16 string (Android 13+ koristi `utf16`) + +Primer – započnite praćenje mreže sa uid **1** na MediaTek uređaju: +```bash +service call mtkconnmetrics 8 i32 1 +``` +### 4. Brute-forcing unknown methods +Kada header datoteke nisu dostupne, možete **iterirati kod** dok se greška ne promeni iz: +``` +Result: Parcel(00000000 00000000) # "Not a data message" +``` +na normalan `Parcel` odgovor ili `SecurityException`. +```bash +for i in $(seq 1 50); do +printf "[+] %2d -> " $i +service call mtkconnmetrics $i 2>/dev/null | head -1 +done +``` +Ako je usluga kompajlirana **sa proguard-om**, mapiranje mora biti pogodjeno – vidi sledeći korak. + +### 5. Mapiranje kodova ↔ metoda putem onTransact() +Dekompajlirajte jar/odex koji implementira interfejs (za AOSP stubove proverite `/system/framework`; OEM-ovi često koriste `/system_ext` ili `/vendor`). +Pretražite `Stub.onTransact()` – sadrži ogroman `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; +``` +Sada su prototip i **tipovi parametara** kristalno jasni. + +### 6. Uočavanje nedostajućih provera dozvola +Implementacija (često unutrašnja klasa `Impl`) je odgovorna za autorizaciju: +```java +private void updateCtaAppStatus(int uid, boolean status) { +if (!isPermissionAllowed()) { +throw new SecurityException("uid " + uid + " rejected"); +} +/* privileged code */ +} +``` +Odsustvo takve logike ili bele liste privilegovanih UID-ova (npr. `uid == 1000 /*system*/`) je **indikator ranjivosti**. + +Studija slučaja – *MediaTek* `startMonitorProcessWithUid()` (transakcija **8**) potpuno izvršava Netlink poruku **bez** ikakvih dozvola, omogućavajući neprivilegovanoj aplikaciji da komunicira sa Netfilter modulom jezgra i spamuje sistemski log. + +### 7. Automatizacija procene +Alati / skripte koje ubrzavaju Binder istraživanje: +* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) – izlaže `/dev/binderfs` sa čvorovima po usluzi +* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) – prolazi kroz binder tabelu i štampa ACL-ove +* Frida prečica: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))` + +--- + +## Reference + +- [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}}