Ingeniería inversa de la aplicación de Android Subway

Es fantástico ver la creciente adopción de la fijación de certificados en aplicaciones de Android. Cuando me encuentro con una aplicación que arroja errores de conexión al intentar enviar solicitudes por proxy, tiendo a interesarme más en profundizar más. Ese fue el caso cuando utilicé recientemente la aplicación Subway. Revertir el APK reveló la fijación de certificados entre otros hallazgos interesantes.

Iniciar la aplicación mientras se realizaban solicitudes de proxy provocó este error:

Fijar es lo suficientemente simple como para evitarlo. Comencé descompilando la aplicación y analizando el código fuente para fijar palabras clave. De hecho, encontré implementaciones fijadas en dos clases separadas que implementaron X509TrustManager. Este es uno de los métodos que imponen la fijación:

 // Code removed at request of Subway leadership

Omitir esto fue tan simple como agregar una declaración de devolución en el código pequeño para omitir el código de fijación en el método anterior. Nótese la adición del retorno nulo declaración de abajo:

 // Code removed at request of Subway leadership

Después de recompilar la aplicación e instalarla, me sorprendió ver este nuevo error:

Subway estaba utilizando un proceso de verificación de firma de aplicación personalizado para evitar la reversión de su APK. Buscando la fuente en busca de menciones de este proceso, lo rastreé hasta el siguiente método:

 // Code removed at request of Subway leadership

Este fue un intento interesante de evitar la ingeniería inversa, aunque en realidad sólo causó un ligero retraso. Para evitar este proceso, simplemente agregué una línea para omitir la ejecución del método agregando otra retorno nulo línea, similar al proceso de derivación de fijación anterior.

 // Code removed at request of Subway leadership

Después de recompilar e instalar la aplicación, pude enviar solicitudes de proxy con éxito:

Durante mi investigación, me topé con esta publicación de Reddit. Aparentemente, Subway también estaba determinando si el dispositivo del usuario había sido rooteado. Busqué en la fuente y confirmé menciones de métodos de detección de raíz.

 // Code removed at request of Subway leadership

Este es un gran ejemplo de una aplicación que se toma muy en serio la seguridad, pero no estoy muy seguro del razonamiento detrás del proceso de verificación de raíz. Aunque las técnicas de fijación de certificados y verificación de firmas son generalmente una buena idea, sólo impiden ligeramente el proceso de ingeniería inversa.