เคอร์เซอร์ที่ติดแท็ก

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

ละเว้นไบต์บนสุด

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

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

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

ความพร้อมใช้งานของ Memory Tagging Extension

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

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

การสนับสนุนสำหรับนักพัฒนาซอฟต์แวร์

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

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

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

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

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

ใช้ทางออกสำรองได้โดยเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ AndroidManifest.xml

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

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