Reverse Engineering the Subway Android App

Είναι υπέροχο να βλέπουμε την αυξανόμενη υιοθέτηση του καρφιτσώματος πιστοποιητικών σε εφαρμογές Android. Όταν συναντώ μια εφαρμογή που παρουσιάζει σφάλματα σύνδεσης ενώ προσπαθώ να υποβάλω αιτήματα διακομιστή μεσολάβησης, τείνω να ενδιαφέρομαι περισσότερο για βαθύτερη κατάδυση. Αυτή ήταν η περίπτωση όταν χρησιμοποίησα πρόσφατα την εφαρμογή Subway. Η αντιστροφή του APK αποκάλυψε το καρφίτσωμα πιστοποιητικού μεταξύ ορισμένων άλλων ενδιαφέροντων ευρημάτων.

Η εκκίνηση της εφαρμογής κατά την εκτέλεση αιτημάτων μεσολάβησης προκάλεσε αυτό το σφάλμα:

Το καρφίτσωμα είναι αρκετά απλό για παράκαμψη. Ξεκίνησα αποσυμπιλώνοντας την εφαρμογή και αναλύοντας τον πηγαίο κώδικα για το καρφίτσωμα λέξεων-κλειδιών. Στην πραγματικότητα, βρήκα υλοποιήσεις καρφιτσώματος σε δύο ξεχωριστές κλάσεις που υλοποιήθηκαν X509TrustManager. Ακολουθεί μία από τις μεθόδους που επέβαλε το καρφίτσωμα:

 // Code removed at request of Subway leadership

Η παράκαμψη αυτού ήταν τόσο απλή όσο η προσθήκη μιας δήλωσης επιστροφής στον κώδικα smali για να παραλείψετε τον κωδικό καρφίτσωσης στην παραπάνω μέθοδο. Σημειώστε την προσθήκη του 

επιστροφή-κενό παρακάτω δήλωση:

 // Code removed at request of Subway leadership

Μετά την εκ νέου μεταγλώττιση της εφαρμογής και την εγκατάσταση, είδα με έκπληξη αυτό το νέο σφάλμα:

Η Subway χρησιμοποιούσε μια προσαρμοσμένη διαδικασία επαλήθευσης υπογραφής εφαρμογής για να αποτρέψει την αντιστροφή του APK της. Λαμβάνοντας υπόψη την πηγή για αναφορές αυτής της διαδικασίας, την εντόπισα στην ακόλουθη μέθοδο:

 // Code removed at request of Subway leadership

Αυτή ήταν μια ενδιαφέρουσα προσπάθεια αποτροπής της αντίστροφης μηχανικής, αν και στην πραγματικότητα προκάλεσε μόνο μια μικρή καθυστέρηση. Για να παρακάμψω αυτή τη διαδικασία, απλά πρόσθεσα μια γραμμή για να παρακάμψω την εκτέλεση της μεθόδου προσθέτοντας μια άλλη επιστροφή-κενό γραμμή, παρόμοια με τη διαδικασία παράκαμψης καρφιτσώματος παραπάνω.

 // Code removed at request of Subway leadership

Μετά την εκ νέου μεταγλώττιση και την εγκατάσταση της εφαρμογής, μπόρεσα να κάνω με επιτυχία αιτήματα διακομιστή μεσολάβησης:

Κατά τη διάρκεια της έρευνάς μου, σκόνταψα αυτή η ανάρτηση στο Reddit. Προφανώς, η Subway καθόριζε επίσης εάν η συσκευή του χρήστη είχε ριζώσει. Έψαξα στην πηγή και επιβεβαίωσα αναφορές μεθόδων ανίχνευσης ρίζας.

 // Code removed at request of Subway leadership

Αυτό είναι ένα εξαιρετικό παράδειγμα μιας εφαρμογής που παίρνει πολύ σοβαρά την ασφάλεια, αλλά δεν είμαι σίγουρος για το σκεπτικό πίσω από τη διαδικασία ελέγχου root. Αν και οι τεχνικές καρφιτσώματος πιστοποιητικού και επαλήθευσης υπογραφής είναι γενικά καλή ιδέα, παρεμποδίζουν ελαφρώς μόνο τη διαδικασία αντίστροφης μηχανικής.