Weaver

เลเยอร์นามธรรมของฮาร์ดแวร์ (HAL) ของ Weaver Hardware Abstraction Layer (HAL) (IWeaver.aidl) ซึ่งเปิดตัวใน Android 8.1 มีอินเทอร์เฟซที่ปลอดภัยสำหรับการตรวจสอบสิทธิ์ผู้ใช้ ด้วยปัจจัยความรู้ของหน้าจอล็อก (LSKF) เช่น PIN, รูปแบบ และรหัสผ่าน

Weaver จะเข้ามาแทนที่ฟังก์ชันการทำงานของการตรวจสอบ LSKF ของ Gatekeeper อย่างไรก็ตาม ระบบจะยังคงใช้ Gatekeeper เพื่อสร้าง โทเค็นการตรวจสอบสิทธิ์ฮาร์ดแวร์

ใน Android 9 ขึ้นไป CDD 9.11.2 กำหนดให้อุปกรณ์ที่รองรับ StrongBox ต้องมีฮาร์ดแวร์ที่ปลอดภัยโดยเฉพาะซึ่ง รองรับการตรวจสอบสิทธิ์ผู้ใช้ที่ปลอดภัย การติดตั้งใช้งาน Weaver HAL โดยใช้ฮาร์ดแวร์ที่ปลอดภัยนี้เป็นไปตามข้อกำหนด "การตรวจสอบสิทธิ์ผู้ใช้ที่ปลอดภัย"

ในอุปกรณ์ที่ไม่มี Secure Element (SE)โดยเฉพาะ คุณยังคงติดตั้งใช้งาน Weaver ในสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) เช่น Trustyได้

ใน Android 17 ขึ้นไป เราขอแนะนำอย่างยิ่งให้ติดตั้งใช้งาน Weaver แม้ในอุปกรณ์ที่ไม่มี Secure Element โดยเฉพาะ

คอมโพเนนต์

Weaver ประกอบด้วย 3 คอมโพเนนต์ ได้แก่

  • อินเทอร์เฟซ Weaver AIDL (IWeaver): ข้อกำหนดอย่างเป็นทางการของ HAL Android 13 และต่ำกว่าใช้ HIDL แทน AIDL
  • บริการระดับชั้นการจัดการฮาร์ดแวร์โดยตรง (HAL) ของ Weaver: กระบวนการ Android ที่เฉพาะเจาะจงของผู้ให้บริการซึ่งติดตั้งใช้งาน IWeaver อินเทอร์เฟซ
  • แอปพลิเคชันที่เชื่อถือได้ (TA) ของ Weaver: ตรรกะหลักที่ทำงานในสภาพแวดล้อมที่ปลอดภัย โดยจะทำการตรวจสอบ LSKF และบังคับใช้ การจำกัดอัตรา บริการ HAL จะสื่อสารกับ TA โดยใช้ช่องทางที่ปลอดภัยซึ่งเฉพาะเจาะจงกับการติดตั้งใช้งาน

อินเทอร์เฟซ

อินเทอร์เฟซของ Weaver จะแสดงอาร์เรย์ของสล็อตแบบถาวรที่มีขนาดคงที่ ซึ่งแต่ละสล็อตจะมีคีย์และค่าที่มีขนาดคงที่ ระบบจะระบุแต่ละสล็อตด้วยรหัส ซึ่งเป็นจำนวนเต็มในช่วง [0, numSlots - 1] คุณจะเข้าถึงค่าของสล็อตได้ก็ต่อเมื่อระบุคีย์ที่ตรงกับคีย์ที่จัดเก็บไว้

