ตัวชี้ที่ติดแท็ก

เริ่มต้นใน Android 11 สำหรับกระบวนการ 64 บิต การจัดสรรฮีปทั้งหมดมีแท็กที่กำหนดการใช้งานซึ่งกำหนดไว้ที่ไบต์บนสุดของตัวชี้บนอุปกรณ์ที่รองรับเคอร์เนลสำหรับ ARM Top-byte Ignore (TBI) แอปพลิเคชันใดๆ ที่แก้ไขแท็กนี้จะสิ้นสุดลงเมื่อมีการตรวจสอบแท็กระหว่างการจัดสรรคืน นี่เป็นสิ่งจำเป็นสำหรับฮาร์ดแวร์ในอนาคตที่รองรับ ARM Memory Tagging Extension (MTE)

ละเว้นไบต์บน

คุณลักษณะละเว้นไบต์บนสุดของ ARM มีให้สำหรับโค้ด 64 บิตในฮาร์ดแวร์ Armv8 AArch64 ทั้งหมด คุณลักษณะนี้หมายความว่าฮาร์ดแวร์ละเว้นไบต์บนสุดของตัวชี้เมื่อเข้าถึงหน่วยความจำ

TBI ต้องการเคอร์เนลที่เข้ากันได้ ซึ่งจัดการพอยน์เตอร์ที่ติดแท็กที่ส่งผ่านจาก userspace ได้อย่างถูกต้อง เคอร์เนลทั่วไปของ Android ตั้งแต่ 4.14 (Pixel 4) และคุณลักษณะที่สูงกว่าต้องมีแพต ช์ TBI ที่จำเป็น

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

ความพร้อมของส่วนขยายการแท็กหน่วยความจำ

ส่วนขยายการแท็กหน่วยความจำของ ARM (MTE) ช่วยแก้ไขปัญหาความปลอดภัยของหน่วยความจำ MTE ทำงานโดย ติดแท็ก บิตแอดเดรสที่ 56-59 ของการจัดสรรหน่วยความจำแต่ละรายการบนสแต็ก ฮีป และโกลบอล ชุดฮาร์ดแวร์และคำสั่งจะตรวจสอบโดยอัตโนมัติว่ามีการใช้แท็กที่ถูกต้องทุกครั้งที่เข้าถึงหน่วยความจำ

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

การสนับสนุนนักพัฒนา

หากแอปของคุณขัดข้องและคุณได้รับแจ้งพร้อมลิงก์นี้ อาจหมายถึงสิ่งใดสิ่งหนึ่งต่อไปนี้:

  1. แอปพลิเคชันพยายามเพิ่มตัวชี้ที่ไม่ได้จัดสรรโดยตัวจัดสรรฮีปของระบบ
  2. มีบางอย่างในแอปของคุณแก้ไขไบต์บนสุดของตัวชี้ แก้ไขไบต์บนสุดของตัวชี้ไม่ได้และต้องเปลี่ยนรหัสเพื่อแก้ไขปัญหานี้

ตัวอย่างของตัวชี้ไบต์บนสุดที่ใช้หรือแก้ไขอย่างไม่ถูกต้อง

  • ตัวชี้ไปยังประเภทใดประเภทหนึ่งจะมีข้อมูลเมตาเฉพาะของแอปพลิเคชันที่จัดเก็บไว้ในบิตที่อยู่ 16 อันดับแรก
  • ตัวชี้เพิ่มเป็นสองเท่าแล้วย้อนกลับ โดยสูญเสียบิตที่อยู่ด้านล่าง
  • โค้ดคำนวณความแตกต่างระหว่างแอดเดรสของตัวแปรโลคัลจากสแต็กเฟรมต่างๆ เพื่อวัดความลึกของการเรียกซ้ำ

แอปพลิเคชั่นบางตัวอาจขึ้นอยู่กับไลบรารีที่ทำงานไม่ถูกต้องเมื่อมีการตั้งค่าไบต์บนสุดของตัวชี้ เราทราบดีว่าการแก้ไขปัญหาอย่างรวดเร็วในห้องสมุดอย่างรวดเร็วอาจไม่ใช่เรื่องง่าย ดังนั้น แอปพลิเคชันที่ใช้ targetSdkLevel < 30 จะไม่มีการเปิดใช้การแท็กตัวชี้ตามค่าเริ่มต้น นอกจากนี้เรายังมีช่องทางหนีภัยสำหรับแอปพลิเคชันที่สร้างด้วย targetSdkLevel >= 30 เพื่อลดระยะเวลาการเปลี่ยนผ่าน

ใช้ Escape hatch โดยการเพิ่มสิ่งต่อไปนี้ในไฟล์ AndroidManifest.xml ของคุณ:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

การดำเนินการนี้จะปิดใช้งานคุณลักษณะการติดแท็กตัวชี้สำหรับแอปพลิเคชันของคุณ โปรดทราบว่าการดำเนินการนี้ไม่ ได้ แก้ไขปัญหาความสมบูรณ์ของรหัส Escape hatch นี้จะหายไปใน Android เวอร์ชันต่อๆ ไป เนื่องจากปัญหาในลักษณะนี้จะเข้ากันไม่ได้กับ MTE