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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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