זה נהדר לראות את האימוץ ההולך וגובר של הצמדת אישורים באפליקציות אנדרואיד. כשאני נתקל באפליקציה שזורקת שגיאות חיבור בזמן ניסיון לבצע בקשות פרוקסי, אני נוטה להתעניין יותר בצלילה עמוקה יותר. כך היה כאשר השתמשתי לאחרונה באפליקציית הרכבת התחתית. היפוך ה-APK חשף הצמדת אישורים בין כמה ממצאים מעניינים אחרים.
הפעלת האפליקציה בזמן העברת בקשות פרוקסי גרמה לשגיאה זו:
ההצמדה פשוטה מספיק כדי לעקוף. התחלתי בפירוק האפליקציה וניתוח קוד המקור להצמדת מילות מפתח. למעשה מצאתי יישומי הצמדה בשתי מחלקות נפרדות שיישמו X509TrustManager. הנה אחת השיטות שאכפו הצמדה:
// Code removed at request of Subway leadership
עקיפת זה היה פשוט כמו הוספת הצהרת return בקוד smali כדי לדלג על קוד ההצמדה בשיטה שלמעלה. שימו לב לתוספת של חזרה-בטלה הצהרה למטה:
// Code removed at request of Subway leadership
לאחר הידור מחדש של האפליקציה והתקנה, הופתעתי לראות את השגיאה החדשה הזו:
Subway השתמש בתהליך אימות חתימת אפליקציה מותאם אישית כדי למנוע היפוך של ה-APK שלהם. תפסתי את המקור לאזכורים של תהליך זה, עקבתי אחריו לשיטה הבאה:
// Code removed at request of Subway leadership
זה היה ניסיון מעניין למנוע הנדסה לאחור, אם כי זה גרם למעשה רק לעיכוב קל. על מנת לעקוף את התהליך הזה, פשוט הוספתי שורה כדי לדלג על ביצוע השיטה על ידי הוספת עוד שורה חזרה-בטלה קו, בדומה לתהליך מעקף ההצמדה שלמעלה.
// Code removed at request of Subway leadership
לאחר הידור מחדש והתקנת האפליקציה, הצלחתי לשלוח בהצלחה בקשות proxy:
במהלך המחקר שלי, מעדתי הפוסט הזה של Reddit. ככל הנראה, Subway קבעה גם אם המכשיר של המשתמש הושרש. חיפשתי במקור ואישרתי אזכורים של שיטות זיהוי שורשים.
// Code removed at request of Subway leadership
זו דוגמה מצוינת לאפליקציה שלוקחת את האבטחה ברצינות רבה, אבל אני לא ממש בטוח בהיגיון מאחורי תהליך בדיקת השורש. למרות שטכניקות הצמדת תעודות ואימות חתימה הן בדרך כלל רעיון טוב, הן מעכבות רק מעט את תהליך ההנדסה ההפוכה.