Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ne hagyd magad Intentekkel támadni // Hackersul...

Ne hagyd magad Intentekkel támadni // Hackersuli 2025.04. (Hungarian)

Az Intent alapú Android explitokról és az azok ellen védekezésről szóló előadásom a 2025.04. havi Hackersuli meetupról.

Beharangozó:
Egy Android alkalmazás megnyitása minden esetben egy Intent “elsütésével” kezdődik, ezekkel címezhető meg egy app. Az egész operációs rendszer működése különféle alkalmazások Activityjeinek együttműködésére épül. Ezért nem kell például minden appnak fájl böngészőt implementálnia, ha meg akar nyitni egy fotót, de ez teszi támadhatóvá is az alkalmazásokat Intenteken keresztül.
Úgy érdemes gondolni egy Intentre, mint egy bemenetre, amit validálni kell. Ezzel a mentalitással sok támadás kivédhető, de van, amihez megfelelő architekturális döntések és platform támogatás is kell. A legújabb Android verziók segítségünkre lesznek, ugyanakkor a megfelelő védekezéshez a támadási felületek alapos ismerete is szükséges.

Olyan problémákat nézünk meg, mint:

- Jogosultság emelése Intent átirányítással
- Szolgáltatásmegtagadással járó támadás (DoS) szándékosan hibásan konstruált Intentekkel
- Adatszivárgás Intent paraméterek injektálásával
- Másik app megszemélyesítése Taszk hijackeléssel (StrandHogg)

Az előadás felvértez működőképes mitigációk implementálására és Intent alapú támadásokkal szembeni védekezésre.

Linkek:
Android Security Evolution:
https://github.com/balazsgerlei/AndroidSecurityEvolution

Safeguarding user security on Android​:
https://youtu.be/RccJYep2v5I

USENIX Security '15 - Towards Discovering and Understanding Task Hijacking in Android​:
https://youtu.be/IYGwXFIYdS8

HackTricks - Android Task Hijacking​:
https://book.hacktricks.wiki/en/mobile-pentesting/android-app-pentesting/android-task-hijacking.html

Application Security Cheat Sheet:
https://0xn3va.gitbook.io/cheat-sheets/android-application/intent-vulnerabilities

Avatar for Balázs Gerlei

Balázs Gerlei

April 25, 2025
Tweet

More Decks by Balázs Gerlei

Other Decks in Programming

