ตั้งแต่ 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 จะพร้อมใช้งาน
การสนับสนุนสำหรับนักพัฒนาซอฟต์แวร์
หากแอปขัดข้องและคุณได้รับข้อความแจ้งพร้อมลิงก์นี้ อาจเป็นเพราะสาเหตุข้อใดข้อหนึ่งต่อไปนี้
- แอปพยายามปลดปล่อยพอยน์เตอร์ที่ไม่ได้จัดสรรโดยตัวจัดสรรฮีปของระบบ
- สิ่งใดบางอย่างในแอปของคุณแก้ไขไบต์บนสุดของพอยน์เตอร์ ไบต์บนสุดของพอยน์เตอร์จะแก้ไขไม่ได้ และคุณต้องเปลี่ยนโค้ดเพื่อแก้ไขปัญหานี้
ตัวอย่างการใช้หรือแก้ไขเคอร์เซอร์ไบต์บนสุดอย่างไม่ถูกต้อง
- ตัวชี้ไปยังประเภทหนึ่งๆ จะมีข้อมูลเมตาเฉพาะแอปที่จัดเก็บไว้ในบิตที่อยู่ 16 บิตบนสุด
- การแคสต์พอยน์เตอร์เป็นเลขทศนิยมแล้วเปลี่ยนกลับ ทำให้เสียบิตที่อยู่ต่ำ
- โค้ดที่คำนวณความแตกต่างระหว่างที่อยู่ของตัวแปรท้องถิ่นจากเฟรมสแต็กที่แตกต่างกันเพื่อวัดความลึกของการเรียกซ้ำ
แอปบางแอปอาจใช้ไลบรารีที่ทำงานไม่ถูกต้องเมื่อมีการตั้งค่าไบต์บนสุดของพอยน์เตอร์ เราตระหนักดีว่าการแก้ไขปัญหาพื้นฐานเหล่านี้ในคลังอย่างรวดเร็วอาจไม่ใช่เรื่องง่าย ดังนั้น แอปที่ใช้ targetSdkLevel < 30
จะไม่มีการเปิดใช้การติดแท็กเคอร์เซอร์โดยค่าเริ่มต้น นอกจากนี้ เรายังมีทางออกสำหรับแอปที่สร้างด้วย targetSdkLevel >= 30
เพื่อช่วยให้ช่วงเปลี่ยนผ่านง่ายขึ้น
ใช้ทางออกสำรองได้โดยเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ AndroidManifest.xml
<application android:allowNativeHeapPointerTagging="false"> ... </application>
ซึ่งจะปิดใช้ฟีเจอร์การติดแท็กเคอร์เซอร์สําหรับแอป แต่ไม่ได้แก้ไขปัญหาด้านสุขภาพโค้ดพื้นฐาน ทางออกนี้จะหายไปใน Android เวอร์ชันในอนาคต เนื่องจากปัญหาลักษณะนี้จะใช้ร่วมกับ MTE ไม่ได้