Reverse Engineering แอพ Subway Android

เป็นเรื่องดีที่ได้เห็นการนำใบรับรองไปใช้เพิ่มมากขึ้นในแอป Android เมื่อฉันพบกับแอปที่มีข้อผิดพลาดในการเชื่อมต่อในขณะที่พยายามร้องขอพร็อกซี ฉันมักจะสนใจที่จะเจาะลึกมากขึ้น อย่างเช่นตอนที่ฉันใช้แอพ Subway เมื่อเร็วๆ นี้ การย้อนกลับ 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

หลังจากการคอมไพล์ใหม่และติดตั้งแอป ฉันสามารถส่งคำขอพร็อกซีได้สำเร็จ:

ในระหว่างการวิจัย ฉันสะดุดล้ม โพสต์ Reddit นี้. เห็นได้ชัดว่า Subway กำลังพิจารณาว่าอุปกรณ์ของผู้ใช้ถูกรูทหรือไม่ ฉันค้นหาแหล่งที่มาและยืนยันการกล่าวถึงวิธีการตรวจจับรูท

 // Code removed at request of Subway leadership

นี่เป็นตัวอย่างที่ดีของแอปที่ให้ความสำคัญกับความปลอดภัยเป็นอย่างมาก แต่ฉันไม่ค่อยแน่ใจถึงเหตุผลเบื้องหลังกระบวนการตรวจสอบรูท แม้ว่าโดยทั่วไปแล้วเทคนิคการปักหมุดใบรับรองและการตรวจสอบลายเซ็นจะเป็นความคิดที่ดี แต่ก็ขัดขวางกระบวนการวิศวกรรมย้อนกลับเพียงเล็กน้อยเท่านั้น