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