APK paketo anatomija ir statinė analizė
Android programėlės platinamos kaip APK (angl. Android Application Package) failai, kurie iš esmės yra specialios struktūros ZIP archyvai. Norint suprasti programėlės veikimą ir saugumą prieš ją įdiegiant, atliekama statinė analizė – paketo turinio ir deklaruojamų duomenų patikra neleidžiant ir neinstaliuojant pačios programos. Šiam tikslui naudojamas įrankis „APK Info Viewer“.
Kiekviename suderinamame APK faile privalo būti pagrindinis manifestas AndroidManifest.xml. Šiame faile aprašomi visi svarbiausi programos parametrai: unikalus paketo pavadinimas, reikalaujamos operacinės sistemos versijos, prašomi leidimai prieiti prie įrenginio funkcijų bei programos architektūriniai komponentai. Jei faile šio manifesto nėra arba jo neįmanoma perskaityti, įrankis atmeta failą ir pateikia klaidą: „Tai nepanašu į APK: viduje nerasta skaitomo AndroidManifest.xml.“.
Be manifesto, APK paketą sudaro sukompiliuotas kodas DEX formatu (.dex failai), programos ištekliai (pavyzdžiui, vartotojo sąsajos elementai, paveikslėliai), papildomi elementų failai (angl. assets) bei skaitmeniniai parašai, užtikrinantys paketo vientisumą.
Reikalavimai operacinei sistemai ir SDK versijos
Kiekvienas APK failas nurodo suderinamumo ribas, kurios apibrėžia, kuriuose įrenginiuose programa gali veikti ir kaip ji elgsis skirtingose Android versijose. Įrankio skiltyje „Reikalavimai“ (secRequirements) pateikiama ši informacija:
- Minimali Android (
lMinSdk): nurodo žemiausią operacinės sistemos versiją, kurioje programa dar gali būti paleista. Ataskaitoje tai vaizduojama formatu „Android‹version›(API‹level›)“ arba tiesiog „API‹level›“. - Numatytoji Android (
lTargetSdk): nurodo API lygį, kuriam programa buvo sukurta ir išbandyta. Ši reikšmė nustato, kokias saugumo ir privatumo taisykles operacinė sistema taikys programėlei. Rodoma formatu „Android‹version›(API‹level›)“ arba „API‹level›“. - maks. SDK
‹n›(lMaxSdk): jei taikoma, nurodo viršutinę suderinamumo ribą, kurios viršijus programa nebebus paleidžiama.
Šių parametrų analizė leidžia iš anksto įvertinti, ar programa suderinama su jūsų įrenginiu ir ar ji naudoja šiuolaikinius Android saugumo standartus.
Android leidimų vertinimas ir pavojingumo žymos
Siekdamos pasiekti įrenginio funkcijas ar vartotojo duomenis, programėlės privalo deklaruoti atitinkamus leidimus. Skiltyje „Leidimai“ (secPermissions) pateikiamas visas prašomų leidimų sąrašas.
Android sistemoje leidimai skirstomi pagal jų įtaką vartotojo privatumui. Leidimai, kurie suteikia prieigą prie jautrių duomenų (pavyzdžiui, tikslios buvimo vietos, kontaktų, kameros, mikrofono ar saugyklos), yra klasifikuojami kaip pavojingi. Įrankis „APK Info Viewer“ automatiškai surikiuoja leidimus taip, kad sąrašo viršuje būtų teikiamas prioritetas tiems, kurie turi žymą „Pavojingas“ (lDangerous).
Vartotojui svarbu įvertinti, ar prašomi leidimai atitinka realią programos paskirtį. Pavyzdžiui, jei paprastas skaičiuotuvas reikalauja prieigos prie kontaktų knygelės ar vietovės nustatymo, tai gali būti rimtas signalas dėl galimo piktnaudžiavimo ar saugumo rizikos.
Programos komponentai ir jų eksportavimas
Android programos struktūrą sudaro keturi pagrindiniai komponentų tipai, kurie deklaruojami manifeste ir yra matomi skiltyje „Komponentai“ (secComponents):
- Activities: programos ekranai, su kuriais tiesiogiai sąveikauja vartotojas.
- Services: foniniai procesai, atliekantys ilgalaikes užduotis be vartotojo sąsajos.
- Receivers: komponentai, reaguojantys į sistemos ar kitų programų siunčiamus pranešimus.
- Providers: duomenų šaltiniai, leidžiantys programai bendrinti savo duomenis su kitomis programomis.
Kiekvienas iš šių komponentų gali turėti žymą „eksportuota“ (lExported). Eksportuotas komponentas reiškia, kad jį gali iškviesti arba pasiekti kitos įrenginyje įdiegtos programos. Jei komponentas nėra eksportuotas arba teikėjo (angl. provider) autoritetas neegzistuoja, rodoma reikšmė „Nėra“ (none).
Siekdamas išlaikyti sąsajos aiškumą, įrankis riboja rodomų komponentų skaičių iki 100 įrašų kiekvienoje kategorijoje. Jei šis skaičius viršijamas, sąrašo gale pridedama žyma „+‹count› daugiau“ (lMore).
Pasirašymo sertifikatai ir autentiškumo tikrinimas
Kiekvienas platinamas APK failas privalo būti pasirašytas kūrėjo skaitmeniniu sertifikatu. Android naudoja kelias pasirašymo schemas (v1 PKCS#7, v2, v3 ir v3.1), kurios užtikrina, kad programos kodas nebuvo modifikuotas po jo išleidimo.
Skiltyje „Parašai“ (secSignatures) pateikiama išsami informacija apie kiekvieną pasirašytoją:
- Pasirašytojas
‹n›(lSigner) - Subjektas (
lSubject) - Išdavėjas (
lIssuer) - Serijos numeris (
lSerial) - Galioja nuo (
lValidFrom) ir Galioja iki (lValidTo) - Parašo algoritmas (
lSigAlg) bei Rakto algoritmas (lKeyAlg) - Sertifikato pirštų atspaudai (MD5, SHA-1 ir SHA-256).
Jei pakete nerandama jokia atpažįstama parašo struktūra, rodomas pranešimas: „Nerasta atpažinto parašo bloko – paketas gali būti nepasirašytas arba perpakuotas.“.
Svarbu suprasti, kad įrankis tik ištraukia ir atvaizduoja X.509 sertifikatų metaduomenis. Jis neatlieka kriptografinio parašų vientisumo tikrinimo, nevertina sertifikatų pasitikėjimo grandinės ir nepatvirtina realios leidėjo tapatybės. Vartotojas turi pats palyginti gautus pirštų atspaudus su oficialiai kūrėjo skelbiamais duomenimis.
Vietinis apdorojimas naršyklėje ir privatumas
„APK Info Viewer“ veikia visiškai vartotojo įrenginyje, naudojant vietinį naršyklės procesą (angl. Worker). Tai reiškia, kad jokie failai ar jų duomenys nėra siunčiami į išorinius serverius. Analizuojamas APK failas nėra įdiegiamas ar paleidžiamas, todėl procesas yra saugus net ir tiriant įtartinus paketus.
Apdorojimo metu įrankis naudoja šiuos būsenos pranešimus:
- „Paruošta. Norėdami patikrinti, nutempkite APK čia.“ (
ready). - „Skaitoma
‹name›…“ (reading). - „Skaičiuojamos failo maišos reikšmės –
‹percent›%“ (hashing) – skaičiuojamos viso APK failo MD5, SHA-1 ir SHA-256 maišos reikšmės, kurios vėliau pateikiamos skiltyje „Failo maišos“ (secHashes). - „Analizuojamas paketas…“ (
parsing). - „Ataskaita paruošta.“ (
done).
Vartotojas gali atsisiųsti sugeneruotą ataskaitą spustelėjęs mygtuką „Atsisiųsti ataskaitą“ (download), po to rodomas pranešimas „Ataskaita atsisiųsta.“ (downloaded). Norint išvalyti rezultatus, naudojamas mygtukas „Išvalyti“ (clear), kuris pakeičia būseną į „Išvalyta.“ (cleared).
Apribojimai ir klaidų tvarkymas
Įrankis turi griežtas taisykles, susijusias su failų dydžiu, kiekiais ir formatais:
| Situacija | Rezultatas / Klaidos pranešimas |
|---|---|
| Įkeliamas failas, didesnis nei 500 MB | „Šis failas yra didesnis nei 500 MB – per didelis, kad naršyklės kortelė galėtų jį saugiai patikrinti.“ (tooLarge) |
| Įkeliami keli failai vienu metu | Apdorojamas tik pirmasis failas, parodant pastabą: „Tik po vieną failą – tikrinamas pirmasis.“ (multipleNote) |
| Pateikiamas XAPK arba APKM failas | „Tai XAPK padalintas paketas – kelių APK konteineris. Išsiekite bazinį APK ir tikrinkite tą failą.“ (xapk) |
Pateikiamas Android App Bundle (.aab) |
„Tai Android App Bundle (.aab) – platinimo formatas, o ne diegiamas APK. Vietoj to tikrinkite sukompiliuotą APK.“ (aab) |
| Sugadintas arba nebaigtas atsisiųsti failas | „Paketas atrodo sugadintas arba apkarpytas, todėl jo turinio nepavyko perskaityti.“ (corrupt) |
| Bendro pobūdžio failo skaitymo klaida | „Nepavyko perskaityti failo. Pasirinkite jį iš naujo.“ (unreadable) |
| Kiti nenumatyti analizės sutrikimai | „Patikrinimas nepavyko. Bandykite kitą failą.“ (failed) |
Dažniausiai užduodami klausimai (DUK)
Ką galima sužinoti apie APK jo neįdiegus?
Gana daug: programėlės paketo pavadinimą ir versiją, jai reikalingas Android versijas, kiekvieną prašomą leidimą, deklaruojamus ekranus ir foninius komponentus, procesorių tipus, kuriems skirta gimtoji koduotė, bei sertifikatus, kuriais ji buvo pasirašyta.
Ar šis įrankis gali pasakyti, ar APK yra kenkėjiška programa?
Ne – ir būkite skeptiški bet kuriam įrankiui, kuris žada išvadą po greito patikrinimo. Čia pateikiami faktai: leidimai, komponentai, pasirašytojai ir maišos reikšmės. Palyginkite juos su tuo, ką skelbia kūrėjas, o netikėti leidimai ar kitoks pasirašytojas nei oficialiame leidime yra priežastis pasitraukti.
Kurie failai yra palaikomi?
Vieninteliai APK failai iki 500 MB. Padalinti paketai (XAPK, APKM) ir Android App Bundles (.aab) yra konteineriai arba platinimo formatai, o ne vienas diegiamas paketas, todėl jie atmetami pateikiant aiškų pranešimą, o ne painią ataskaitą.
Ką man pasako pasirašymo duomenys?
Kiekviena Android programėlė yra pasirašyta, o sertifikatas nurodo, kas ją išleido. Matote, kokias parašo schemas naudoja paketas (v1, v2, v3) bei kiekvieno pasirašytojo subjektą, galiojimo laikotarpį ir MD5, SHA-1 bei SHA-256 pirštų atspaudus. Du APK su sutampančiais pirštų atspaudais gauti iš to paties leidėjo – ar pasitikite šiuo leidėju, turite spręsti patys.
Ką reiškia žyma „Pavojinga“ prie leidimo?
Tai oficiali Android klasifikacija: pavojingi leidimai gali pasiekti privačius duomenis – vietovę, kontaktus, kamerą, mikrofoną, saugyklą – todėl sistema prieš juos suteikdama paklausia vartotojo. Ši žyma nėra kaltinimas; vietovės prašanti žemėlapių programėlė yra normalu. Ji tik pažymi leidimus, kuriuos verta perskaityti dukart.