Kihagyás

Natív Mobil Biztonság és Jogosultságok: A Zsebbe Zárt Erőd

Üdv a modern mobilfejlesztés egyik legfontosabb fejezetében! Egy telefon nem csak egy kijelző: tele van szenzorokkal, személyes üzenetekkel, fotókkal és pénzügyi adatokkal. Fejlesztőként a mi felelősségünk megvédeni ezeket, miközben az app használata kényelmes marad.

Belépés a rendszerbe (Authentication & Mobile Security)

Régen elég volt egy felhasználónév és jelszó. Ma már ennél sokkal több kell, mert a mobilokon biometria, hardveres trezorok és egyedi azonosítók is a rendelkezésünkre állnak.

OAuth 2.0 és a PKCE flow mobilon

Amikor egy appba "Bejelentkezés Google-lel/Apple-lel" gombbal lépsz be, az OAuth 2.0 protokollt használod.

  • A hiba: Sokan beágyazott, rejtett böngészőket (WebView) használnak a bejelentkezéshez. Ez veszélyes, mert az alkalmazás kódja így elméletileg "láthatja" és ellophatja a beírt jelszót.
  • A megoldás (PKCE + Custom Tabs): Mobilon is a PKCE (Proof Key for Code Exchange) a kötelező szabvány (RFC 8252). A biztonságos belépéshez az operációs rendszer saját, elkülönített böngészőablakát kell megnyitni (Androidon Chrome Custom Tabs, iOS-en ASWebAuthenticationSession). Így a felhasználó a biztonságos rendszerablakban lép be, az app pedig csak a végső "kulcsot" (tokent) kapja meg, a jelszót sosem látja.

Hol tároljuk a kulcsot? (Token Storage)

Ha megvan a belépési kulcs (token), vigyáznunk kell rá:

  • SharedPreferences / UserDefaults: Kényelmes, de ez a webes LocalStorage megfelelője: az adatok sima szövegként tárolódnak. Ha a telefont feltörik (root/jailbreak), bárki kiolvashatja. Ide tilos tokent tenni!
  • Keystore (Android) / Keychain (iOS): Ez a nyerő! Ezek hardveresen titkosított trezorok. Még az operációs rendszer sem tudja közvetlenül kiolvasni a nyers kulcsot. Ez véd meg minket a tokenlopástól (Flutterben ezt a flutter_secure_storage végzi).

Jogosultságok (Permissions): A "Kérni tudni kell" művészete

Régen, ha telepítettél egy Android appot, az rögtön, a letöltés pillanatában kért minden engedélyt. Ha nem adtad meg, fel sem települt. Ez mára (szerencsére) megszűnt.

Az Arany Szabályok (Elmélet)

  • Runtime Permissions (Futásidejű engedélyek): A felhasználó használat közben dönt. Csak akkor kérjük el az engedélyt, amikor tényleg szükség van rá.
  • Principle of Least Privilege (Legkisebb jogosultság elve): Csak azt kérd, ami elengedhetetlen! Ha az appod csak a város szintű időjárást mutatja be, ne kérj pontos, méter-alapú GPS (Fine Location) hozzáférést, elég a durva (Coarse Location).
  • Privacy by Design: Már a tervezőasztalon döntsd el, hogy mi az a minimális adat, ami a működéshez kell, és mi a törlési házirend.
  • Graceful Degradation (Elegáns visszalépés): Ha a user nem adja meg a kamera engedélyt, az app nem omolhat össze! Ilyenkor a funkciót le kell tiltani, de az app többi részének működnie kell.
  • Pszichológia és Időzítés: Soha ne vágd a felhasználó arcába az engedélykérő ablakot rögtön indításkor! Adj kontextust: mutass egy "Fotó készítése" gombot, és csak ha rányom, akkor kérd el a kamerát, előtte megmagyarázva, miért van rá szükség (Rationale).

Mit védünk? (Hardveres elemek)

  • Kritikus adatok: GPS, Kamera, Mikrofon.
  • Szenzorok: Gyorsulásmérő (Accelerometer), Giroszkóp, Iránytű (Magnetometer), Barométer, Közelségérzékelő (Proximity).
  • Kommunikáció és Azonosítás: Bluetooth, NFC, Biometria (Ujjlenyomat, Face ID).

Páncélzat a kód körül (Defense in Depth)

A mobilbiztonság alapja a Defense in Depth (Többrétegű védelem). Nem bízhatunk meg egyetlen kapuban; ha egy támadó átjut az egyiken, a következőnek meg kell állítania.

Az OWASP Mobile Kockázatok és Védekezések