อินเทอร์เฟซของ Weaver ประกอบด้วยส่วนต่างๆ หลักๆ ดังนี้

  • getConfig(): ดึงข้อมูลจำนวนสล็อต ขนาดคีย์ และ ขนาดค่าที่การติดตั้งใช้งานรองรับ
  • write(): เขียนทับสล็อตที่ระบุด้วยคู่คีย์-ค่าใหม่ การดำเนินการนี้เป็นแบบอะตอมมิกและทำให้ข้อมูลก่อนหน้าไม่สามารถกู้คืนได้ถาวร ไม่สามารถกู้คืนได้ (การลบอย่างปลอดภัย)
  • read(): พยายามดึงข้อมูลค่าของสล็อตที่ระบุ การดำเนินการนี้จะสำเร็จก็ต่อเมื่อการหมดเวลาของการจำกัดอัตรา (บังคับใช้โดย TA) ไม่ได้ใช้งานอยู่ และคีย์ที่ระบุตรงกับคีย์ที่จัดเก็บไว้อย่างแน่นอน
  • warmUp(): ใน Android 17 ขึ้นไป จะส่งสัญญาณว่าอาจมีการอ่านหรือเขียนในเร็วๆ นี้

ดูข้อกำหนดอินเทอร์เฟซฉบับเต็มได้ที่ IWeaver.aidl

การใช้งานโดย Android

เมื่อมีการติดตั้งใช้งาน Weaver แล้ว LockSettingsService ในเซิร์ฟเวอร์ระบบ Android จะใช้การติดตั้งใช้งานดังกล่าวเพื่อปกป้องข้อมูลผู้ใช้ LockSettingsService จะจัดการสล็อต Weaver สำหรับผู้ใช้แต่ละรายในอุปกรณ์ ดังนี้

  • คีย์สล็อต (weaverKey): แฮชของ LSKF ของผู้ใช้ หากผู้ใช้ไม่มีการล็อกหน้าจอ ระบบจะใช้สตริงเริ่มต้น
  • ค่าสล็อต (weaverSecret): ข้อมูลลับเข้ารหัสที่สร้างขึ้นแบบสุ่มซึ่งมีเอนโทรปีสูง

ระบบออกแบบมาให้ดึงข้อมูล weaverSecret ได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้เท่านั้น

  • ระบุ weaverKey ที่ถูกต้องให้กับ Weaver TA ภายใน นโยบายการจำกัดอัตรา
  • การบุกรุกสภาพแวดล้อมที่ปลอดภัยซึ่ง TA ของ Weaver ทำงานอยู่ ซึ่งเป็นเรื่องที่ทำได้ยากมาก

LockSettingsService ใช้ทั้ง weaverKey และ weaverSecret เพื่อเข้ารหัสรหัสผ่านสังเคราะห์ของผู้ใช้ เนื่องจากรหัสผ่านสังเคราะห์จะปกป้องพื้นที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบ (CE) ของผู้ใช้สำหรับการเข้ารหัสตามไฟล์ (FBE) และคีย์ที่ผูกกับการตรวจสอบสิทธิ์ของผู้ใช้ใน Android Keystore ดังนั้นข้อมูลจะยังคงเข้าถึงไม่ได้จนกว่า Weaver จะเผยแพร่ข้อมูลลับ

ใน Android 17 ขึ้นไป LockSettingsService จะเรียกใช้เมธอด warmUp() ของ Weaver เมื่อเริ่มป้อน LSKF การติดตั้งใช้งาน Weaver สามารถใช้สัญญาณนี้เพื่อเปลี่ยนฮาร์ดแวร์ที่ปลอดภัยจากสถานะพลังงานต่ำเพื่อลดเวลาในการตอบสนองสำหรับคำขอ read() ที่กำลังจะเกิดขึ้น

Weaver กับ Gatekeeper

ในอดีต Gatekeeper HAL มีบทบาทที่แตกต่างกัน 2 บทบาทในการเรียกใช้ verify() ครั้งเดียว ดังนี้

  1. การตรวจสอบ: ตรวจสอบ LSKF โดยมีการจำกัดอัตราที่บังคับใช้โดย TEE
  2. การรับรอง: ออก HardwareAuthToken เพื่อ แจ้งให้ KeyMint ทราบว่าการตรวจสอบสิทธิ์ LSKF สำเร็จ

