Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

ท็อปไบต์ละเว้น

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

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

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

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

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