Det er flott å se den økende bruken av sertifikatfesting i Android-apper. Når jeg støter på en app som kaster tilkoblingsfeil mens jeg prøver å sende proxy-forespørsler, har jeg en tendens til å bli mer interessert i å dykke dypere. Slik var det da jeg nylig brukte Subway-appen. Reversering av APK-en avslørte sertifikatfesting blant noen andre interessante funn.
Å starte appen mens proxy-forespørsler forårsaket denne feilen:
Festing er enkelt nok til å omgå. Jeg startet med å dekompilere appen og analysere kildekoden for å feste nøkkelord. Jeg fant faktisk pinningsimplementeringer i to separate klasser som implementerte X509TrustManager. Her er en av metodene som håndhevet festing:
// Code removed at request of Subway leadership
Å omgå dette var så enkelt som å legge til en retursetning i smali-koden for å hoppe over pinningskoden i metoden ovenfor. Legg merke til tillegget av retur-ugyldig uttalelsen nedenfor:
// Code removed at request of Subway leadership
Etter å ha kompilert appen på nytt og installert, ble jeg overrasket over å se denne nye feilen:
Subway brukte en egendefinert appsignaturverifiseringsprosess for å forhindre reversering av APK-en deres. Jeg fant kilden for omtale av denne prosessen, og sporet den tilbake til følgende metode:
// Code removed at request of Subway leadership
Dette var et interessant forsøk på å forhindre reverse engineering, selv om det faktisk bare forårsaket en liten forsinkelse. For å omgå denne prosessen la jeg ganske enkelt til en linje for å hoppe over metodens kjøring ved å legge til en annen retur-ugyldig linje, på samme måte som omgåingsprosessen ovenfor.
// Code removed at request of Subway leadership
Etter å ha kompilert og installert appen på nytt, var jeg i stand til å fullføre proxy-forespørsler:
Under min research snublet jeg dette Reddit-innlegget. Tilsynelatende avgjorde Subway også om brukerens enhet var rootet. Jeg søkte rundt i kilden og bekreftet omtaler av rotdeteksjonsmetoder.
// Code removed at request of Subway leadership
Dette er et godt eksempel på at en app tar sikkerhet veldig seriøst, men jeg er ikke helt sikker på begrunnelsen bak rotkontrollprosessen. Selv om teknikker for sertifikatfesting og signaturverifisering generelt er en god idé, hindrer de bare litt omvendt utviklingsprosessen.