เหตุผลที่เปลี่ยนมาใช้ Weaver

เมื่อมีการเปิดตัวโทเค็นการรีเซ็ตรหัสผ่านที่ปลอดภัยใน Android 8.1 รหัสผ่านสังเคราะห์จึงกลายเป็นข้อมูลลับเข้ารหัส หลัก Gatekeeper จะจัดการบทบาท 2 บทบาทที่อธิบายไว้ข้างต้นด้วยการลงทะเบียน Gatekeeper แยกกัน โดยบทบาทหนึ่งสำหรับ LSKF ภายใต้ userId + 100000 และอีกบทบาทหนึ่งสำหรับรหัสผ่านสังเคราะห์ภายใต้ userId

Weaver เปิดตัวขึ้นเพื่อรับบทบาทแรก โดยใช้อินเทอร์เฟซ HAL ที่ง่ายกว่าพร้อมการรองรับการติดตั้งใช้งานตาม Secure Element (SE)

ฟีเจอร์ Weaver Gatekeeper
การลบอย่างปลอดภัย จำเป็นต้องมีการลบอย่างปลอดภัย และติดตั้งใช้งานได้ง่ายเนื่องจาก อินเทอร์เฟซใช้สล็อตจำนวนคงที่ที่มีขนาดคงที่ ไม่จำเป็นต้องมีการลบอย่างปลอดภัย และติดตั้งใช้งานได้ยาก เนื่องจากอินเทอร์เฟซรองรับการลงทะเบียนจำนวนไม่จำกัด
ฮาร์ดแวร์ เพิ่มประสิทธิภาพสำหรับ SE แต่ยังทำงานใน TEE ได้ด้วย ใช้ได้เฉพาะใน TEE การติดตั้งใช้งานใน SE ไม่ได้ให้ประโยชน์ด้านความปลอดภัย ตามการออกแบบปัจจุบัน
การจัดการข้อผิดพลาด รหัสข้อผิดพลาดที่ชัดเจนขึ้น รหัสข้อผิดพลาดที่ไม่ชัดเจน ด้วยเหตุนี้ หน้าจอล็อกจึงไม่ แยกความแตกต่างระหว่าง LSKF ที่ไม่ถูกต้องกับข้อผิดพลาดที่ไม่เกี่ยวข้อง
อะตอมมิก โค้ดใน LockSettingsService ที่ใช้ Weaver จะทำการเปลี่ยนแปลง LSKF แบบอะตอมมิก ระบบจะเขียนข้อมูลใหม่ลงในสล็อต Weaver ใหม่ และ สล็อตเก่าจะถูกลบก็ต่อเมื่อดำเนินการได้อย่างปลอดภัย โค้ดใน LockSettingsService ที่ใช้ Gatekeeper ไม่ทำการเปลี่ยนแปลง LSKF แบบอะตอมมิก ข้อมูลผู้ใช้ทั้งหมดอาจสูญหายหาก เกิดข้อผิดพลาดขณะเปลี่ยน LSKF

รหัสอ้างอิง

AOSP มีการติดตั้งใช้งาน Weaver อ้างอิง 2 รายการ ได้แก่

  • ใน Android 17 ขึ้นไป system/weaver/ มีการติดตั้งใช้งาน Weaver สำหรับสภาพแวดล้อมที่ปลอดภัยทั่วไป
  • ใน Android 8.1 ขึ้นไป external/libese/ มีการติดตั้งใช้งาน Weaver สำหรับ Secure Element ที่เข้ากันได้กับ ISO/IEC7816-4

การทดสอบ

หากต้องการตรวจสอบการติดตั้งใช้งาน Weaver ให้ใช้ VtsHalWeaverTargetTest

atest VtsHalWeaverTargetTest

หรือ

vts-tradefed run vts -m VtsHalWeaverTargetTest