Reverse Engineering the Subway Android App

Det är fantastiskt att se den ökande användningen av certifikatfästning i Android-appar. När jag stöter på en app som kastar anslutningsfel när jag försöker proxyförfrågningar, tenderar jag att bli mer intresserad av att dyka djupare. Så var fallet när jag nyligen använde Subway-appen. Att vända APK-filen avslöjade att certnålning bland några andra intressanta fynd.

Att starta appen medan proxyförfrågningar orsakade detta fel:

Att fästa är enkelt nog att kringgå. Jag började med att dekompilera appen och analysera källkoden för att fästa nyckelord. Jag hittade faktiskt pinningsimplementeringar i två separata klasser som implementerade X509TrustManager. Här är en av metoderna som framtvingade pinning:

 // Code removed at request of Subway leadership

Att kringgå detta var så enkelt som att lägga till en retursats i smali-koden för att hoppa över pinningskoden i metoden ovan. Observera tillägget av return-void uttalande nedan:

 // Code removed at request of Subway leadership

Efter att ha kompilerat om appen och installerat blev jag förvånad över att se detta nya fel:

Subway använde en anpassad appsignaturverifieringsprocess för att förhindra att deras APK-fil vänds tillbaka. Jag tog källan för omnämnanden av denna process och spårade den tillbaka till följande metod:

 // Code removed at request of Subway leadership

Detta var ett intressant försök att förhindra reverse engineering, även om det faktiskt bara orsakade en liten fördröjning. För att kringgå denna process lade jag helt enkelt till en rad för att hoppa över metodens exekvering genom att lägga till en annan return-void linje, liknande förbikopplingsprocessen ovan.

 // Code removed at request of Subway leadership

Efter att ha kompilerat om och installerat appen kunde jag framgångsrikt utföra proxyförfrågningar:

Under min research snubblade jag på detta Reddit-inlägg. Tydligen avgjorde Subway också om användarens enhet hade rotats. Jag sökte runt i källan och bekräftade omnämnanden av rotdetekteringsmetoder.

 // Code removed at request of Subway leadership

Det här är ett bra exempel på att en app tar säkerheten på största allvar, men jag är inte helt säker på resonemanget bakom rotkontrollprocessen. Även om tekniker för pinning av certifikat och signaturverifiering i allmänhet är en bra idé, hindrar de bara lite omvänd ingenjörsprocess.