Transcript

  1. Intentek fajtái @balazsgerlei, balazsgerlei.com // Activity indítása val activityIntent =

    Intent(this, OtherActivity::class.java).apply { putExtra("key", value) } startActivity(activityIntent) // Service indítása val fileUrl = "file:///mnt/sdcard/foo.txt" val serviceIntent = Intent(this, MyService::class.java).apply { data = fileUrl.toUri() } startService(serviceIntent) // Broadcast küldése val broadcastIntent = Intent("com.victim.messenger.IN_APP_MESSAGE").apply { putExtra("key", value) }
  2. Intentek fajtái @balazsgerlei, balazsgerlei.com // Activity indítása val activityIntent =

    Intent(this, OtherActivity::class.java).apply { putExtra("key", value) } startActivity(activityIntent) // Service indítása val fileUrl = "file:///mnt/sdcard/foo.txt" val serviceIntent = Intent(this, MyService::class.java).apply { data = fileUrl.toUri() } startService(serviceIntent) // Broadcast küldése val broadcastIntent = Intent("com.victim.messenger.IN_APP_MESSAGE").apply { putExtra("key", value) }
  3. Intentek fajtái @balazsgerlei, balazsgerlei.com // Activity indítása val activityIntent =

    Intent(this, OtherActivity::class.java).apply { putExtra("key", value) } startActivity(activityIntent) // Service indítása val fileUrl = "file:///mnt/sdcard/foo.txt" val serviceIntent = Intent(this, MyService::class.java).apply { data = fileUrl.toUri() } startService(serviceIntent) // Broadcast küldése val broadcastIntent = Intent("com.victim.messenger.IN_APP_MESSAGE").apply { putExtra("key", value) }
  4. Intentek fajtái @balazsgerlei, balazsgerlei.com // Activity indítása val activityIntent =

    Intent(this, OtherActivity::class.java).apply { putExtra("key", value) } startActivity(activityIntent) // Service indítása val fileUrl = "file:///mnt/sdcard/foo.txt" val serviceIntent = Intent(this, MyService::class.java).apply { data = fileUrl.toUri() } startService(serviceIntent) // Broadcast küldése val broadcastIntent = Intent("com.victim.messenger.IN_APP_MESSAGE").apply { putExtra("key", value) }
  5. Intentek fajtái @balazsgerlei, balazsgerlei.com // Explicit Intent val explicitIntent =

    Intent(this, OtherActivity::class.java) startActivity(explicitIntent)
  6. Intentek fajtái @balazsgerlei, balazsgerlei.com // Explicit Intent val explicitIntent =

    Intent(this, OtherActivity::class.java) startActivity(explicitIntent) .apply { putExtra("key", value) }
  7. Intentek fajtái @balazsgerlei, balazsgerlei.com // Explicit Intent val explicitIntent =

    Intent(this, OtherActivity::class.java) startActivity(explicitIntent) .apply { putExtra("key", value) }
  8. Intentek fajtái @balazsgerlei, balazsgerlei.com // Explicit Intent val explicitIntent =

    Intent(this, OtherActivity::class.java) startActivity(explicitIntent) .apply { putExtra("key", value) } // Implicit Intent val url = "https://example.com" val implicitIntent = Intent(Intent.ACTION_VIEW).apply { data = url.toUri() } startActivity(implicitIntent)
  9. Intent párosítása a szűrőkkel <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data

    android:mimeType="text/plain"/> </intent-filter> @balazsgerlei, balazsgerlei.com val intent = Intent(Intent.ACTION_SEND).apply { addCategory(Intent.CATEGORY_DEFAULT) type = "text/plain" }
  10. PendingIntent • A PendingIntent egy speciális Intent, későbbi “elsütésre” felparaméterezve

    • Pl. az Intent ami egy értesítésre nyomáskor “sül el” • Lehetővé teszi, hogy valaki más appok nevében lépjen fel • A másik appot ezzel megszemélyesítve, annak jogosultságaival @balazsgerlei, balazsgerlei.com
  11. Intent DoS • A támadó szándékosan hibásan konstruált Intentekkel lehalaszt

    egy másik alkalmazást • A legegyszerűbb Action megadás nélkül (null-ra állítva) • A leghatékonyabb az egyedi Serializable extrával • A fogadó fél nem ismeri az osztályt és lehal, ha megpróbálja kiolvasni • A szolgáltatásmegtadagás (Denial of Service) egyszerű formája @balazsgerlei, balazsgerlei.com
  12. Intent Fuzzer Alkalmazás • App szándékosan hibásan konstruált Intentek küldésére

    • github.com/balazsgerlei/IntentFuzzer @balazsgerlei, balazsgerlei.com
  13. Intentek validálása – DoS védekezés • Nem várt action-ök, extrák,

    stb. szűrése • Exception-ök lekezelése kiolvasáskor • Rosszul konstruált Intentek eldobása • Bundle-t is felül kell írni! • Android 9 (API 28) és 12 (API 31) között akkor is lehal az app, ha az Activity épp befejeződik • Használjuk bátran az IntentSanitizer-t az androidx.core-ból IntentSanitizer.Builder() .allowAnyComponent() .allowAction("android.intent.action.MAIN") .allowCategory("android.intent.category.LAUNCHER") .allowFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .build() .sanitizeByThrowing(intent) @balazsgerlei, balazsgerlei.com
  14. Intent átirányítás • A támadó részben, vagy egészben kontrollálja az

    Intent tartalmát, amely egy adott komponenst indít • Ezzel jogosultságát megemeli • Leggyakoribb módja az extras mezőbe bújtatott Intent @balazsgerlei, balazsgerlei.com
  15. Védekezés Intent átirányítással szemben • Validálni és szűrni kell az

    Intenteket • Deffenzíven implementálni a feldolgozást végző logikát • Ne használjuk direktben az alkalmazáson kívülről érkező Intenteket • Használjunk inkább (módosíthatatlan, immutable) PendingIntent-eket @balazsgerlei, balazsgerlei.com
  16. Intent átirányítás WebView-ból • Hibás URL feldolgozó logika a WebViewClient

    shouldOverrideUrlLoading metódusában • Intent kreálás az URL String parse-olásával • Védett, nem exportált komponensek is címezhetőek a component és selector mezőkkel @balazsgerlei, balazsgerlei.com
  17. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { startActivity(it) } return true } .also { Intent.parseUri(url, 0)
  18. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { startActivity(it) } return true } .also { Intent.parseUri(url, 0)
  19. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { startActivity(it) } return true } .also { Intent(Intent.ACTION_VIEW, Uri.parse(url))
  20. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { Intent.parseUri(url, 0) .apply { addCategory(Intent.CATEGORY_BROWSABLE) component = null selector = null } .also { startActivity(it) } return true }
  21. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { Intent.parseUri(url, 0) .apply { addCategory(Intent.CATEGORY_BROWSABLE) component = null selector = null } .also { startActivity(it) } return true }
  22. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { Intent.parseUri(url, 0) .apply { addCategory(Intent.CATEGORY_BROWSABLE) component = null selector = null } .also { } return true } val activityInfo = it.resolveActivityInfo( packageManager, PackageManager.MATCH_DEFAULT_ONLY) if (activityInfo.exported) { } startActivity(it)
  23. Intent átirányítás WebView-ból @balazsgerlei, balazsgerlei.com override fun shouldOverrideUrlLoading(view: WebView?, url:

    String?): Boolean { Intent.parseUri(url, 0) .apply { addCategory(Intent.CATEGORY_BROWSABLE) component = null selector = null } .also { } return true } val activityInfo = it.resolveActivityInfo( packageManager, PackageManager.MATCH_DEFAULT_ONLY) if (activityInfo.exported) { } startActivity(it)
  24. Védekezés a WebView-ból történő Intent átirányítással szemben • Gondoljuk át,

    milyen funkcionalitást szeretnénk nyújtani • Használjuk az Intent konstruktorát • Állítsuk fixen null-ra a component és selector mezőket a feldolgozás után • Ellenőrizzük, hogy exportált-e a komponens, amit meg akarunk hívni @balazsgerlei, balazsgerlei.com
  25. További WebView sérülékenységek • “Overcoming Unsecurities in WebViews” – droidcon

    London • droidcon.com/2024/12/14/overcoming-unsecurities-in-webviews/ @balazsgerlei, balazsgerlei.com
  26. Intent Filternek csak részben megfelelő explicit Intentek • Ha a

    cél komponens is meg van adva (explicit Intent), akkor is kézbesítve lesz, ha nem pontosan fedi az Intent Filtert • Lehetséges, hogy a feldolgozó logika közös a public és private Receiver mögött • Ezzel egy privát action a publikus, exportált Receiver-en keresztül is bejuthat @balazsgerlei, balazsgerlei.com
  27. Intent Filternek csak részben megfelelő explicit Intentek <receiver android:name=".ExternalReceiver" android:exported="true">

    <intent-filter> <action android:name="com.example.victim.PUBLIC_EXTERNAL_ACTION" /> </intent-filter> </receiver> <receiver android:name=".InternalReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.victim.PRIVATE_INTERNAL_ACTION" /> </intent-filter> </receiver> @balazsgerlei, balazsgerlei.com
  28. Intent Filternek csak részben megfelelő explicit Intentek <receiver android:name=".ExternalReceiver" android:exported="true">

    <intent-filter> <action android:name="com.example.victim.PUBLIC_EXTERNAL_ACTION" /> </intent-filter> </receiver> <receiver android:name=".InternalReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.victim.PRIVATE_INTERNAL_ACTION" /> </intent-filter> </receiver> @balazsgerlei, balazsgerlei.com
  29. Intent Filternek csak részben megfelelő explicit Intentek class ExternalReceiver :

    BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { CentralizedIntentHandler.handleIntent(context, intent) } } class InternalReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { CentralizedIntentHandler.handleIntent(context, intent) } } @balazsgerlei, balazsgerlei.com
  30. Intent Filternek csak részben megfelelő explicit Intentek class ExternalReceiver :

    BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { CentralizedIntentHandler.handleIntent(context, intent) } } class InternalReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { CentralizedIntentHandler.handleIntent(context, intent) } } @balazsgerlei, balazsgerlei.com
  31. Intent Filternek csak részben megfelelő explicit Intentek object CentralizedIntentHandler {

    fun handleIntent(context: Context, intent: Intent) { when (intent.action!!) { PUBLIC_EXTERNAL_ACTION -> { Toast.makeText(context, "EXECUTING EXTERNAL ACTION...", Toast.LENGTH_LONG) .show() } PRIVATE_INTERNAL_ACTION -> { Toast.makeText(context, "EXECUTING INTERNAL ACTION...", Toast.LENGTH_LONG) .show() with(context) { Intent(this, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }.also { startActivity(it) } } } } } } @balazsgerlei, balazsgerlei.com
  32. Intent Filternek csak részben megfelelő explicit Intentek kiszűrése • Android

    16-ban (API 36) kivédve • Teljesen szeparálni kell a logikát a különböző Receiver-ek között, nem szabad kizárólag az IntentFilter-ekre hagyatkozni • Itt is jól jöhet az IntentSanitizer @balazsgerlei, balazsgerlei.com
  33. Intent elcsaklizás • A támadó “elcsaklizhatja” az Intentet • Ha

    egy alkalmazás nem adja meg a célkomponenst • A támadó ezzel az Intentbe ágyazott érzékeny adatokhoz férhet hozzá • Vagy különféle műveleteket hajthat végre (pl. más komponensek meghívása) • Vagy módosíthat egy PendingIntent-et • Android 12 (API 31) óta ezért is kell megadni a módosíthatóságukat (mutability) @balazsgerlei, balazsgerlei.com
  34. Védekezés az Intent elcsaklizással szemben • Ha csak lehet, adjuk

    meg a célkomponenst • Szűkítsük le minél jobban a célt • Ne ágyazzunk érzékeny adatokat, főleg implicit Intentekbe • Használjunk módosíthatatlan (immutable) PendingIntent-et • Használjuk a Photo Picker-t • Az androidx.activity libraryből • Az aktuális verzió Android 5-ig (API 21) – a régebbi verziók Android 4.4-ig (API 19) visszamenőleg használhatóak @balazsgerlei, balazsgerlei.com
  35. Taszkok és a Back Stack • Egy Taszk Activity-k verme

    (stackje) • A “Back Stack” azon Activity-ket tartalmazza, amikre a felhasználó visszanavigálhat Activity 1 Task 1 @balazsgerlei, balazsgerlei.com
  36. Taszkok és a Back Stack • Egy Taszk Activity-k verme

    (stackje) • A “Back Stack” azon Activity-ket tartalmazza, amikre a felhasználó visszanavigálhat Activity 1 Task 1 Activity 2 @balazsgerlei, balazsgerlei.com
  37. Taszkok és a Back Stack • Egy Taszk Activity-k verme

    (stackje) • A “Back Stack” azon Activity-ket tartalmazza, amikre a felhasználó visszanavigálhat Activity 1 Task 1 Activity 2 Activity 3 @balazsgerlei, balazsgerlei.com
  38. Taszkok és a Back Stack • Egy Taszk Activity-k verme

    (stackje) • A “Back Stack” azon Activity-ket tartalmazza, amikre a felhasználó visszanavigálhat Activity 1 Task 1 Activity 2 @balazsgerlei, balazsgerlei.com
  39. Taszkok és a Back Stack • Egy Taszk Activity-k verme

    (stackje) • A “Back Stack” azon Activity-ket tartalmazza, amikre a felhasználó visszanavigálhat Activity 1 Task 1 Activity 2 Task 2 Activity 1 @balazsgerlei, balazsgerlei.com
  40. Taszkok és a Back Stack • Egy Taszk Activity-k verme

    (stackje) • A “Back Stack” azon Activity-ket tartalmazza, amikre a felhasználó visszanavigálhat Activity 1 Task 1 Activity 2 Task 2 Activity 1 @balazsgerlei, balazsgerlei.com
  41. StrandHogg 1 • Statikus támadás, a támadónak egy konkrét alkalmazást

    kell megcélozni a Manifest konfigurációjával • Megtalálható statikus elemzéssel (a Manifest “plain text”) • (Elvileg) nem megy át Play Review-n • Használható • Jogosultságemelésre rendszerjogosultságokat kérve • Alkalmazás megszemélyesítésére, adathalászatra • A felhasználó jó eséllyel észre se veszi a támadást @balazsgerlei, balazsgerlei.com
  42. StrandHogg 1 • Rá kell venni a felhasználót, hogy a

    támadót indítsa először • Ezután, ha a valódi alkalmazást próbálja elindítani, a támadó kerül előtérbe Kártékony Activity Támadó Taskja @balazsgerlei, balazsgerlei.com
  43. StrandHogg 1 • Rá kell venni a felhasználót, hogy a

    támadót indítsa először • Ezután, ha a valódi alkalmazást próbálja elindítani, a támadó kerül előtérbe Kártékony Activity Támadó Taskja Áldozat Taskja @balazsgerlei, balazsgerlei.com
  44. StrandHogg 1 • Rá kell venni a felhasználót, hogy a

    támadót indítsa először • Ezután, ha a valódi alkalmazást próbálja elindítani, a támadó kerül előtérbe Kártékony Activity Támadó Taskja Áldozat Taskja Azonos Task Affinity @balazsgerlei, balazsgerlei.com
  45. StrandHogg 1 • Rá kell venni a felhasználót, hogy a

    támadót indítsa először • Ezután, ha a valódi alkalmazást próbálja elindítani, a támadó kerül előtérbe Kártékony Activity Támadó Taskja Áldozat Taskja Azonos Task Affinity @balazsgerlei, balazsgerlei.com
  46. StrandHogg 1 • Az érintett Manifesztbéli konfigurációk: • android:taskAffinity –

    Az azonos affinitással rendelkező Activity- k koncepcionálisan ugyanabba a taszkba tartoznak. Egy Taszk affinitását a gyökér Activity határozza meg • Bármit be lehet állítani (az Android nem diszkriminál) • Ha nincs beállítva, akkor az application ID-vel egyezik meg • android:allowTaskReparenting – meghatározza, hogy egy Activity átkerülhet-e egy másik Taszkba, amelynek megegyezik az affinitása • android:excludeFromRecents – meghatározza, hogy látszódjon-e az Activity az “Előzmények” (~alkalmazásváltó) képernyőn @balazsgerlei, balazsgerlei.com
  47. Védekezés StrandHogg 1 ellen • Android 11-ben (API 30) kivédve

    • Érintett egy app, ha ennél régebbi verziókat is támogat • Kivédhető üres Activity taskAffinity megadásával • Sokkal egyszerűbb, ha csak egy Activity-nk van • Kivédhető singleInstance Activity indításmóddal • Nem várt mellékhatásokkal járhat a felhasználói élményben @balazsgerlei, balazsgerlei.com
  48. StrandHogg 2 • Az elsőnél komolyabb veszélyt jelent • Teljesen

    dinamikus, kód és nem konfiguráció alapú • Egyszerre több alkalmazást lehet támadni vele • A kód, vagy a célpontok listáját is dinamikusan lehet be(/le)tölteni • A támadó akár ellenőrizheti, mely célpontok vannak telepítve • Ugyanarra használható, mint az első (jogosultságok, adathalászat) • Könnyen implementálható, de nehéz felismerni és védekezni ellene • A felhasználó jó eséllyel ugyanúgy észre se veszi a támadást @balazsgerlei, balazsgerlei.com
  49. StrandHogg 2 • A támadónak futnia kell a háttérben •

    De nem kell előbb elindítani Áldozat Activity Task 1 @balazsgerlei, balazsgerlei.com
  50. StrandHogg 2 • A támadónak futnia kell a háttérben •

    De nem kell előbb elindítani Áldozat Activity Task 1 Kártékony Activity @balazsgerlei, balazsgerlei.com
  51. StrandHogg 2 • A támadónak futnia kell a háttérben •

    De nem kell előbb elindítani Áldozat Activity Task 1 Kártékony Activity Task 2 Elterelés Activity @balazsgerlei, balazsgerlei.com
  52. StrandHogg 2 • A támadónak futnia kell a háttérben •

    De nem kell előbb elindítani Áldozat Activity Task 1 Kártékony Activity @balazsgerlei, balazsgerlei.com
  53. StrandHogg 2 • Három Intent a kulcsa: • 1. elindítja

    a célpont Activity-ét • Erre be kell állítani az Intent.FLAG_ACTIVITY_NEW_TASK flaget • 2. indítja a támadó Activity-t • 3. elterelés, a támadóhoz tartozó, de ártatlan funkcionalitást nyújtó Activity • Ezen is be kell állítani az Intent.FLAG_ACTIVITY_NEW_TASK flaget • Ezeket egyetlen startActivities() hívásnak kell átadni @balazsgerlei, balazsgerlei.com
  54. Védekezés StrandHogg 2 ellen • Kiküszöbölve az Android 10-ben (API

    29) • A 2020 májusi biztonsági javítással kiadták Android 8-ra, 8.1-re és 9-re (API 26, 27 and 28) is • Kivédhető singleInstance Activity indításmóddal • Nem várt mellékhatásokkal járhat a felhasználói élményben • Megpróbálhatjuk számon tartani a taszkban lévő Activity-ket és kilépni, ha eltér attól, ami az elvárt • Ezt nagyon nehéz jól implementálni, könnyen álpozitív észlelésbe futunk, vagy nem vesszük észre a támadást @balazsgerlei, balazsgerlei.com
  55. Háttérből indítás korlátozása (BAL) • Android 10 (API 29) óta

    csak akkor lehet háttérből Activity-t indítani, ha megfelelünk ~13 feltétel egyikének, úgy, mint: • Van egy előtérben lévő, látható ablaka (Activity-je) az alkalmazásnak. • Van egy Activity-je az alkalmazásnak az előtérben lévő Taszk back stackjében. • Van egy Activity-je az alkalmazásnak a Recents képernyőn látható egyik Taszk back stackjében. • Nemrégiben indított egy Activity-t az alkalmazás. @balazsgerlei, balazsgerlei.com
  56. Android 15 (API 35) Android 16 (API 36) • Háttérből

    indítás korlátozása • Háttérből indított Activity hatására nem kerülhet előtérbe Taszk • PendingIntent készítői is alapértelmezetten blokkolva vannak a háttérből indítástól • “Biztonságos Intentek” • Nincs érvényre juttatva • Activity-k más app taszkjába kerülésének tiltása • Intent átirányítással szembeni védelem • Az appok végre érvényre juttathatják a “Biztonságos Intenteket” @balazsgerlei, balazsgerlei.com
  57. Biztonságos Intentek • Nem lehet üresen hagyni az Intent Actiont

    • Explicit Intenteknek is meg kell felelniük a cél komponens Intent Filterének @balazsgerlei, balazsgerlei.com
  58. Biztonságos Intentek • Android 15-ben (API 35) nincs érvényre juttatva,

    de detektálható a StrictMode bekapcsolásával (saját alkalmazáson) • Android 16-ot (API 36) célzó alkalmazások az új intentMatchingFlags Manifest bejegyzéssel bekapcsolhatják • none – nincs érvényre juttatva (korábbi működés) • enforceIntentFilter – Filterrel nem egyező explicit Intentek ÉS null Action-ök kiszűrése • allowNullAction – Az enforceIntentFilter-el közösen használható, engedélyezi a null Action-öket @balazsgerlei, balazsgerlei.com
  59. Activity-k más app taszkjába kerülésének tiltása • android:allowCrossUidActivitySwitchFromBelow • Alapból

    tilt, akár Activity-nként is engedélyezhető • Mindkét appnak – annak is aki indítja az Activity-t a háttérből (támadó) és annak is, aki előtérben van (áldozat) az új Android verziót kell céloznia @balazsgerlei, balazsgerlei.com
  60. Activity-k más app taszkjába kerülésének tiltása • android:allowCrossUidActivitySwitchFromBelow • Alapból

    tilt, akár Activity-nként is engedélyezhető • Mindkét appnak – annak is aki indítja az Activity-t a háttérből (támadó) és annak is, aki előtérben van (áldozat) az új Android verziót kell céloznia • Sajnos ez utolsó pillanatban kikerült az Android 15-ből, mert annyi hibát okozott mellékhatásként (és egyelőre Android 16 Bétában sincs) @balazsgerlei, balazsgerlei.com
  61. Tanulságok • Intentek validálása/szűrése • Engedélyezési lista, nem tiltás •

    Fontos a Fenyegetésmodellezés (Threat Modelling) • Activity használat egyszerűsítése (ha lehet, egyetlen Activity) • Korlátozni, mely komponensek csatlakozhatnak a Taszkhoz • Üres taskAffinity beállítása az alapértelmezett helyett • Korlátozó launchMode beállítása Activity-khez (lehetőleg singleInstance) @balazsgerlei, balazsgerlei.com
  62. Köszönöm a figyelmet! • speakerdeck.com/balazsgerlei • Android Security Evolution •

    github.com/balazsgerlei/AndroidSecurityEvolution • Safeguarding user security on Android • youtu.be/RccJYep2v5I • USENIX Security '15 - Towards Discovering and Understanding Task Hijacking in Android • youtu.be/IYGwXFIYdS8 • HackTricks - Android Task Hijacking • book.hacktricks.wiki/en/mobile-pentesting/android-app-pentesting/android-task- hijacking.html • Application Security Cheat Sheet • 0xn3va.gitbook.io/cheat-sheets/android-application/intent-vulnerabilities @balazsgerlei, balazsgerlei.com