Teszteljük a visszafejtett kódot
Mi az APK fájl?
Az android application package (APK) egy alkalmazáscsomag, amivel a Google Android platformjára lehet alkalmazásokat installálni. Hasonlít az installerekre, ahol az állományok egyben vannak összecsomagolva. Egy ilyen APK fájl programkódot (*.dex fájlok), manifeszt fájlokat, forrásokat és certifikátokat tartalmaz.
Az APK egyszerűen egy archív fájl, osztályokkal és forrásokkal. A Dalvik számára futtatható állományok a classes.dex-ben lesznek elérhetőek. A Classes.dex tartalmazza a lefordított futtatható kódot, osztályokat, metódusokat, amelyek az üzleti logika megoldását szolgálják. Az egyik képes a classes.dex fájlt (ami a gép számára olvasható formátumban van) átfordítani JAR fájllá (ami az ember számára olvasható formátumban van). (A segédállományok listája cikk végén a függelékben találhatóak meg.)
Az APK fájl struktúra
A speciális fájlok, karakterkészletek, 3rd party SDK-k és az integrációjuk a com könyvtárban találhatóak.
Manifest fájl
Egy Android alkalmazásnak rendelkeznie kell egy “AndroidManfiest.xml”állománnyal az APK főkönyvtárában, ahogy a fenti struktúrában látszik. Ez tartalmazza azokat a szükséges engedélyeket, melyek az installálás során szükségesek, valamint egyéb részleteket is. Vannak olyan Android alkalmazások, amelyekkel a manifeszt és az installált alkalmazás megtekinthető. A manifeszt ugyanúgy olvasható az APK-ből is a megfelelő eszközök segítségével. (Lásd a függeléket.)
Dex (Dalvik Executable)
Az Android alkalmazások Java-ban íródnak, és a DVM-ben futtathatóak (Dalvik Virtual Machine). Ez eltér a JVM-től (Java Virtual Machine). A DVM az Android operációs rendszer számára lett kiépítve. A Java kód DVM kóddá transzformálódik és a .dex, valamint a .odex (Optimized Dalvik Executable) kiterjesztésű állományokban van tárolva. Az odex és a deodex kifejezések a Dalvik műveletekkel vannak összekapcsolva.
Amikor a Java fordító létrehozza a JVM kódot, a Dalvik letörli a class fájlokat és újrafordítja azokat. Ezek után a Dalvik mindet egy .dex fájlba csomagolja össze. Ezalatt az idő alatt a fordítás, újraépítés megtörténik az osztályokban.
Van egy határ, hogy egy .dex fájl pontosan mit és pontosan mennyit tartalmazhat. Ennek megfelelően az APK egy vagy több .dex állományt is tartalmazhat.
Erről a limitről a JAR fájlban található bővebb információ, ha a .dex-ről JAR-ra való konverzió után a JAR fájl megtekintjük. Ez árulkodik az alkalmazás összetettségéről és innen szerezhetünk információt a tesztelésre vonatkozóan is, hogy hogyan tudjuk minél körültekintőbben tesztelni az alkalmazást. Az Android 5.0 ART, dex fájl OAT fájllá konvertálódik így: è Java -> Class à Dexà OAT. Ennek a tanulmányozása hasznos lehet, hogy jobb teszteket tudjunk kidolgozni.
JAR visszafejtés
A JAR fájlok a Java decomplierrel tekinthetők meg. Rendszerint a visszafejtett kódok össze vannak kavarva (hála a fejlesztői torzításnak), viszont rálátást adnak az osztályokra és a metódusokra. Bár a visszafejtett kód nem tartalmazza az egész forrást, de tartalmaz olyan fontos információkat, amiből az üzleti logika kiolvasható. A tesztelők a forráskód áttekintése után pontosan látják majd, hogy mit és hogyan kell tesztelni, valamint fontos javaslatokat tehetnek a fejlesztőknek a fejlesztésre vonatkozóan. Ha a kód nem teljesen kusza, abban az esetben a termékfelelősöknek és a programozóknak is hasznos lehet. Az olvasást megkönnyítik különböző célszoftverek, mint a ProGuard és a DexGuard.
A visszafejtett JAR fájl fontos tesztjei
1. Olvasható üzleti logika
Az illetéktelen hozzáférések elkerülése érdekében a fejlesztők különböző biztonsági mechanizmusokat alkalmaznak. Ha a kód egyszerű szöveg formátumban van, az annyit jelent, hogy a kód olyan mértékben olvasható és érthető, hogy áttekinthetővé teszi a lefordított függvényeket és osztályokat. A kód egyes részei szabadalmaztatva lehetnek, vagy szabadalmaztatás előtt állhatnak. Az is elképzelhető, hogy pont ebben a kódrészben található az üzleti logika nagy része. Az ilyen formán nyíltan és olvashatóan tárolt kódok nagy veszélyt jelentenek a szervezet hírnevére, valamint a cég bevételére is.
Megoldás
A kódnak minden esetben torzítottnak kell lennie. A torzítás egy olyan folyamat, amely során a szervezet úgy rejti el a kódot, hogy az üzleti logika ne lehessen kiolvasható, a kód ne legyen másolható, reprodukálható. A ProGuard az egyik ilyen eszköz, amivel általában a programozók a kódokat torzítani szokták.
2. Manifest fájl
Az engedélyek mindenki számára elérhető, aki látja a manifest fájlt, ennélfogva teljes képet ad arról, hogy az adott alkalmazásnak milyen engedélyekre van szüksége a futáshoz. Ez egy újabb biztonsági kérdés.
Megoldás
Tanácsos a manifeszteket is titkosítva tárolni, ami megnehezíti a hackerek dolgát, hogy visszafejtsék és megnézzék a fájlt. A webes technológiákban van néhány titkosítási eljárás, ellenben a mobilos világban utána kell járni ezeknek a lehetőségeknek. Az Android áruház megköveteli az alkalmazások forrásának a titkosítását, és az engedélyeket a felhasználók számára elérhetővé kell tenni. A tesztelőn múlik, hogy ezeket az engedélyeket megvizsgálja és azonosítsa a potenciális kockázatokat.
3. getDeviceID() használata
Úgy tisztességes, ha bárki nyomon követheti az eszközén az egyes installálásokat. Valószínű, hogy a TelephonyManager.getDeviceId() meghívásával kinyerhető a kívánt adat és beazonosítható a telepítés. Vannak azonban problémák ezzel. Először is, nem mindig működik. Másodszor pedig ha mégis működik, akkor az értékek túlélhetik még a gyári állapot visszaállítását is, így csúnya hibát okozhatnak amikor a felhasználó törli az eszközét és átadja azt egy másik felhasználónak.
Megoldás
Nagyon sok jó megoldás van arra, hogy azonosítsunk egy eszközt. Azoknak, akik használni akarják, ajánlom az ANDROID_ID-t.
Nagyon ajánlott annak a tanulmányozása, hogy az alkalmazások hogyan használják az engedélyeket. Ha ezek nincsenek jól kezelve, az alkalmazás a személyes adatainkhoz is hozzáférhet bizonyos esetekben. A visszafejtett JAR lehet ebben a segítségünkre.
4. A forrásfájlok hozzáférhetősége
A forrás XML fájlok, fontos képek és egyéb állományok egyszerűen letölthetők és hozzáférhetőek. Nagyon fontos ezen állományok titkosítása.
Megoldás
A forrásállományokat ne lehess visszafejteni az APK-ból.
Összefoglalás
Az egy közhely, hogy a JAR visszafejtés a biztonsági teszteléshez kapcsolódik. De ez nem igaz. A visszafejtés az alkalmazás jobb megértését segíti elő. Segíti a funkciók működésének átlátásában, az alkalmazás teljesítményének mérésében és a túlzott memóriahasználat kiküszöbölésében. Legközelebb, egy alkalmazás visszafejtésénél figyeljünk ezekre a kincsekre és fedezzük fel a számtalan lehetőséget.
A csapatom és jómagam kidolgoztunk néhány kulcs tesztet azokhoz az Androidos alkalmazásokhoz amiket teszteltünk. Ezek a kulcstesztek jó szolgálatot tettek a fejlesztőknek az alkalmazást illetően és abban, hogyan fog majd az alkalmazás a Google világba illeszkedni. Azok számára, akik nem tudták, mennyi veszély leselkedik egy APK fájlban, nekik is jó gyakorlat volt. Továbbá a tesztcsapatnak is segített a fejlesztőkkel való együttműködésben.
Köszönetnyilvánítás
Ravisuriya-nak, aki lektorálta a cikket és folyamatosan támogatott. Köszönöm Ravi!
Függelék
Mit kell egy Java kódban mindenképp ellenőrizni?
1. Az alkalmazás általános kondíciói (forráskód, bizalmas adatok)
2. Biztonsági auditok (a kód nincs titkosítva)
a. Érzékeny adatok
b. Hiányos hozzáférési szabályok
c. Kód sebezhetőségek
d. Jogosultságvizsgálatok
Third-party protokollok, API-k vizsgálata
APK Védelem
Az APK fájl védelme egy külön fejezet az ingyenes Internet világában. A fejlesztőknek állandóan figyelniük kell erre az APK fájlok készítésekor. Rengeteg megoldás van az APK védelmére, valamint rengeteg cikk is foglalkozik a témával. A legfőbb témákat listába szedtem, amikről bővebben is tájékozódhatunk az Android-os fejlesztői oldalakon.
1. Biztonságos Java forráskód
2. Class fájlok titkosítása
3. Kódok torzítása
Eszközök a JAR visszafejtéséhez
1. Dex2jar – Eszköz az Android *.dex és java *.class állományokhoz
2. JAD – Java nyelv visszafejtő
3. JD-GUI – Egy grafikus segítség a *.class állományok visszafejtéséhez
4. APKtool – 3rd party reverse-engine eszköz androidos applikációkhoz
5. Winzip / WinRAR – tömörítés
6. Proguard – Ingyenes Java class fájlok visszafejtéséhez
7. APK Protect – APK védelem
Referenciák:
http://en.wikipedia.org/wiki/Android_application_package
http://www.decompileandroid.com/
Forrás: http://curioustester.blogspot.hu/2015/01/key-tests-on-decompiled-jar-of-dex-file.html
Szerző: Parimala Hariprasad
A szerző
- Parimala kilenc évnyi tapasz- talattal rendelkezik tesztelés, vezetés és szoftvertesztelő csapatok trenírozásában. Dolgozott már CRM, biztonsági, kereskedelmi és támogatás- automatizálási területeken. A tesztelés mellett – amit nagy szenvedéllyel űz – nagyon kedveli a tesztelők trenírozását is. Gyakran ír tapasztalatairól a http://curioustester .blogspot.com oldalon. Emellett még számos cikket publikált tapasztalatairól olyan magazinokban, mint a Better Software, Testing Circus és Testing Planet. Parimala aktív résztvevője a területhez kapcsolódó konferenciáknak és találkozóknak. Mélyen hisz a csapatmunkában, és segíti a csapatokat, hogy közösen dolgozzanak a végső cél elérésében. Ha épp nem tesztel, szívesen játszik két tündéri gyermekével, könyveket, magazinokat, cikkeket olvas, és még sok mást. Jelenleg tesztmenedzserként dolgozik a Moolya Software Testing Pvt Ltd-nél, Bangalore-ban. Elérhető a parimala@moolya.com címen vagy twitteren @CuriousTester néven.