เจาะ certificate pinning ของ Messenger ของ Meta (macOS)
- แอปพลิเคชัน Messenger สำหรับ macOS ของ Meta มีลักษณะคล้ายกับโมเดลของ Texts.com ซึ่งเป็นแอปเดสก์ท็อปแบบสแตนด์อโลน
- Batuhan İçöz ผู้ดูแลโปรเจ็กต์ Meta platform ที่ Texts.com มองว่าขั้นตอนแรกที่สำคัญคือการดักจับ network request
- Meta ใช้ certificate pinning เพื่อเสริมความปลอดภัยและป้องกันการวิเคราะห์คำขอไปยังเซิร์ฟเวอร์ผ่านการโจมตีแบบ MITM (man-in-the-middle)
certificate pinning คืออะไร?
- เมื่อตั้งค่า proxy client จะต้องกำหนดให้เชื่อถือ "certificate authority"
- สามารถใช้ใบรับรองที่ออกโดย certificate authority เพื่อดักจับและถอดรหัสข้อมูลของคำขอได้
- หากบริการนั้นใช้ certificate pinning ก็จะยอมรับเฉพาะใบรับรองที่ออกโดย certificate authority ที่กำหนดไว้เท่านั้น ทำให้ไม่สามารถใช้ใบรับรองที่ออกโดย certificate authority ของผู้ใช้ได้
พฤติกรรมปกติ
- หากไม่ปิดใช้งาน certificate pinning คำขอทั้งหมดจะตอบกลับเป็น "internal error" และซอฟต์แวร์ proxy จะแสดงว่า "SSL handshake failed"
- เนื่องจากคำขอไม่สามารถผ่านวงจรการทำงานจนเสร็จได้ จึงไม่สามารถอนุมานข้อมูลเกี่ยวกับคำขอนั้นได้
พฤติกรรมที่ต้องการ
- สามารถใช้การโจมตีแบบ MITM เพื่ออ่านข้อความคำขอ การตอบกลับ และ header ได้สำเร็จในเครื่องมือดีบักเครือข่าย
แนวทางที่เป็นไปได้
- หนึ่งในวิธีที่เคยใช้ได้ผลก่อนหน้านี้คือเปลี่ยนสตริง URL ในไบนารีไปเป็น endpoint ที่โฮสต์เองซึ่งไม่ใช้ TLS
- สามารถใช้ไลบรารี dynamic instrumentation อย่าง Frida ได้ แต่ Messenger มีแนวโน้มจะล่มได้ง่าย โดยเฉพาะเวลาทำ hooking
- การใช้ Frida ยังมีขั้นตอนการ deploy ที่ซับซ้อนด้วย
แนวทางที่ใช้
- ดาวน์โหลด Messenger แล้วนำไปไว้ในโฟลเดอร์ Applications จากนั้นนำเข้าไบนารี ARM เข้าไปใน Hopper
- สามารถใช้ Hopper เพื่อ disassemble, decompile, recompile, debug และแสดงภาพไบนารีได้
- ค้นหาสตริงอย่าง "SSL pinning validation failed" เพื่อพยายามแก้ไขให้น้อยที่สุด
- พบสตริง "Using custom sandbox -> turn off SSL verification" แล้วจึงค้นหาฟังก์ชันที่เกี่ยวข้องและแก้ไขมัน
- ตั้งค่าฟังก์ชัน IsUsingSandbox ให้คืนค่า true เสมอเพื่อปิดใช้งาน certificate pinning
ผลลัพธ์
- export ไฟล์ executable ใหม่ ลบลายเซ็นออก แล้วแทนที่ไบนารี Messenger เดิมด้วยไบนารีตัวใหม่
- เมื่อรีสตาร์ต Messenger เครื่องมือ proxy จะแสดง header, response body และข้อมูลคำขอทั้งหมด
- สามารถดักจับคำขอได้สำเร็จด้วยการแก้ไขเพียง 4 ไบต์จากทั้งหมด 97,477,728 ไบต์ของไบนารี
การแจกจ่าย
- หลังจากคอมไพล์ไบนารีแล้วก็ส่งให้ Batuhan
- Batuhan รับ certificate สำหรับการเซ็นโค้ด ติดตั้งมัน และเซ็นแอปพลิเคชัน
- เมื่อเซ็นเสร็จแล้ว ก็สามารถใช้ไบนารีบนระบบของตนเองเพื่อดูคำขอของตัวเองได้
ความเห็นของ GN⁺
- บทความนี้นำเสนอตัวอย่างที่น่าสนใจว่าผู้วิจัยด้านความปลอดภัยสามารถ bypass certificate pinning ในแอป Messenger ของ Meta ได้อย่างไร
- certificate pinning เป็นฟีเจอร์ด้านความปลอดภัยสำคัญที่ช่วยป้องกันการโจมตีแบบ man-in-the-middle แต่การที่นักวิจัยค้นพบวิธี bypass ได้ก็ให้ข้อมูลเชิงลึกที่สำคัญต่อชุมชนความปลอดภัย
- เทคนิคนี้อาจช่วยให้นักพัฒนาเสริมความปลอดภัยของแอปหรือบริการของตนเอง และมีส่วนช่วยในการค้นหาและแก้ไขช่องโหว่ด้านความปลอดภัย
- อย่างไรก็ตาม งานวิจัยลักษณะนี้ก็อาจถูกนำไปใช้ในทางที่ไม่ประสงค์ดีได้ จึงควรระมัดระวังในการเผยแพร่ผลการวิจัย
- เครื่องมืออื่นที่มีความสามารถคล้ายกัน ได้แก่เครื่องมือวิเคราะห์เครือข่ายอย่าง Wireshark หรือ Burp Suite ซึ่งถูกใช้อย่างแพร่หลายในการติดตามและวิเคราะห์ network traffic
1 ความคิดเห็น
ความเห็นจาก Hacker News
ความสงสัยเกี่ยวกับแง่มุมทางกฎหมาย
ความพยายามในการ decompile และ recompile รวมถึงความทุ่มเท
การสูญหายไปของทักษะจากอดีต
ข้อสังเกตเกี่ยวกับการป้องกัน RE ของ Meta
IsUsingSandbox()ออกจาก production build ได้อย่างง่ายดายการทำ certificate pinning ในโหมด sandbox
ประโยชน์ของ runtime binary checksum
คำถามเกี่ยวกับการใช้เครื่องมือพร็อกซี
ความปลอดภัยของแอปพลิเคชันจากบริษัทขนาดใหญ่
ความเป็นไปได้ในการดักทราฟฟิกของแอป Meta
ความสำคัญของการมอนิเตอร์ทราฟฟิก