Kategorie
Android Porady

Jak zainstalować na Androidzie program z nieznanego źródła i mieć pewność, że niczym nie ryzykujemy?

Taka sytuacja – włączamy sobie na Androidzie nasz Ulubiony Program Którego Używamy Od Lat i nagle okazuje się, że autorzy usunęli albo totalnie przerobili naszą Ulubioną Funkcję. Wydaje się, że jest pozamiatane – starszej wersji w Google Play nie znajdziemy, z kolei ręczna instalacja archiwalnych plików APK znalezionych gdzieś w szemranych odmętach sieci wiąże się z ryzykiem infekcji szkodliwym oprogramowaniem. Co robić?

Rozwiązanie istnieje! W niniejszym tekście opisuję, jak sprawdzić, czy plik APK pobrany z przypadkowej lokalizacji nie został przez kogoś zmodyfikowany. W tym celu zweryfikujemy podpis elektroniczny, którym opatrzone są wszystkie aplikacje wysyłane do sklepu Play. W procesie tym używane są dwa klucze, publiczny i prywatny. Publiczny jest jawny i pozwala stwierdzić ze stuprocentową pewnością, że cała zawartość pliku APK z grą lub programem została podpisana kluczem prywatnym, stanowiącym sekret wydawcy aplikacji.

Procedura będzie następująca: najpierw sprawdzimy sygnaturę (skrót) klucza, którym podpisano aplikację obecną w Google Play – to będzie nasze wzorcowe, zaufane źródło wiedzy. Następnie ściągniemy z sieci stare wersje tej aplikacji i sprawdzimy, czy tamtejsze sygnatury są identyczne ze wzorcem. Jeśli tak, możemy bez strachu instalować te pliki mimo niezaufanego źródła, bo mamy pewność, że wygenerował je posiadacz klucza prywatnego, więc jest to de facto źródło zaufane.

APK to JAR czyli ZIP

Plik APK (Android Package) z aplikacją Androidową to tak naprawdę archiwum ZIP o strukturze zbliżonej do pakietów JAR (Java Archive). Możliwe jest więc użycie narzędzi wchodzących w skład Java Development Kit (JDK): przy użyciu programu jarsigner da się zweryfikować poprawność podpisów zaś przy użyciu programu keytool – wyświetlić kryptograficzny skrót (fingerprint) certyfikatu.

My użyjemy jednak narzędzi z androidowego SDK, bo przez 10 lat istnienia zielony robocik dorobił się trzech wersji procedury weryfikacji podpisów – pierwsza to metoda klasyczna, zgodna z podpisywaniem JAR-ów. Metody druga i trzecia debiutowały w systemach Android wersji 7.0 i 9 a pozwalają na znacznie szybszą weryfikację podpisu i wykrycie szerszego zakresu modyfikacji zawartości APK. Dodatkowo wersja trzecia wprowadza możliwość rotacji kluczy, ale ten temat świadomie pomijamy. Zainteresowani znajdą wszystkie szczegóły na stronie https://source.android.com/security/apksigning

Najnowszą wersję Android Studio lub samych tylko narzędzi obsługiwanych z linii komend znajdziemy na stronie https://developer.android.com/studio. Program apksigner, którego użyjemy, leży w katalogu build-tools, potrzebna będzie wersja SDK 29 lub nowsza.

Zwróćmy uwagę, że w całym procesie nie bierze udziału infrastruktura klucza publicznego (PKI) ani urzędy certyfikacji (CA) – certyfikaty są samopodpisane a ich data obowiązkowo wybiega dziesięciolecia w przyszłość. Nie mają więc zastosowania dobre praktyki dotyczące certyfikatów używanych do szyfrowania komunikacji HTTPS.

Sprawdzamy sygnaturę podpisu oryginalnej gry

Weźmy na warsztat grę Subway Surfers, jedną z najstarszych i najpopularniejszych gier zręcznościowych na Androida, która jako pierwsza przekroczyła miliard pobrań. Instalujemy ją ze sklepu Play.

Następnie instalujemy program Apk Extractor którym skopiujemy oryginalny plik APK z grą na kartę SD do katalogu ExtractedApks, skąd będziemy ją mogli łatwo przenieść go kablem do komputera. U mnie zapisany plik nosi nazwę Subway Surf_com.kiloo.subwaysurf.apk

Komenda, którą zweryfikuję podpis, to

apksigner verify --verbose --print-certs "Subway Surf_com.kiloo.subwaysurf.apk"

Uzyskany rezultat wygląda następująco:

