MTE สามารถเปิดใช้ได้ในเคอร์เนล Android และกระบวนการใดก็ได้ในระบบ Android Google ไม่ได้บังคับใช้การกำหนดค่าที่เฉพาะเจาะจงและมุ่งมั่นที่จะมอบความยืดหยุ่นสูงสุดให้แก่ผู้สร้างอุปกรณ์
เอกสารนี้อธิบายการตั้งค่าและขอบเขตของ MTE ซึ่งเราเชื่อว่าเป็นจุดสมดุลที่ดีระหว่างความปลอดภัยกับต้นทุนสำหรับผู้ใช้ Android ในการบรรเทาช่องโหว่แบบเปิดอยู่เสมอ
ฟองสบู่แตก
MTE ในเคอร์เนลได้รับการกำหนดค่าผ่านบรรทัดคำสั่ง โดยค่าเริ่มต้นคือเปิดในโหมดซิงค์ ข้อมูลนี้อาจมีการเปลี่ยนแปลงในอนาคตเนื่องด้วยเหตุผลหลายประการ ดังนี้
- ข้อมูลแสดงให้เห็นว่าการตั้งค่านี้ส่งผลต่อประสิทธิภาพอย่างมากและจำเป็นต้องได้รับการเพิ่มประสิทธิภาพ
- ผู้คนส่วนใหญ่มองว่าคุณภาพโค้ดเคอร์เนลไม่เพียงพอที่จะจัดส่ง MTE ในโหมดบังคับใช้ (นั่นคือโหมดที่ระบบจะแสดงข้อความแจ้งว่า "ข้อผิดพลาดร้ายแรง" เมื่อเกิดความผิดพลาด)
คําแนะนําในปัจจุบันคือปิดใช้ MTE ของเคอร์เนลในอุปกรณ์เวอร์ชันที่ใช้งานจริง ซึ่งทำได้โดยการเพิ่ม kasan=off
ลงในบรรทัดคำสั่งเคอร์เนล
พื้นที่ผู้ใช้
Google มีรายการเริ่มต้นของไบนารีสเปซผู้ใช้ที่จะได้รับการปกป้องด้วย MTE รายการนี้จัดทำขึ้นจากข้อมูลของทีมรักษาความปลอดภัย Android และประกอบด้วยคอมโพเนนต์ที่มีสิทธิ์และ/หรือจัดการอินพุตที่ไม่น่าเชื่อถือ รายการล่าสุดของไบนารีเนทีฟที่แนะนำสำหรับใช้กับ MTE อยู่ในไฟล์ memtag-common.mk ในระบบบิลด์ Android นอกจากนี้ ระบบจะรวมแอประบบหลายแอปไว้ด้วย ซึ่งปัจจุบันมี NFC, บลูทูธ และ SecureElement ระบบจะเปิดใช้ไบนารีและแอปเหล่านี้ในโหมด Async โดยค่าเริ่มต้น
คําแนะนําในปัจจุบันคือใช้รายการเป้าหมายเริ่มต้น (ไม่ต้องเปลี่ยนแปลง) นอกจากนี้ เราขอแนะนำให้ประเมินการเพิ่มเติม BSP และ OEM ลงในระบบหลัก และเปิดใช้ MTE ในระบบที่มีความละเอียดอ่อนด้านความปลอดภัย
แอป
แอประบบ 3 แอปที่ระบุไว้ข้างต้นเป็นแอปเดียวที่ใช้ MTE ในขณะนี้ หากต้องการให้แอปของบุคคลที่สามเปิดใช้ MTE AndroidManifest.xml
ของแอปจะต้องระบุ android:memtagMode
ด้วยค่าที่ไม่ใช่ off
ดังนั้น ชุดการทดสอบประสิทธิภาพทั่วไป เช่น Geekbench หรือ AnTuTu จึงไม่สามารถทำงานร่วมกับ MTE ได้ หาก MTE ของเคอร์เนลปิดอยู่ด้วย (ดู kasan=off
ด้านบน) เบนช์มาร์กก็ควรแสดงผลกระทบต่อประสิทธิภาพที่จำกัดมาก (หากมี)
สำหรับแอปอื่นๆ นั้น เรากำลังพัฒนาการสนับสนุน MTE ใน Chrome Chrome เวอร์ชันปัจจุบันใน Play Store มีการตั้งค่า memtagMode=async
ในไฟล์ Manifest นอกจากนี้ เราคาดหวังว่าแอปที่ให้ความสำคัญกับความปลอดภัยจำนวนมากในระบบนิเวศ Android (เช่น แอปธนาคาร) จะดำเนินการเช่นเดียวกันในที่สุด ในทางกลับกัน เราคาดว่าแอปบางแอปที่ต้องใช้ประสิทธิภาพ CPU สูงสุด เช่น เกม จะเลือกปิดใช้ MTE ต่อไป
โหมดอื่นๆ
วิธีการข้างต้นใช้เฉพาะโหมด MTE แบบอะซิงโครนัสในทุกที่ โหมดอื่นๆ อาจเร็วพอๆ กันหรือเร็วกว่าโหมดนี้ ทั้งนี้ขึ้นอยู่กับฮาร์ดแวร์ รวมถึงให้การวินิจฉัยที่ดีขึ้นและคุณสมบัติการบรรเทาช่องโหว่ที่มีประสิทธิภาพมากขึ้น
เราขอแนะนำให้ทดสอบการกำหนดค่าอื่นๆ อีก 1-2 รายการเพื่อดูว่าเพียงพอสำหรับข้อกำหนดด้านประสิทธิภาพ/กำลังหรือไม่ คุณตั้งค่าโหมด MTE สำหรับแต่ละแกน CPU ในระบบได้โดยเขียนลงใน /sys/devices/system/cpu/cpu*/mte_tcf_preferred
ตัวอย่างเช่น การเขียน sync
(หรือ asymm
) จะทำให้กระบวนการใน Userspace ที่ขอใช้โหมด Async ได้รับการอัปเกรดเป็น Sync (หรือ Asymm) โดยอัตโนมัติขณะทำงานในแกนนั้น การตั้งค่านี้ทำได้ในไฟล์ .rc เมื่ออุปกรณ์บูต
เราขอแนะนำให้วัดการกำหนดค่าอื่นๆ อีก 1-2 รายการเพื่อดูว่าเป็นไปตามข้อกำหนดด้านประสิทธิภาพและกำลังไฟฟ้าหรือไม่ การกำหนดค่าที่น่าสนใจบางส่วนที่ควรลองใช้มีดังนี้
- Asymm ในทุกแกน
- Asymm ในแกนหลักขนาดใหญ่ Sync ในแกนอื่นๆ
หากต้องการยืนยันว่ากระบวนการกําลังขอโหมด Async (อาจมีการอัปเกรดอัตโนมัติ) ให้ตรวจสอบว่าบรรทัดต่อไปนี้มีทั้ง PR_MTE_TCF_SYNC และ PR_MTE_TCF_ASYNC
debuggerd <PID> | head -30 | grep tagged_addr
ขออภัย ยังไม่มีวิธีง่ายๆ ในการดูโหมดที่มีผลสําหรับกระบวนการ แต่กระบวนการที่แสดงทั้ง 2 ค่าที่ระบุไว้ข้างต้นจะขึ้นอยู่กับลักษณะการอัปเกรดอัตโนมัติ