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

เริ่มตั้งแต่ 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 จะพร้อมใช้งาน

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

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

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

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

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

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

วิธีแก้ไขปัญหานี้ใช้โดยการเพิ่มข้อมูลต่อไปนี้ลงใน AndroidManifest.xml ไฟล์:

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

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