Plain Text

Dowiadujemy się, że plik jest poprawny (linia 1), że zawiera podpisy w wersji pierwszej i drugiej (linie 2-4) zaś heksadecymalny zapis skrótu SHA-256 certyfikatu zaczyna się od a0328a96ac93be79… (linia 7). Pominąłem kilka dodatkowych linii z ostrzeżeniami, że APK zawiera w katalogu META-INF kilka niepodpisanych plików, lecz to ostrzeżenie możemy zignorować – pliki te nie są do niczego używane.

Sprawdzamy sygnaturę starszej wersji gry

Z popularnego serwisu APKMirror.com pobrałem plik APK z wersją gry pochodzącą z początków roku 2019. Czy jej instalacja byłaby bezpieczna? Przekonajmy się:

apksigner verify --verbose --print-certs "com.kiloo.subwaysurf_1.98.0-1130_minAPI16(armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"

Plain Text

Skróty certyfikatu i klucza są identyczne, jak w poprzednim przypadku – mamy więc pewność, że plik przechowywany w serwisie apkmirror.com jest identyczny z oryginałem wysłanym dawniej do Google Play. Okazuje się, że APKMirror pozwala na wyszukiwanie za pomocą skrótu certyfikatu, co może być wygodnym ułatwieniem.

Warto spostrzec, że jeśli nowa wersja oprogramowania łatała usterki bezpieczeństwa, to ręczna instalacja starszej wersji ponownie narazi użytkownika na skutki usuniętych błędów.

Sprawdzamy sygnaturę gry z nieskończonymi monetkami

Z innego serwisu, znanego z dystrybucji pirackich wersji gier i programów, pobrałem grę Subway Surfers wzbogaconą o nieskończoną liczbą monet, za które można kupować ułatwienia i nowe elementy wizualne. W normalnej wersji monety trzeba mozolnie zbierać podczas rozgrywki lub kupować za prawdziwe pieniądze.

Rezultat testu wygląda następująco:

apksigner verify --verbose --print-certs subway-surf-mod_1.115.0-an1.com.apk

Plain Text

Widzimy, że wszystkie szczegóły certyfikatu i klucza różnią się od wartości obserwowanych poprzednio. Stanowi to potwierdzenie, że gra została rozpakowana, zmodyfikowana (nieskończone monety) i podpisana na nowo certyfikatem wygenerowanym przez crackera. Nie możemy mieć pewności, jakie jeszcze modyfikacje zostały wprowadzone do pliku z grą, więc w takiej sytuacji należy trzymać się od niego jak najdalej i pod żadnym pozorem nie instalować na żadnym urządzeniu.

Jakie mogą być skutki instalacji takiego oprogramowania? Co jest w stanie zdziałać złośliwe oprogramowanie? Będzie to tematem jednego z kolejnych tekstów. Zapisz się na newsletter, aby otrzymywać informacje o ważniejszych aktualizacjach!



O autorze: zawodowy programista od 2003 roku, pasjonat bezpieczeństwa informatycznego. Rozwijał systemy finansowe dla NBP, tworzył i weryfikował zabezpieczenia bankowych aplikacji mobilnych, brał udział w pracach nad grą Angry Birds i wyszukiwarką internetową Microsoft Bing.

2 odpowiedzi na “Jak zainstalować na Androidzie program z nieznanego źródła i mieć pewność, że niczym nie ryzykujemy?”

Ja mam watpliwosci czy instalacja jakiejkolwiek aplikacji na androidzie (czy w zasadzie kazdym innym systemie) nie powinna byc traktowana jako potencjalnie szkodliwa. Bo co w przypadku gdy producent tej wspanialej, najlepszej i przez nas tak uwielbianej apki zdecyduje nagle podniesc uprawnienia (zarzadac dostep do wczesniej nie wymaganych funkcji) i nie wyjasni co i jak. Po co zabiera nasza ksiazke adresowa albo sprawdza zdjecia? Certyfikat bedzie ok, podpis ok a program robi co chce (moze miec trojana jako ‚feature’) a my nie mamy kontroli. Po za tym gry jak wyzej wspomniana maja okropny zwyczaj „proponowac” inne gry czy aplikacje w sposob conajmniej bandycki a pewnosci tez miec nie mozemy kto jest brokerem tych sugestii, bo przeciez wcale nie koniecznie jest to producent aplikacji.

Nowe uprawnienia nie przyznają się same, więc kontrolę mamy. Ale pierwsze zdanie bardzo mi się podoba 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *