Inginerie inversă a aplicației Android Subway

Este grozav să vedem adoptarea tot mai mare a fixarii certificatelor în aplicațiile Android. Când întâlnesc o aplicație care aruncă erori de conexiune în timp ce încerc să trimită solicitări de proxy, tind să devin mai interesat să merg mai adânc. Așa a fost cazul când am folosit recent aplicația Subway. Inversarea APK-ului a evidențiat fixarea certificatului printre alte câteva descoperiri interesante.

Pornirea aplicației în timpul solicitărilor de proxy a provocat această eroare:

Fixarea este suficient de simplă pentru a ocoli. Am început prin a decompila aplicația și prin a analiza codul sursă pentru fixarea cuvintelor cheie. De fapt, am găsit implementări de fixare în două clase separate care au fost implementate X509TrustManager. Iată una dintre metodele care au impus fixarea:

 // Code removed at request of Subway leadership

Ocolirea acestui lucru a fost la fel de simplă ca și adăugarea unei instrucțiuni return în codul smali pentru a sări peste codul de fixare în metoda de mai sus. Observați adăugarea lui întoarcere-gol declarație de mai jos:

 // Code removed at request of Subway leadership

După recompilarea aplicației și instalarea, am fost surprins să văd această nouă eroare:

Subway folosea un proces personalizat de verificare a semnăturii aplicației pentru a preveni inversarea APK-ului. Gândind sursa pentru mențiuni despre acest proces, am urmărit-o înapoi la următoarea metodă:

 // Code removed at request of Subway leadership

Aceasta a fost o încercare interesantă de a preveni ingineria inversă, deși de fapt a provocat doar o ușoară întârziere. Pentru a ocoli acest proces, am adăugat pur și simplu o linie pentru a sări peste execuția metodei adăugând o alta întoarcere-gol linie, similar cu procesul de ocolire a fixarii de mai sus.

 // Code removed at request of Subway leadership

După recompilare și instalare a aplicației, am reușit să transmit cu succes solicitările proxy:

În timpul cercetărilor mele, am dat peste cap această postare Reddit. Aparent, Subway determina și dacă dispozitivul utilizatorului a fost rootat. Am căutat în sursă și am confirmat mențiuni despre metodele de detectare a rădăcinilor.

 // Code removed at request of Subway leadership

Acesta este un exemplu grozav al unei aplicații care ia foarte în serios securitatea, dar nu sunt foarte sigur de raționamentul din spatele procesului de verificare a rădăcinilor. Deși tehnicile de fixare a certificatelor și de verificare a semnăturii sunt în general o idee bună, ele împiedică doar ușor procesul de inginerie inversă.