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

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

Top-byte ละเว้น

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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