È bello vedere la crescente adozione del blocco dei certificati nelle app Android. Quando mi imbatto in un'app che genera errori di connessione durante il tentativo di inviare richieste proxy, tendo a diventare più interessato ad approfondire. Questo è stato il caso quando di recente ho utilizzato l'app Subway. L'inversione dell'APK ha rivelato il blocco del certificato tra alcuni altri risultati interessanti.
L'avvio dell'app durante l'inoltro delle richieste ha causato questo errore:
Il blocco è abbastanza semplice da aggirare. Ho iniziato decompilando l'app e analizzando il codice sorgente per aggiungere parole chiave. In realtà ho trovato implementazioni di blocco in due classi separate che hanno implementato X509TrustManager. Ecco uno dei metodi che hanno imposto il blocco:
// Code removed at request of Subway leadership
Aggirare questo problema è stato semplice come aggiungere un'istruzione return nel codice smali per saltare il codice di blocco nel metodo sopra. Da notare l'aggiunta del reso-nulla dichiarazione di seguito:
// Code removed at request of Subway leadership
Dopo aver ricompilato l'app e averla installata, sono rimasto sorpreso nel vedere questo nuovo errore:
Subway utilizzava un processo di verifica della firma dell'app personalizzato per impedire l'annullamento dell'APK. Cercando la fonte per le menzioni di questo processo, l'ho fatto risalire al seguente metodo:
// Code removed at request of Subway leadership
Si è trattato di un tentativo interessante di prevenire il reverse engineering, anche se in realtà ha causato solo un leggero ritardo. Per aggirare questo processo, ho semplicemente aggiunto una riga per saltare l'esecuzione del metodo aggiungendone un'altra reso-nulla linea, simile al processo di bypass di blocco sopra.
// Code removed at request of Subway leadership
Dopo aver ricompilato e installato l'app, sono riuscito a inoltrare con successo le richieste:
Durante la mia ricerca, mi sono imbattuto in questo post di Reddit. A quanto pare, Subway stava anche determinando se il dispositivo dell'utente era stato rootato. Ho cercato nella fonte e ho confermato le menzioni dei metodi di rilevamento delle radici.
// Code removed at request of Subway leadership
Questo è un ottimo esempio di un'app che prende molto sul serio la sicurezza, ma non sono del tutto sicuro del ragionamento alla base del processo di controllo del root. Sebbene le tecniche di blocco dei certificati e di verifica della firma siano generalmente una buona idea, ostacolano solo leggermente il processo di reverse engineering.