เริ่มตั้งแต่ Android 11 สำหรับกระบวนการแบบ 64 บิต การจัดสรรฮีปทั้งหมดจะมี ชุดแท็กที่กำหนดโดยการติดตั้งในไบต์บนสุดของตัวชี้บนอุปกรณ์ที่มี การรองรับเคอร์เนลสำหรับการละเว้น Top-ByByte (TBI) ของ ARM แอปที่แก้ไขการตั้งค่านี้ สิ้นสุดลงเมื่อมีการตรวจสอบแท็กในระหว่างการหาดีล ขั้นตอนนี้จำเป็น สำหรับฮาร์ดแวร์ในอนาคตที่มีการรองรับ ARM Memory Scheduling Extension (MTE)
เพิกเฉยต่อไบต์บน
คุณลักษณะการละเว้นแบบไบต์บนสุดของ ARM พร้อมใช้งานในโค้ด 64 บิตในฮาร์ดแวร์ Armv8 AArch64 ทั้งหมด ฟีเจอร์นี้หมายความว่าฮาร์ดแวร์จะไม่สนใจไบต์ด้านบนของตัวชี้เมื่อ เข้าถึงหน่วยความจำ
TBI ต้องมีความเข้ากันได้ เคอร์เนลที่จัดการเคอร์เซอร์ที่ติดแท็กที่ส่งมาจากพื้นที่ผู้ใช้ได้อย่างถูกต้อง เคอร์เนลทั่วไปของ Android จาก 4.14 (Pixel 4) ขึ้นไปมีฟีเจอร์ TBI ที่จำเป็น แพตช์
ระบบจะตรวจหาอุปกรณ์ที่มีการรองรับ TBI ในเคอร์เนลแบบไดนามิกที่ เวลาเริ่มต้นของกระบวนการและแท็กที่ขึ้นอยู่กับการติดตั้งใช้งานจะแทรกไว้ที่ด้านบน ไบต์ของตัวชี้สำหรับการจัดสรรฮีปทั้งหมด หลังจากนั้น การตรวจสอบจะดำเนินการเพื่อ ตรวจสอบว่าแท็กไม่ได้ถูกตัดเมื่อจัดการกับหน่วยความจำ
ความพร้อมใช้งานของส่วนขยายการติดแท็กหน่วยความจำ
Memory การติดแท็ก Extension (MTE) ของ ARM ช่วยแก้ปัญหาความปลอดภัยของหน่วยความจำ MTE ทำงานโดยการติดแท็กบิตที่อยู่ที่ 56-59 ของแต่ละหน่วยความจำ ในสแต็ก ฮีป และส่วนกลาง ฮาร์ดแวร์และชุดคำสั่ง ตรวจสอบโดยอัตโนมัติว่ามีการใช้แท็กที่ถูกต้องเมื่อเข้าถึงหน่วยความจำทุกครั้ง
แอป Android ที่เก็บข้อมูลไม่ถูกต้องในไบต์บนของ เคอร์เซอร์รับประกันว่าจะเสียหายในอุปกรณ์ที่เปิดใช้ MTE ตัวชี้ที่ติดแท็กช่วยให้ตรวจจับและปฏิเสธการใช้งานที่ไม่ถูกต้องด้านบนได้ง่ายขึ้น ไบต์ของตัวชี้ก่อนอุปกรณ์ MTE จะพร้อมใช้งาน
การสนับสนุนสำหรับนักพัฒนาซอฟต์แวร์
หากแอปขัดข้องและคุณได้รับข้อความแจ้งด้วยลิงก์นี้ อาจหมายความว่า ดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- แอปพยายามปล่อยตัวชี้ที่ไม่ได้จัดสรรโดย ที่จัดสรรฮีปของระบบ
- มีบางอย่างในแอปได้แก้ไขไบต์ด้านบนของตัวชี้ ไบต์บนสุดของ ไม่สามารถแก้ไขเคอร์เซอร์และต้องเปลี่ยนแปลงโค้ดเพื่อแก้ไขปัญหานี้ ปัญหา
ตัวอย่างเคอร์เซอร์ไบต์ด้านบนที่ใช้หรือแก้ไขอย่างไม่ถูกต้อง
- ตัวชี้ไปยังประเภทหนึ่งๆ จะจัดเก็บข้อมูลเมตาเฉพาะของแอปไว้ ในบิตที่อยู่ 16 บิตบนสุด
- ตัวชี้จะแคสต์ไปยังเลข 2 แล้วย้อนกลับ ทำให้ส่วนที่อยู่ด้านล่างหายไป
- การประมวลผลโค้ดความแตกต่างระหว่างที่อยู่ของตัวแปรภายใน จากสแตกเฟรมต่างๆ เป็นวิธีวัดความลึกของการเกิดซ้ำ
แอปบางแอปอาจต้องใช้ไลบรารีที่ทำงานไม่ถูกต้องเมื่อ
ตั้งค่าไบต์บนสุดของตัวชี้แล้ว เราตระหนักดีว่าอาจเป็น
แก้ไขปัญหาเบื้องหลังเหล่านี้
ในไลบรารีได้อย่างรวดเร็ว ด้วยเหตุนี้
แอปที่ใช้ targetSdkLevel < 30
จะไม่เปิดใช้การติดแท็กเคอร์เซอร์โดยค่าเริ่มต้น นอกจากนี้เรายังมีหลีกหนีความวุ่นวายด้วย
ช่องทางสำหรับแอปที่สร้างด้วย targetSdkLevel >= 30
เพื่ออำนวยความสะดวกในช่วงเปลี่ยนผ่าน
วิธีแก้ไขปัญหานี้ใช้โดยการเพิ่มข้อมูลต่อไปนี้ลงใน
AndroidManifest.xml
ไฟล์:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
วิธีนี้จะปิดใช้งานคุณลักษณะการติดแท็กตัวชี้สำหรับ แอป ซึ่งไม่ได้แก้ไข ปัญหาประสิทธิภาพการทำงานของโค้ดที่สำคัญ วิธีแก้ไขปัญหานี้จะหายไปในอนาคต ของ Android เนื่องจากปัญหาลักษณะนี้จะไม่สามารถทำงานร่วมกับ MTE