Az OWASP (Open Worldwide Application Security Project) listázza a mobil appok leggyakoribb sebezhetőségeit.

  • M1 - Improper Platform Use (Helytelen platformhasználat): A mobil operációs rendszer (Android/iOS) beépített biztonsági funkcióinak figyelmen kívül hagyása vagy rossz beállítása. Ide tartoznak a védtelenül hagyott, más appok által is meghívható komponensek (pl. Androidon az indokolatlan exported="true" beállítások egy Activity-n).
  • Megoldás: Alapértelmezett zártság (Secure by Default). Minden alkalmazás-komponenst zárjunk el, és csak azt nyissuk meg a külvilág felé explicit módon, amit feltétlenül muszáj.
  • M2 - Insecure Storage (Nem biztonságos tárolás): Soha ne tárolj jelszót vagy tokent sima fájlokban vagy adatbázisokban!
  • Megoldás: Hardveresen védett trezorok. Androidon a Keystore, iOS-en a Keychain.
  • M3 - Insecure Communication (Nem biztonságos kommunikáció): A HTTPS ma már alap (iOS-en az ATS - App Transport Security ki is kényszeríti), de egy kávézó wifijén egy hacker "hamis" igazolvánnyal (tanúsítvánnyal) lehallgathatja a forgalmat (MITM támadás).
  • Megoldás: Certificate Pinning. Az appba "beleégetjük" a szerverünk ujjlenyomatát, így csak és kizárólag a mi eredeti szerverünkkel hajlandó szóba állni.
  • M4 - Insecure Auth (Biometrikus azonosítás helyesen): A Face ID vagy az ujjlenyomat mindig helyi (local auth)! A telefon sosem küldi el az ujjlenyomatod a szervernek. Csak egy "Igen, a gazdám az" vagy "Nem, ez egy idegen" választ (és egy ahhoz tartozó kriptográfiai kulcsot) kap az app.
  • M5 - Insufficient Cryptography (Gyenge titkosítás): Amikor az app titkosít ugyan, de elavult, percek alatt feltörhető algoritmusokat használ (pl. MD5, SHA1), vagy ami még rosszabb: a titkosítási jelszavakat közvetlenül a forráskódba "beégetve" (hardcoded) tárolja.
  • Megoldás: Kizárólag modern, erős iparági szabványokat használjunk (pl. AES-GCM 256), a titkosítási kulcsokat pedig a hardveres Keystore/Keychain rendszerek generálják és tárolják, soha ne mi írjuk bele a kódba.
  • M6 - Insecure Authorization (Nem biztonságos jogosultság-ellenőrzés): Gyakori hiba, hogy a mobilalkalmazás a képernyőn elrejti az "admin" vagy "prémium" gombokat egy sima felhasználó elől, de a backend (szerver) már nem ellenőrzi a jogosultságot. Egy hacker a gomb nélkül is meg tudja hívni a szerver végpontját.
  • Megoldás: Soha ne bízz a kliensben! A backendnek minden egyes adatkérésnél és módosításnál a token alapján ellenőriznie kell, hogy az adott felhasználónak valóban van-e joga az adott művelet végrehajtásához (Zero Trust modell).

Alkalmazás és Eszköz Védelem

  • Code Obfuscation (Kód sötétítés): Az Androidos R8/ProGuard eszközök összekeverik a lefordított kódot (a változókat átnevezik a, b, c-re), hogy ha valaki visszafejti az appot, ne értse meg, hogyan működik.
  • Integrity Check (Integritás ellenőrzés): Védekezés a "feltört" (rootolt/jailbreakelt) telefonok ellen. A banki appok megkérdezik az operációs rendszert (Android: Play Integrity API / iOS: DeviceCheck/App Attest), hogy "Biztonságos ez a telefon?". Ha nem, megtagadják a belépést.

Platform Specifikumok: Hogyan csináljuk?

Íme, hogyan valósulnak meg a fenti elvek a gyakorlatban a különböző technológiákkal.

Kategória Android (Kotlin) iOS (Swift) Keresztplatform (Flutter)
Jogosultság kérés ActivityResultContracts, Manifest engedélyek (Normal vs Dangerous) Info.plist (Usage Descriptions, pl. NSCameraUsageDescription) permission_handler csomag
Jogosultság magyarázat shouldShowRequestPermissionRationale + egyedi dialógus Kötelező az Info.plist-ben megírni az okot Fejlesztőnek kell UI-t írnia a kérés előtt
Biztonságos Tárolás EncryptedSharedPreferences, KeyStore Keychain Services flutter_secure_storage
Biometria BiometricPrompt LocalAuthentication (Face/Touch ID) local_auth csomag
Hálózat (Pinning) Network Security Config (res/xml) TrustKit, ATS kivételek ssl_pinning_plugin
Eszköz Integritás Play Integrity API (korábban SafetyNet) App Attest, DeviceCheck API freerasp / Firebase App Check
Kódvédelem ProGuard / R8, -keep annotációk Fordított kód nehezebben olvasható Flutter alapból Obfuscate flag-gel buildelhető

(Megjegyzés: Az iOS 17 bevezette a Privacy Manifest-et, ami kötelezővé teszi a fejlesztőknek, hogy pontosan dokumentálják, milyen felhasználói adatokat miért gyűjtenek. Ennek hiányában az Apple elutasíthatja az appot!)

Példa Promptok AI (ChatGPT/Gemini) használatához

Használd ezeket a promptokat, ha kódolás közben biztonságos megoldásokat szeretnél generáltatni:

Biztonságos tárolás:

"Írj egy Flutter (Dart) szerviz osztályt, ami a flutter_secure_storage csomagot használja egy OAuth refresh token elmentésére és kiolvasására. Írj hozzá hibakezelést is!" UX barát jogosultság (iOS): "Hogyan állítsam be az Info.plist-ben az NSCameraUsageDescription kulcsot úgy, hogy az Apple Review csapata biztosan elfogadja? Adj egy meggyőző és a szabályoknak megfelelő angol példamondatot egy QR kód olvasó apphoz!" Hálózatvédelem (Android): "Mutass egy példát egy Android network_security_config.xml fájlra, ahol Certificate Pinning-et állítok be a api.sajatappom.hu domainre. Hogyan tudom kinyerni a szerverem public key hash-ét ehhez?" Hardver / Szenzorok: "Írj egy Android ActivityResultContract alapú Kotlin kódot, ami elkéri a 'Fine Location' engedélyt. Ha a felhasználó korábban elutasította (shouldShowRequestPermissionRationale igaz), mutass egy Alert Dialog-ot, ami elmagyarázza, miért kell a GPS a futáskövető funkcióhoz!"

Irodalomjegyzék