Android มีแนวคิดเรื่องเครื่องมือตรวจสอบสิทธิ์ของผู้ใช้ที่ใช้เพื่อปลดล็อกอุปกรณ์และจำกัดการเข้าถึงคีย์การเข้ารหัส ซึ่งเกี่ยวข้องกับคอมโพเนนต์ต่อไปนี้
- ผู้ให้บริการพื้นที่เก็บข้อมูลและบริการจัดการคีย์การเข้ารหัส จัดเก็บคีย์การเข้ารหัสและมีฟังก์ชันการเข้ารหัสมาตรฐานที่ทำงานกับคีย์เหล่านั้น Android รองรับ Keystore และ KeyMint (เดิมชื่อ Keymaster) ที่ใช้ฮาร์ดแวร์เป็นฐานสำหรับบริการวิทยาการเข้ารหัส รวมถึงวิทยาการเข้ารหัสที่ใช้ฮาร์ดแวร์เป็นฐานสำหรับพื้นที่เก็บข้อมูลคีย์ ซึ่งอาจรวมถึงสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) หรือองค์ประกอบความปลอดภัย (SE) เช่น StrongBox
- เครื่องมือตรวจสอบสิทธิ์ของผู้ใช้ ยืนยันการปรากฏตัวของผู้ใช้และ/หรือการตรวจสอบสิทธิ์สำเร็จ Android รองรับ
Gatekeeper สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน
และ Fingerprint สำหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ
อุปกรณ์ที่มาพร้อมกับ Android 9 ขึ้นไปสามารถใช้
BiometricPromptเป็นจุดผสานรวมเดียวสำหรับ ลายนิ้วมือและข้อมูลไบโอเมตริกเพิ่มเติม คอมโพเนนต์เหล่านี้จะสื่อสารสถานะการตรวจสอบสิทธิ์กับบริการ Keystore ผ่านช่องทางที่ตรวจสอบสิทธิ์แล้ว ระบบ Android Keystore ที่ระดับเฟรมเวิร์กยังได้รับการ สนับสนุนจากบริการ Keystore ด้วย
คอมโพเนนต์แต่ละรายการเหล่านี้เป็นคอมโพเนนต์เฉพาะของผู้ผลิต แต่การติดตั้งใช้งานของผู้ผลิตต้องเป็นไปตาม ข้อกำหนดของอินเทอร์เฟซ ระดับชั้นการจัดการฮาร์ดแวร์โดยตรง (HAL) และผ่านการทดสอบชุดเครื่องมือทดสอบของผู้ผลิต (VTS) ที่เกี่ยวข้อง
โดยปกติแล้ว การติดตั้งใช้งานของผู้ผลิตจะแบ่งออกเป็น 2 ส่วน ซึ่งเชื่อมต่อกันด้วยกลไกการสื่อสารเฉพาะของผู้ผลิต ดังนี้
- บริการ HAL ทำงานเป็นกระบวนการของระบบ Android โดยรับคำขอ Binder จากระบบ Android
- แอปพลิเคชันที่เชื่อถือได้ (TA) ทำงานในสภาพแวดล้อมที่ปลอดภัย โดยดำเนินการที่ปลอดภัยจริง
การลงทะเบียน
เมื่อเปิดเครื่องครั้งแรกหลังจากรีเซ็ตเป็นค่าเริ่มต้นจากโรงงาน เครื่องมือตรวจสอบสิทธิ์ทั้งหมดจะพร้อมรับการลงทะเบียนข้อมูลเข้าสู่ระบบจากผู้ใช้ ผู้ใช้ต้องลงทะเบียน PIN, รูปแบบ หรือรหัสผ่านกับ Gatekeeper (หรือ Weaver หากมี) ในตอนแรก การลงทะเบียนครั้งแรกนี้จะสร้างตัวระบุที่ปลอดภัยของผู้ใช้ (SID) แบบสุ่ม 64 บิต ซึ่งทำหน้าที่เป็นตัวระบุสำหรับผู้ใช้และเป็นโทเค็นการผูกสำหรับข้อมูลการเข้ารหัสของผู้ใช้ SID ของผู้ใช้จะผูกกับรหัสผ่านของผู้ใช้ด้วยการเข้ารหัส การตรวจสอบสิทธิ์กับ Gatekeeper ที่สำเร็จจะส่งผลให้เกิด AuthToken ที่มี SID ของผู้ใช้สำหรับรหัสผ่านนั้น
ผู้ใช้ที่ต้องการเปลี่ยนข้อมูลเข้าสู่ระบบที่มีอยู่ต้องแสดงข้อมูลเข้าสู่ระบบดังกล่าว หากระบบยืนยันข้อมูลเข้าสู่ระบบที่มีอยู่เรียบร้อยแล้ว ระบบจะโอน SID ของผู้ใช้ที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบที่มีอยู่ไปยังข้อมูลเข้าสู่ระบบใหม่ ซึ่งช่วยให้ผู้ใช้เข้าถึงคีย์ต่อไปได้หลังจากเปลี่ยนข้อมูลเข้าสู่ระบบ
ในบางกรณี ผู้ดูแลระบบอุปกรณ์สามารถทำการ ลงทะเบียนที่ไม่น่าเชื่อถือ เพื่อลงทะเบียนข้อมูลเข้าสู่ระบบใหม่โดยไม่ต้องแสดงข้อมูลเข้าสู่ระบบที่มีอยู่ ซึ่งจะช่วยให้ผู้ใช้เข้าถึงอุปกรณ์ได้ แต่คีย์ที่สร้างขึ้นภายใต้ SID ของผู้ใช้เดิมจะหายไปอย่างถาวร
การตรวจสอบสิทธิ์
ส่วนนี้อธิบายโฟลว์การตรวจสอบสิทธิ์ทั่วไป ซึ่งเกี่ยวข้องกับการโต้ตอบระหว่างคอมโพเนนต์หลายรายการทั้งใน Android และสภาพแวดล้อมที่ปลอดภัย โปรดทราบว่าคอมโพเนนต์ที่ปลอดภัยทั้งหมดใช้คีย์ HMAC ลับ (ต่อการเปิดเครื่อง) ร่วมกันเพื่อตรวจสอบสิทธิ์ข้อความของกันและกัน
หลังจากที่ผู้ใช้ตั้งค่าข้อมูลเข้าสู่ระบบและได้รับ SID ของผู้ใช้แล้ว ผู้ใช้จะเริ่มการตรวจสอบสิทธิ์ได้ ซึ่งจะเริ่มต้นเมื่อผู้ใช้ระบุ PIN, รูปแบบ, รหัสผ่าน, ลายนิ้วมือ หรือข้อมูลไบโอเมตริกที่มีความปลอดภัยสูงอื่นๆ
รูปที่ 1 โฟลว์การตรวจสอบสิทธิ์
- ผู้ใช้ระบุวิธีการตรวจสอบสิทธิ์และบริการที่เกี่ยวข้องจะส่งคำขอไปยังบริการ HAL
- สำหรับ PIN, รูปแบบ หรือรหัสผ่าน
LockSettingsServiceจะส่งคำขอไปยังgatekeeperd - โฟลว์การตรวจสอบสิทธิ์ตามข้อมูลไบโอเมตริกจะขึ้นอยู่กับเวอร์ชัน Android
ในอุปกรณ์ที่ใช้ Android 8.x และต่ำกว่า
FingerprintServiceจะส่งคำขอไปยังfingerprintd) ส่วนในอุปกรณ์ ที่ใช้ Android 9 ขึ้นไปBiometricPromptจะส่ง คำขอไปยัง Daemon ข้อมูลไบโอเมตริกที่เหมาะสม (เช่นfingerprintdสำหรับลายนิ้วมือหรือfacedสำหรับ ใบหน้า) โดยใช้คลาสBiometricManagerที่เหมาะสม เช่นFingerprintManagerหรือFaceManagerไม่ว่าจะเป็นเวอร์ชันใด การตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริก จะเกิดขึ้นแบบอะซิงโครนัสหลังจากส่งคำขอ
- สำหรับ PIN, รูปแบบ หรือรหัสผ่าน
- บริการ HAL จะส่งข้อมูลไปยัง TA ที่เกี่ยวข้อง ซึ่งจะสร้าง
AuthToken:
- สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน
gatekeeperdจะส่ง แฮชของ PIN, รูปแบบ หรือรหัสผ่านไปยัง Gatekeeper TA ใน TEE ผ่านบริการ Gatekeeper HAL หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ Gatekeeper TA จะส่ง AuthToken ที่มี SID ของผู้ใช้ที่เกี่ยวข้อง (ลงชื่อด้วยคีย์ HMAC ที่แชร์) - สำหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ
fingerprintdจะรอรับเหตุการณ์ลายนิ้วมือและส่งข้อมูลไปยัง Fingerprint TA ใน TEE ผ่าน Fingerprint HAL หาก การตรวจสอบสิทธิ์ใน TEE สำเร็จ Fingerprint TA จะส่ง AuthToken (ลงชื่อด้วยคีย์ HMAC ของ AuthToken) - สำหรับการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกอื่นๆ Daemon ข้อมูลไบโอเมตริกที่เหมาะสม รอรับเหตุการณ์ข้อมูลไบโอเมตริกและส่งไปยังบริการ HAL และ TA ของข้อมูลไบโอเมตริกที่เหมาะสม
- สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน
- Daemon จะได้รับ AuthToken ที่ลงชื่อแล้วและส่งไปยังบริการ Keystore
ผ่านส่วนขยายของอินเทอร์เฟซ Binder ของบริการ Keystore
(
gatekeeperdจะแจ้งให้บริการ Keystore ทราบด้วยเมื่ออุปกรณ์ ล็อกอีกครั้งและเมื่อรหัสผ่านของอุปกรณ์เปลี่ยนไป) - บริการ Keystore จะส่ง AuthToken ไปยัง KeyMint และยืนยันโดยใช้คีย์ที่แชร์กับคอมโพเนนต์ TEE ของ Gatekeeper และข้อมูลไบโอเมตริกที่รองรับ KeyMint จะเชื่อถือการประทับเวลาในโทเค็นเป็นเวลาการตรวจสอบสิทธิ์ล่าสุด และใช้การประทับเวลาเป็นเกณฑ์ในการตัดสินใจปล่อยคีย์ (เพื่อให้แอปใช้ คีย์ได้)
โฟลว์การตรวจสอบสิทธิ์ไม่จำเป็นต้องมีการสื่อสารโดยตรงระหว่าง TA ในสภาพแวดล้อมที่ปลอดภัย โดย AuthToken จะไหลจาก TA ของเครื่องมือตรวจสอบสิทธิ์ไปยังบริการ keystore2 ใน Android ซึ่งจะส่งต่อไปยัง TA ของ KeyMint
นอกจากนี้ยังช่วยให้บริการ keystore2 ปฏิเสธคำขอที่น่าจะล้มเหลวได้อย่างรวดเร็ว เนื่องจากบริการนี้ทราบ AuthToken ที่มีอยู่ในระบบ จึงช่วยประหยัด IPC ที่อาจมีค่าใช้จ่ายสูงไปยัง TEE
รูปแบบ AuthToken
รูปแบบของ AuthToken กำหนดโดยข้อกำหนด AIDL ใน
HardwareAuthToken.aidl
โฟลว์การเปิดเครื่องอุปกรณ์
เมื่อเปิดเครื่องอุปกรณ์ทุกครั้ง ระบบจะต้องสร้างคีย์ HMAC ของ AuthToken และแชร์กับคอมโพเนนต์ TEE ทั้งหมด (Gatekeeper, KeyMint และ Trustlet ของข้อมูลไบโอเมตริกที่รองรับ) ดังนั้น เพื่อเพิ่มการป้องกันการโจมตีแบบ Replay ระบบจะต้องสร้างคีย์ HMAC แบบสุ่มทุกครั้งที่อุปกรณ์รีบูต
TA มีวิธีทั่วไป 2 วิธีในการเข้าถึงคีย์ HMAC ที่แชร์นี้
- ข้อมูลลับที่ใช้ร่วมกัน: บริการ
keystore2จะดำเนินการโปรโตคอลข้อตกลงเกี่ยวกับคีย์แบบหลายทางเมื่ออุปกรณ์เริ่มต้น ซึ่งช่วยให้ TA ที่เข้าร่วมสามารถสร้างคีย์ HMAC ได้อย่างปลอดภัย อย่างไรก็ตาม TA ที่เข้าร่วมต้องมีสิทธิ์เข้าถึงลับที่แชร์ไว้ล่วงหน้าร่วมกัน - การเข้าถึงโดยตรง: TA ที่อยู่ในสภาพแวดล้อมที่ปลอดภัยเดียวกันสามารถใช้กลไกการสื่อสารระหว่างโปรเซสภายใน (ซึ่งขึ้นอยู่กับแพลตฟอร์ม) เพื่อแชร์คีย์ HMAC
ไม่ว่าในกรณีใดก็ตาม จะต้องไม่ อนุญาตให้ใช้คีย์ HMAC นอก TEE
ระบบปฏิบัติการ Trusty ซึ่งทำงานควบคู่กับ Android เป็นตัวอย่างของ TEE แต่คุณสามารถใช้ TEE อื่นแทนได้ Trusty ใช้ระบบ IPC ภายในเพื่อสื่อสารโดยตรงระหว่าง KeyMint กับ Gatekeeper หรือ Trustlet ของข้อมูลไบโอเมตริกที่เหมาะสม คีย์ HMAC จะเก็บไว้ใน KeyMint เท่านั้น โดย Fingerprint และ Gatekeeper จะขอคีย์จาก KeyMint สำหรับการใช้งานแต่ละครั้ง และจะไม่เก็บหรือแคชค่า
เนื่องจาก TEE บางรายการไม่มีโครงสร้างพื้นฐาน IPC จึงไม่มีการสื่อสารระหว่างแอปเพล็ตใน TEE นอกจากนี้ยังช่วยให้บริการ Keystore ปฏิเสธคำขอที่น่าจะล้มเหลวได้อย่างรวดเร็ว เนื่องจากบริการนี้ทราบตารางการตรวจสอบสิทธิ์ในระบบ จึงช่วยประหยัด IPC ที่อาจมีค่าใช้จ่ายสูงไปยัง TEE