Authentication

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

  • ผู้ให้บริการและพื้นที่เก็บข้อมูลคีย์การเข้ารหัส Android Keystore ให้บริการการเข้ารหัสที่รองรับฮาร์ดแวร์สำหรับแอป ระบบคีย์สโตร์ Android ที่ระดับเฟรมเวิร์กได้รับการสนับสนุนจากบริการระบบ keystore2 ซึ่งอิงตามการใช้งาน KeyMint (เดิมคือ Keymaster) ของผู้ให้บริการที่เฉพาะเจาะจง ซึ่งช่วยให้มั่นใจได้ว่าจะมีสิทธิ์เข้าถึงข้อมูลคีย์ได้เฉพาะในสภาพแวดล้อมที่ปลอดภัยซึ่งรองรับฮาร์ดแวร์ เช่น สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) หรือองค์ประกอบที่ปลอดภัย (SE)
  • โปรแกรมตรวจสอบสิทธิ์ของผู้ใช้ ยืนยันการตรวจสอบสิทธิ์ผู้ใช้สําเร็จ Android รองรับคอมโพเนนต์การตรวจสอบสิทธิ์ต่อไปนี้
    • Gatekeeper สำหรับการตรวจสอบสิทธิ์ PIN, รูปแบบ หรือรหัสผ่านใน TEE
    • (ไม่บังคับ) Weaver สำหรับการตรวจสอบสิทธิ์ PIN, รูปแบบ หรือรหัสผ่านในองค์ประกอบที่ปลอดภัย
    • ลายนิ้วมือสำหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ
    • วิธีการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกอื่นๆ อุปกรณ์ที่มาพร้อมกับ Android 9 ขึ้นไปสามารถใช้ BiometricPrompt เป็นจุดผสานรวมเดียวสำหรับลายนิ้วมือและข้อมูลไบโอเมตริกเพิ่มเติม
    คอมโพเนนต์เหล่านี้จะสื่อสารสถานะการตรวจสอบสิทธิ์กับบริการ keystore2 ผ่านการใช้โทเค็นการตรวจสอบสิทธิ์ (AuthTokens) ที่รองรับฮาร์ดแวร์

คอมโพเนนต์แต่ละรายการเหล่านี้จะแตกต่างกันไปตามผู้ให้บริการ แต่การใช้งานของผู้ให้บริการต้องเป็นไปตามข้อกำหนดของอินเทอร์เฟซ Hardware Abstraction Layer (HAL) และผ่านชุดทดสอบของผู้ให้บริการ (VTS) ที่เกี่ยวข้อง

โดยปกติแล้วการติดตั้งใช้งานของผู้ให้บริการจะแบ่งออกเป็น 2 ส่วน ซึ่งเชื่อมต่อกันด้วยกลไกการสื่อสารเฉพาะของผู้ให้บริการ ดังนี้

  • บริการ HAL ทํางานเป็นกระบวนการของระบบ Android โดยรับคําขอ Binder จากระบบ Android
  • แอปพลิเคชันที่เชื่อถือได้ (TA) จะทํางานในสภาพแวดล้อมที่ปลอดภัย โดยดําเนินการจริงที่ปลอดภัย

การลงทะเบียน

เมื่อบูตอุปกรณ์เป็นครั้งแรกหลังจากรีเซ็ตเป็นค่าเริ่มต้น โปรแกรมตรวจสอบสิทธิ์ทั้งหมดจะพร้อมรับการลงทะเบียนข้อมูลเข้าสู่ระบบจากผู้ใช้ ผู้ใช้ต้องลงทะเบียน PIN, รูปแบบ หรือรหัสผ่านกับ Gatekeeper (หรือ Weaver หากมี) ในตอนแรก การลงทะเบียนครั้งแรกนี้จะสร้างตัวระบุที่ปลอดภัยแบบ 64 บิตของผู้ใช้ (SID) ซึ่งสร้างขึ้นแบบสุ่ม เพื่อเป็นตัวระบุผู้ใช้และโทเค็นการเชื่อมโยงสำหรับเนื้อหาการเข้ารหัสของผู้ใช้ SID ของผู้ใช้นี้เชื่อมโยงกับรหัสผ่านของผู้ใช้โดยใช้การเข้ารหัส การตรวจสอบสิทธิ์ที่ Gatekeeper สำเร็จจะส่งผลให้มี AuthToken ที่มี SID ของผู้ใช้สำหรับรหัสผ่านนั้น

