Authentication

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

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

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

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

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

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

เมื่อเปิดเครื่องอุปกรณ์เป็นครั้งแรกหลังจากรีเซ็ตเป็นค่าเริ่มต้น ระบบจะเตรียมเครื่องมือตรวจสอบสิทธิ์ทั้งหมดให้พร้อมรับการลงทะเบียนข้อมูลเข้าสู่ระบบจากผู้ใช้ ผู้ใช้ต้องลงทะเบียน PIN, รูปแบบ หรือรหัสผ่านกับ Gatekeeper (หรือ Weaver หากมี) ในตอนแรก การลงทะเบียนครั้งแรกนี้จะสร้างตัวระบุความปลอดภัยของผู้ใช้ (SID) แบบ 64 บิตที่สร้างขึ้นแบบสุ่ม ซึ่งทำหน้าที่เป็นตัวระบุสำหรับผู้ใช้และเป็นโทเค็นการเชื่อมโยงสำหรับข้อมูลการเข้ารหัสของผู้ใช้ 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 จะส่งคำขอไปยัง Daemon ไบโอเมตริกที่เหมาะสม (เช่น fingerprintd สำหรับลายนิ้วมือหรือ faced สำหรับใบหน้า) โดยใช้คลาส BiometricManager ที่เหมาะสม เช่น FingerprintManager หรือ FaceManager ไม่ว่าจะเป็นเวอร์ชันใด การตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกจะเกิดขึ้นแบบอะซิงโครนัสหลังจากส่งคำขอ
  2. บริการ HAL จะส่งข้อมูลไปยัง TA ที่เกี่ยวข้อง ซึ่งจะสร้าง AuthToken ดังนี้
    • สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน gatekeeperd จะส่งแฮช PIN, รูปแบบ หรือรหัสผ่านไปยัง Gatekeeper TA ใน TEE ผ่านบริการ Gatekeeper HAL หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ Gatekeeper TA จะส่ง AuthToken ที่มี SID ของผู้ใช้ที่เกี่ยวข้อง (ลงนามด้วยคีย์ HMAC ที่ใช้ร่วมกัน)
    • สำหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ fingerprintd จะรอรับเหตุการณ์ลายนิ้วมือและส่งข้อมูลไปยัง TA ลายนิ้วมือใน TEE ผ่าน HAL ลายนิ้วมือ หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ Fingerprint TA จะส่ง AuthToken (ลงชื่อด้วยคีย์ HMAC ของ AuthToken)
    • สำหรับการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกอื่นๆ Daemon ข้อมูลไบโอเมตริกที่เหมาะสมจะคอยฟังเหตุการณ์ข้อมูลไบโอเมตริกและส่งไปยังบริการ HAL และ TA ของข้อมูลไบโอเมตริกที่เหมาะสม
  3. ระบบจะส่ง AuthToken ที่ลงชื่อแล้วซึ่งเป็นผลลัพธ์ไปยังบริการระบบ keystore2 ผ่านอินเทอร์เฟซ Binder
  4. บริการ keystore2 จะแนบ AuthToken ไปกับคำขอให้ KeyMint (เดิมคือ Keymaster) ดำเนินการด้านวิทยาการเข้ารหัส บริการ KeyMint HAL จะส่งต่อโทเค็นไปยัง KeyMint TA ซึ่งจะยืนยันโทเค็นโดยใช้คีย์ HMAC ที่แชร์กับ Gatekeeper และคอมโพเนนต์ TEE ไบโอเมตริกที่รองรับ KeyMint จะเชื่อถือการประทับเวลาในโทเค็นเป็นเวลาการตรวจสอบสิทธิ์ครั้งล่าสุด และตัดสินใจว่าจะอนุญาตให้ใช้คีย์ตามการประทับเวลาหรือไม่

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

รูปแบบ AuthToken

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

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

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

TA มีวิธีทั่วไป 2 วิธีในการเข้าถึงคีย์ HMAC ที่แชร์นี้ ดังนี้

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

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

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

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