Wspaniale jest widzieć coraz większą popularność przypinania certyfikatów w aplikacjach na Androida. Kiedy natrafiam na aplikację, która zgłasza błędy połączenia podczas próby przesłania żądań proxy, zwykle bardziej interesuje mnie głębsze nurkowanie. Tak było, gdy ostatnio korzystałem z aplikacji Subway. Odwrócenie pliku APK ujawniło między innymi przypinanie certyfikatów.
Uruchamianie aplikacji podczas żądań proxy spowodowało ten błąd:
Przypinanie jest wystarczająco proste, aby je ominąć. Zacząłem od dekompilacji aplikacji i przeanalizowania kodu źródłowego pod kątem przypinania słów kluczowych. Właściwie znalazłem przypinające implementacje w dwóch oddzielnych klasach, które zaimplementowały Menedżer zaufania X509. Oto jedna z metod, która wymusiła przypinanie:
// Code removed at request of Subway leadership
Pominięcie tego było tak proste, jak dodanie instrukcji return w małym kodzie, aby pominąć kod przypinania w powyższej metodzie. Zwróć uwagę na dodanie zwrot-nieważny oświadczenie poniżej:
// Code removed at request of Subway leadership
Po ponownej kompilacji i instalacji aplikacji ze zdziwieniem zobaczyłem nowy błąd:
Subway korzystał z niestandardowego procesu weryfikacji podpisu aplikacji, aby zapobiec cofnięciu pliku APK. Szukając w źródle wzmianek o tym procesie, prześledziłem go według następującej metody:
// Code removed at request of Subway leadership
Była to interesująca próba zapobiegania inżynierii wstecznej, chociaż w rzeczywistości spowodowała tylko niewielkie opóźnienie. Aby ominąć ten proces, po prostu dodałem linię, aby pominąć wykonanie metody, dodając kolejną zwrot-nieważny linię, podobnie jak w przypadku powyższego procesu obejścia przypinania.
// Code removed at request of Subway leadership
Po ponownej kompilacji i zainstalowaniu aplikacji udało mi się pomyślnie przesyłać żądania proxy:
Podczas moich badań natknąłem się na ten post na Reddicie. Najwyraźniej Subway sprawdzał również, czy urządzenie użytkownika zostało zrootowane. Przeszukałem źródła i potwierdziłem wzmianki o metodach wykrywania rootowania.
// Code removed at request of Subway leadership
To świetny przykład aplikacji, która bardzo poważnie podchodzi do bezpieczeństwa, ale nie jestem do końca pewien, jakie są przyczyny procesu sprawdzania uprawnień roota. Chociaż techniki przypinania certyfikatów i weryfikacji podpisów są ogólnie dobrym pomysłem, tylko w niewielkim stopniu utrudniają proces inżynierii wstecznej.