ผู้ใช้ที่ต้องการเปลี่ยนข้อมูลเข้าสู่ระบบที่มีอยู่ต้องแสดงข้อมูลเข้าสู่ระบบนั้น หากยืนยันข้อมูลเข้าสู่ระบบที่มีอยู่เรียบร้อยแล้ว ระบบจะโอน SID ของผู้ใช้ที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบที่มีอยู่ไปยังข้อมูลเข้าสู่ระบบใหม่ ซึ่งจะช่วยให้ผู้ใช้เข้าถึงคีย์ได้ต่อไปหลังจากเปลี่ยนข้อมูลเข้าสู่ระบบ

ในบางกรณี ผู้ดูแลระบบอุปกรณ์สามารถลงทะเบียนแบบไม่เชื่อถือเพื่อลงทะเบียนข้อมูลเข้าสู่ระบบใหม่โดยไม่ต้องแสดงข้อมูลเข้าสู่ระบบที่มีอยู่ ซึ่งจะช่วยให้ผู้ใช้เข้าถึงอุปกรณ์ได้ แต่คีย์ที่สร้างภายใต้ SID ของผู้ใช้เดิมจะหายไปอย่างถาวร

การตรวจสอบสิทธิ์

ส่วนนี้จะอธิบายขั้นตอนการตรวจสอบสิทธิ์ทั่วไป ซึ่งเกี่ยวข้องกับการโต้ตอบระหว่างคอมโพเนนต์หลายรายการทั้งใน Android และสภาพแวดล้อมที่ปลอดภัย โปรดทราบว่าคอมโพเนนต์ที่ปลอดภัยทั้งหมดใช้คีย์ HMAC ลับ (ต่อการบูต) ร่วมกันเพื่อตรวจสอบสิทธิ์ข้อความของกันและกัน

หลังจากตั้งค่าข้อมูลเข้าสู่ระบบและได้รับ SID ของผู้ใช้แล้ว ผู้ใช้จะเริ่มการตรวจสอบสิทธิ์ได้ ซึ่งจะเริ่มขึ้นเมื่อผู้ใช้ระบุ PIN, รูปแบบ, รหัสผ่าน, ลายนิ้วมือ หรือข้อมูลไบโอเมตริกที่รัดกุมอื่นๆ ขั้นตอนการตรวจสอบสิทธิ์

รูปที่ 1 ขั้นตอนการตรวจสอบสิทธิ์

  1. ผู้ใช้ระบุวิธีการตรวจสอบสิทธิ์และบริการที่เกี่ยวข้องส่งคําขอไปยังบริการ HAL
    • สำหรับ PIN, รูปแบบ หรือรหัสผ่าน LockSettingsService จะส่งคำขอไปยัง gatekeeperd
    • ขั้นตอนการตรวจสอบสิทธิ์ตามข้อมูลไบโอเมตริกจะขึ้นอยู่กับเวอร์ชัน Android ในอุปกรณ์ที่ใช้ Android 8.x และต่ำกว่า FingerprintService จะส่งคำขอไปยัง fingerprintd) ในอุปกรณ์ที่ใช้ Android 9 ขึ้นไป BiometricPrompt จะส่งคำขอไปยังเดมอนข้อมูลไบโอเมตริกที่เหมาะสม (เช่น fingerprintd สำหรับลายนิ้วมือหรือ faced สำหรับใบหน้า) โดยใช้คลาส BiometricManager ที่เหมาะสม เช่น FingerprintManager หรือ FaceManager การตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกจะเกิดขึ้นแบบไม่พร้อมกันหลังจากส่งคำขอแล้ว ไม่ว่าจะใช้เวอร์ชันใดก็ตาม
  2. บริการ HAL จะส่งข้อมูลไปยัง TA คู่ค้า ซึ่งจะสร้าง AuthToken ดังนี้
    • สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน gatekeeperd จะส่งแฮช PIN, รูปแบบ หรือรหัสผ่านไปยัง Gatekeeper TA ใน TEE ผ่านบริการ HAL ของ Gatekeeper หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ TA ของ Gatekeeper จะส่ง AuthToken ที่มี SID ของผู้ใช้ที่เกี่ยวข้อง (ลงนามด้วยคีย์ HMAC ที่แชร์)
    • สําหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ fingerprintd จะรอรับเหตุการณ์ลายนิ้วมือและส่งข้อมูลไปยัง TA ลายนิ้วมือใน TEE ผ่าน HAL ลายนิ้วมือ หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ TA ลายนิ้วมือจะส่ง AuthToken (ลงนามด้วยคีย์ HMAC ของ AuthToken)
    • สําหรับการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกอื่นๆ นั้น โปรแกรมเดอมอนไบโอเมตริกที่เหมาะสมจะคอยฟังเหตุการณ์ไบโอเมตริกและส่งไปยังบริการ HAL และ TA ที่เหมาะสม
  3. ระบบจะส่ง AuthToken ที่ลงชื่อแล้วไปยังkeystore2บริการของระบบผ่านอินเทอร์เฟซ Binder
  4. บริการ keystore2 จะแนบ AuthToken เพื่อส่งคําขอไปยัง KeyMint (เดิมคือ Keymaster) ให้ดําเนินการทางวิทยาการเข้ารหัส บริการ HAL ของ KeyMint จะส่งต่อข้อมูลดังกล่าวไปยัง TA ของ KeyMint ซึ่งจะยืนยันโดยใช้คีย์ HMAC ที่แชร์กับ Gatekeeper และคอมโพเนนต์ TEE ข้อมูลไบโอเมตริกที่รองรับ KeyMint จะเชื่อถือการประทับเวลาในโทเค็นว่าเป็นเวลาที่ตรวจสอบสิทธิ์ครั้งล่าสุด และตัดสินใจว่าจะอนุญาตให้ใช้คีย์หรือไม่โดยอิงตามการประทับเวลา

โฟลว์การตรวจสอบสิทธิ์ไม่จำเป็นต้องมีการติดต่อโดยตรงระหว่าง TA ในสภาพแวดล้อมที่ปลอดภัย: AuthToken จะส่งผ่านจาก TA โปรแกรมตรวจสอบสิทธิ์ไปยังบริการ keystore2 ใน Android ซึ่งจะส่งต่อไปยัง TA ของ KeyMint นอกจากนี้ ยังช่วยให้บริการ keystore2 ปฏิเสธคำขอที่จะดำเนินการไม่สำเร็จได้อย่างรวดเร็ว เนื่องจากมีข้อมูลเกี่ยวกับ AuthToken ที่พร้อมใช้งานในระบบ ซึ่งจะช่วยประหยัดค่าใช้จ่ายที่อาจเกิดขึ้นจาก IPC ไปยัง TEE

รูปแบบ AuthToken

รูปแบบของ AuthToken จะระบุไว้ในข้อกำหนด AIDL ใน HardwareAuthToken.aidl

ขั้นตอนการเปิดเครื่องของอุปกรณ์

ทุกครั้งที่บูตอุปกรณ์ จะต้องสร้างคีย์ HMAC ของ AuthToken และแชร์กับคอมโพเนนต์ TEE ทั้งหมด (Gatekeeper, KeyMint/Keymaster และ TA ข้อมูลไบโอเมตริกที่รองรับ) เพื่อป้องกันการเกิดการโจมตีแบบเล่นซ้ำ ระบบจะต้องสร้างคีย์ HMAC แบบสุ่มทุกครั้งที่อุปกรณ์รีบูต

TA จะได้รับสิทธิ์เข้าถึงคีย์ HMAC ที่แชร์นี้ด้วยวิธีทั่วไป 2 วิธี ดังนี้

  • ข้อตกลงลับที่แชร์: บริการ keystore2 จะดำเนินการตามโปรโตคอลการตกลงเกี่ยวกับคีย์แบบหลายทางเมื่อเริ่มต้นอุปกรณ์ ซึ่งช่วยให้สามารถดึงข้อมูลคีย์ HMAC ที่ปลอดภัยระหว่าง TA เหล่านั้นที่เข้าร่วมได้ อย่างไรก็ตาม TA ที่เข้าร่วมต้องมีสิทธิ์เข้าถึงข้อมูลลับที่แชร์ไว้ล่วงหน้าร่วมกัน
  • การเข้าถึงโดยตรง: TA ที่อยู่ในสภาพแวดล้อมที่ปลอดภัยเดียวกันสามารถใช้กลไกการสื่อสารระหว่างกระบวนการภายใน (ซึ่งขึ้นอยู่กับแพลตฟอร์ม) เพื่อแชร์คีย์ HMAC

ไม่ว่าในกรณีใด คีย์ HMAC ต้องไม่มีอยู่นอก TEE

ระบบปฏิบัติการ Trusty ที่ทำงานควบคู่ไปกับ Android เป็นตัวอย่างของ TEE แต่คุณใช้ TEE อื่นๆ แทนได้ Trusty ใช้ระบบ IPC ภายในเพื่อสื่อสารโดยตรงระหว่าง KeyMint กับ Gatekeeper หรือ TA ข้อมูลไบโอเมตริกที่เหมาะสม คีย์ HMAC จะเก็บไว้ใน KeyMint เท่านั้น โดยลายนิ้วมือและ Gatekeeper จะขอคีย์จาก KeyMint สำหรับการใช้งานแต่ละครั้ง และจะไม่เก็บค่าไว้หรือแคชค่า