เปิดใช้งานส่วนขยายการติดแท็กหน่วยความจำ

Arm v9 เปิดตัว Memory Tagging Extension (MTE) ของ Arm ซึ่งเป็นการติดตั้งใช้งานฮาร์ดแวร์ของ หน่วยความจำที่ติดแท็ก

ในระดับสูง MTE จะติดแท็กการจัดสรร/ยกเลิกการจัดสรรหน่วยความจำแต่ละรายการด้วย ข้อมูลเมตาเพิ่มเติม โดยจะกำหนดแท็กให้กับตำแหน่งในหน่วยความจำ ซึ่งจากนั้นจะ เชื่อมโยงกับพอยน์เตอร์ที่อ้างอิงตำแหน่งในหน่วยความจำนั้นได้ ในเวลาเรียกใช้ CPU จะตรวจสอบว่าพอยน์เตอร์และแท็กข้อมูลเมตาตรงกันในแต่ละการโหลดและการจัดเก็บ

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

โหมดการทำงานของ MTE

MTE มีโหมดการทำงาน 3 โหมด ได้แก่

  • โหมดซิงโครนัส (SYNC)
  • โหมดอะซิงโครนัส (ASYNC)
  • โหมดไม่สมมาตร (ASYMM)

โหมดซิงโครนัส (SYNC)

โหมดนี้ได้รับการเพิ่มประสิทธิภาพเพื่อความถูกต้องของการตรวจหาข้อบกพร่องมากกว่าประสิทธิภาพ และ สามารถใช้เป็นเครื่องมือตรวจหาข้อบกพร่องที่แม่นยำได้เมื่อยอมรับโอเวอร์เฮดประสิทธิภาพที่สูงขึ้นได้ เมื่อเปิดใช้แล้ว MTE SYNC จะทำหน้าที่เป็นการลดความเสี่ยงด้านความปลอดภัย เมื่อแท็กไม่ตรงกัน โปรเซสเซอร์จะยกเลิกการดำเนินการทันทีและ สิ้นสุดกระบวนการด้วย SIGSEGV (โค้ด SEGV_MTESERR) และข้อมูลทั้งหมดเกี่ยวกับการเข้าถึงหน่วยความจำและ ที่อยู่ที่เกิดข้อผิดพลาด

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

เมื่อเรียกใช้ในโหมด SYNC ตัวจัดสรร Android จะบันทึก Stack Trace สำหรับการจัดสรรและการยกเลิกการจัดสรรทั้งหมด และใช้เพื่อจัดทำรายงานข้อผิดพลาดที่ดีขึ้นซึ่งมีคำอธิบายข้อผิดพลาดเกี่ยวกับหน่วยความจำ เช่น การใช้งานหลังช่วงใช้ฟรี (Use After Free) หรือบัฟเฟอร์ล้น (Buffer Overflow) และ Stack Trace ของ เหตุการณ์หน่วยความจำที่เกี่ยวข้อง รายงานดังกล่าวให้ข้อมูลตามบริบทเพิ่มเติมและ ช่วยให้ติดตามและแก้ไขข้อบกพร่องได้ง่ายขึ้น

โหมดอะซิงโครนัส (ASYNC)

โหมดนี้ได้รับการเพิ่มประสิทธิภาพเพื่อเน้นประสิทธิภาพมากกว่าความแม่นยำของรายงานข้อบกพร่อง และสามารถใช้เป็นการตรวจหาข้อบกพร่องด้านความปลอดภัยของหน่วยความจำที่มีโอเวอร์เฮดต่ำได้
เมื่อแท็กไม่ตรงกัน โปรเซสเซอร์จะดำเนินการต่อไปจนกว่าจะถึง รายการเคอร์เนลที่ใกล้ที่สุด (เช่น Syscall หรือการขัดจังหวะของตัวจับเวลา) ซึ่งจะสิ้นสุด กระบวนการด้วย SIGSEGV (รหัส SEGV_MTEAERR) โดยไม่ บันทึกที่อยู่หรือการเข้าถึงหน่วยความจำที่เกิดข้อผิดพลาด
เราขอแนะนําให้ใช้โหมดนี้ในเวอร์ชันที่ใช้งานจริงในโค้ดเบสที่ผ่านการทดสอบมาอย่างดี ซึ่งทราบกันดีว่า ความหนาแน่นของข้อบกพร่องด้านความปลอดภัยของหน่วยความจำอยู่ในระดับต่ำ ซึ่งทำได้โดยใช้ โหมด SYNC ระหว่างการทดสอบ

โหมดไม่สมมาตร (ASYMM)

โหมด MTE แบบอสมมาตรซึ่งเป็นฟีเจอร์เพิ่มเติมใน Arm v8.7-A จะให้การตรวจสอบการอ่านหน่วยความจำแบบซิงโครนัส และการตรวจสอบการเขียนหน่วยความจำแบบอะซิงโครนัส โดยมีประสิทธิภาพคล้ายกับโหมด ASYNC ในกรณีส่วนใหญ่ โหมดนี้ จะดีกว่าโหมด ASYNC และเราขอแนะนำให้ใช้โหมดนี้แทน ASYNC เมื่อใดก็ตามที่พร้อมใช้งาน

ด้วยเหตุนี้ API ที่อธิบายไว้ด้านล่างจึงไม่มีการกล่าวถึงโหมด Asymmetric แต่สามารถกำหนดค่าระบบปฏิบัติการให้ใช้โหมดอสมมาตรเสมอเมื่อมีการขอแบบอะซิงโครนัส โปรดดูข้อมูลเพิ่มเติมในส่วน "การกำหนดค่าระดับ MTE ที่ต้องการเฉพาะ CPU"

MTE ในพื้นที่ผู้ใช้

ส่วนต่อไปนี้จะอธิบายวิธีเปิดใช้ MTE สำหรับกระบวนการของระบบ และแอป MTE จะปิดใช้โดยค่าเริ่มต้น เว้นแต่จะมีการตั้งค่าตัวเลือกใดตัวเลือกหนึ่งด้านล่าง สำหรับกระบวนการใดกระบวนการหนึ่ง (ดูว่า MTE เปิดใช้สำหรับคอมโพเนนต์ใดด้านล่าง)

เปิดใช้ MTE โดยใช้ระบบบิลด์

MTE เป็นพร็อพเพอร์ตี้ระดับกระบวนการ ซึ่งควบคุมโดยการตั้งค่าเวลาบิลด์ของ ไฟล์ปฏิบัติการหลัก ตัวเลือกต่อไปนี้ช่วยให้เปลี่ยนการตั้งค่านี้สำหรับ ไฟล์ที่เรียกใช้งานแต่ละไฟล์ หรือสำหรับทั้งไดเรกทอรีย่อยในโครงสร้างแหล่งที่มา ระบบจะไม่สนใจการตั้งค่า ในไลบรารีหรือเป้าหมายใดๆ ที่ไม่ใช่ไฟล์ที่เรียกใช้งานได้หรือการทดสอบ

1. วิธีเปิดใช้ MTE ใน Android.bp (ตัวอย่าง) สำหรับโปรเจ็กต์หนึ่งๆ

โหมด MTE การเกริ่นนำ
MTE แบบอะซิงโครนัส
  sanitize: {
  memtag_heap: true,
  }
MTE แบบซิงโครนัส
  sanitize: {
  memtag_heap: true,
  diag: {
  memtag_heap: true,
  },
  }

หรือใน Android.mk:

โหมด MTE การเกริ่นนำ
Asynchronous MTE LOCAL_SANITIZE := memtag_heap
Synchronous MTE LOCAL_SANITIZE := memtag_heap
LOCAL_SANITIZE_DIAG := memtag_heap

2. การเปิดใช้ MTE ในไดเรกทอรีย่อยในโครงสร้างแหล่งที่มาโดยใช้ตัวแปรผลิตภัณฑ์

โหมด MTE รายการที่รวม รายการการยกเว้น
ไม่พร้อมกัน PRODUCT_MEMTAG_HEAP_ASYNC_INCLUDE_PATHS MEMTAG_HEAP_ASYNC_INCLUDE_PATHS PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
ซิงค์ PRODUCT_MEMTAG_HEAP_SYNC_INCLUDE_PATHS MEMTAG_HEAP_SYNC_INCLUDE_PATHS

หรือ

โหมด MTE การเกริ่นนำ
MTE แบบอะซิงโครนัส MEMTAG_HEAP_ASYNC_INCLUDE_PATHS
MTE แบบซิงโครนัส MEMTAG_HEAP_SYNC_INCLUDE_PATHS

หรือโดยการระบุเส้นทางยกเว้นของไฟล์ที่เรียกใช้งานได้

โหมด MTE การเกริ่นนำ
MTE แบบอะซิงโครนัส PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS MEMTAG_HEAP_EXCLUDE_PATHS
MTE แบบซิงโครนัส

ตัวอย่าง (การใช้งานคล้ายกับ PRODUCT_CFI_INCLUDE_PATHS)

  PRODUCT_MEMTAG_HEAP_SYNC_INCLUDE_PATHS=vendor/$(vendor)
  PRODUCT_MEMTAG_HEAP_EXCLUDE_PATHS=vendor/$(vendor)/projectA \
                                    vendor/$(vendor)/projectB

เปิดใช้ MTE โดยใช้พร็อพเพอร์ตี้ของระบบ

คุณลบล้างการตั้งค่าบิลด์ข้างต้นได้ที่รันไทม์โดยการตั้งค่าพร็อพเพอร์ตี้ระบบต่อไปนี้

arm64.memtag.process.<basename> = (off|sync|async)

โดย basename หมายถึงชื่อฐานของไฟล์ที่เรียกใช้งานได้

เช่น หากต้องการตั้งค่า /system/bin/ping หรือ /data/local/tmp/ping ให้ใช้ MTE แบบอะซิงโครนัส ให้ใช้ adb shell setprop arm64.memtag.process.ping async

เปิดใช้ MTE โดยใช้ตัวแปรสภาพแวดล้อม

อีกวิธีในการลบล้างการตั้งค่าบิลด์สำหรับกระบวนการเนทีฟ (ที่ไม่ใช่แอป) คือการกำหนดตัวแปรสภาพแวดล้อม MEMTAG_OPTIONS=(off|sync|async) หากมีการกำหนดทั้งตัวแปรสภาพแวดล้อมและพร็อพเพอร์ตี้ของระบบ ตัวแปรจะมีลำดับความสำคัญสูงกว่า

เปิดใช้ MTE สำหรับแอป

หากไม่ได้ระบุไว้ MTE จะปิดใช้โดยค่าเริ่มต้น แต่แอปที่ต้องการใช้ MTE สามารถทำได้โดยการตั้งค่า android:memtagMode ภายใต้แท็ก <application> หรือ <process> ใน AndroidManifest.xml

android:memtagMode=(off|default|sync|async)

เมื่อตั้งค่าในแท็ก <application> แอตทริบิวต์ จะส่งผลต่อกระบวนการทั้งหมดที่แอปใช้ และสามารถลบล้าง กระบวนการแต่ละรายการได้โดยการตั้งค่าแท็ก <process>

สําหรับการทดลอง คุณสามารถใช้การเปลี่ยนแปลง ความเข้ากันได้เพื่อตั้งค่าเริ่มต้นของแอตทริบิวต์ memtagModeสําหรับแอปที่ไม่ได้ระบุค่าใดๆ ใน Manifest (หรือระบุ default)
คุณจะดูการเปลี่ยนแปลงเหล่านี้ได้ในส่วนSystem > Advanced > Developer options > App Compatibility Changesในเมนูการตั้งค่าส่วนกลาง การตั้งค่า NATIVE_MEMTAG_ASYNC หรือ NATIVE_MEMTAG_SYNC จะเปิดใช้ MTE สำหรับแอปหนึ่งๆ
หรือจะตั้งค่านี้โดยใช้คำสั่ง am ดังนี้ก็ได้

$ adb shell am compat enable NATIVE_MEMTAG_[A]SYNC my.app.name

สร้างอิมเมจระบบ MTE

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

เราขอแนะนำอย่างยิ่งให้เปิดใช้ MTE ในโหมด Synchronous ในไบนารีเนทีฟทั้งหมดระหว่างการพัฒนา

SANITIZE_TARGET=memtag_heap SANITIZE_TARGET_DIAG=memtag_heap m

SANITIZE_TARGET สามารถใช้เป็นตัวแปรสภาพแวดล้อมหรือการตั้งค่า make ได้ (เช่น ในproduct.mk) เช่นเดียวกับตัวแปรอื่นๆ ในระบบบิลด์
โปรดทราบว่าการดำเนินการนี้จะเปิดใช้ MTE สำหรับกระบวนการเนทีฟทั้งหมด แต่ไม่ใช่สำหรับ แอป (ซึ่งแยกจาก zygote64) ที่เปิดใช้ MTE ได้โดยทำตามวิธีการด้านบน

กำหนดค่าระดับ MTE ที่ต้องการสำหรับ CPU โดยเฉพาะ

ใน CPU บางรุ่น ประสิทธิภาพของ MTE ในโหมด ASYMM หรือแม้แต่ SYNC อาจคล้ายกับ ประสิทธิภาพของ ASYNC จึงคุ้มค่าที่จะเปิดใช้การตรวจสอบที่เข้มงวดมากขึ้นใน CPU เหล่านั้นเมื่อมีการขอโหมดการตรวจสอบที่เข้มงวดน้อยกว่า เพื่อให้ได้รับประโยชน์จากการตรวจหาข้อผิดพลาดของการตรวจสอบที่เข้มงวดมากขึ้นโดยไม่มีข้อเสียด้านประสิทธิภาพ
โดยค่าเริ่มต้น กระบวนการที่กำหนดค่าให้ทำงานในโหมด ASYNC จะทำงานในโหมด ASYNC ใน CPU ทั้งหมด หากต้องการกำหนดค่าเคอร์เนลให้เรียกใช้กระบวนการเหล่านี้ในโหมด SYNC บน CPU ที่เฉพาะเจาะจง คุณต้องเขียนค่า sync ไปยังรายการ sysfs /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred ในเวลาบูต ซึ่งทำได้โดยใช้สคริปต์ init ตัวอย่างเช่น หากต้องการกำหนดค่า CPU 0-1 ให้เรียกใช้กระบวนการโหมด ASYNC ในโหมด SYNC และกำหนดค่า CPU 2-3 ให้ใช้โหมด ASYMM คุณอาจเพิ่มรายการต่อไปนี้ลงในอนุประโยค init ของสคริปต์ init ของผู้ให้บริการ

  write /sys/devices/system/cpu/cpu0/mte_tcf_preferred sync
  write /sys/devices/system/cpu/cpu1/mte_tcf_preferred sync
  write /sys/devices/system/cpu/cpu2/mte_tcf_preferred asymm
  write /sys/devices/system/cpu/cpu3/mte_tcf_preferred asymm

Tombstone จากกระบวนการโหมด ASYNC ที่ทำงานในโหมด SYNC จะมี การติดตามสแต็กที่แน่นอนของตำแหน่งข้อผิดพลาดของหน่วยความจำ อย่างไรก็ตาม จะไม่มี การจัดสรรหรือการยกเลิกการจัดสรร Stack Trace Stack Trace เหล่านี้จะใช้ได้ก็ต่อเมื่อมีการกำหนดค่ากระบวนการให้ทำงานในโหมด SYNC เท่านั้น

int mallopt(M_THREAD_DISABLE_MEM_INIT, level)

โดยที่ level คือ 0 หรือ 1
ปิดใช้การเริ่มต้นหน่วยความจำใน malloc และหลีกเลี่ยงการเปลี่ยนแท็กหน่วยความจำ เว้นแต่จะจำเป็นต่อความถูกต้อง

int mallopt(M_MEMTAG_TUNING, level)

โดยที่ level คือ

  • M_MEMTAG_TUNING_BUFFER_OVERFLOW
  • M_MEMTAG_TUNING_UAF

เลือกกลยุทธ์การจัดสรรแท็ก

  • การตั้งค่าเริ่มต้นคือ M_MEMTAG_TUNING_BUFFER_OVERFLOW
  • M_MEMTAG_TUNING_BUFFER_OVERFLOW - เปิดใช้การตรวจหาข้อบกพร่องของบัฟเฟอร์เชิงเส้นล้นและบัฟเฟอร์เชิงเส้นขาดที่กำหนดได้โดยการกำหนดค่าแท็กที่ไม่ซ้ำกันให้กับการจัดสรรที่อยู่ติดกัน โหมดนี้มีโอกาสตรวจพบข้อบกพร่อง Use-After-Free น้อยลงเล็กน้อย เนื่องจากค่าแท็กที่เป็นไปได้เพียงครึ่งเดียวเท่านั้นที่พร้อมใช้งานสำหรับตำแหน่งหน่วยความจำแต่ละตำแหน่ง โปรดทราบว่า MTE ไม่สามารถตรวจจับ การล้นภายในแกรนูลแท็กเดียวกัน (ก้อนที่จัดแนว 16 ไบต์) และอาจพลาดการล้นขนาดเล็ก แม้ในโหมดนี้ การล้นดังกล่าวไม่สามารถเป็นสาเหตุของการ เสียหายของหน่วยความจำได้ เนื่องจากหน่วยความจำภายในหนึ่งแกรนูลจะไม่ใช้สำหรับการ จัดสรรหลายรายการ
  • M_MEMTAG_TUNING_UAF - เปิดใช้แท็กแบบสุ่มอย่างอิสระ เพื่อให้มีโอกาสตรวจพบทั้งข้อบกพร่องเชิงพื้นที่ (บัฟเฟอร์ล้น) และ เชิงเวลา (ใช้หลังจากปล่อย) อย่างสม่ำเสมอที่ประมาณ 93%

นอกเหนือจาก API ที่อธิบายไว้ข้างต้นแล้ว ผู้ใช้ที่มีประสบการณ์อาจต้องการทราบข้อมูลต่อไปนี้

  • การตั้งค่ารีจิสเตอร์ฮาร์ดแวร์PSTATE.TCOจะระงับการตรวจสอบแท็กชั่วคราวได้ (ตัวอย่าง) เช่น เมื่อคัดลอกช่วงหน่วยความจำที่มีเนื้อหาแท็กที่ไม่รู้จัก หรือ เมื่อระบุคอขวดด้านประสิทธิภาพในลูปที่ทำงานหนัก
  • เมื่อใช้ M_HEAP_TAGGING_LEVEL_SYNC ตัวแฮนเดิลข้อขัดข้องของระบบ จะให้ข้อมูลเพิ่มเติม เช่น สแต็กเทรซการจัดสรรและการยกเลิกการจัดสรร ฟังก์ชันนี้ต้องมีสิทธิ์เข้าถึงบิตของแท็ก และจะเปิดใช้โดยการส่งแฟล็ก SA_EXPOSE_TAGBITS เมื่อตั้งค่าตัวแฮนเดิลสัญญาณ เราขอแนะนำให้โปรแกรมที่ตั้งค่าตัวแฮนเดิลสัญญาณของตัวเองและมอบสิทธิ์ข้อขัดข้องที่ไม่รู้จักให้กับระบบทำเช่นเดียวกัน

MTE ในเคอร์เนล

หากต้องการเปิดใช้ KASAN ที่เร่งด้วย MTE สำหรับเคอร์เนล ให้กำหนดค่าเคอร์เนลด้วย CONFIG_KASAN=y, CONFIG_KASAN_HW_TAGS=y การกำหนดค่าเหล่านี้ จะเปิดใช้โดยค่าเริ่มต้นในเคอร์เนล GKI ตั้งแต่ Android 12-5.10 เป็นต้นไป
คุณควบคุมได้ในเวลาบูตโดยใช้อาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้

  • kasan=[on|off] - เปิดหรือปิดใช้ KASAN (ค่าเริ่มต้น: on)
  • kasan.mode=[sync|async] - เลือกระหว่างโหมดเรียลไทม์และไม่เรียลไทม์ (ค่าเริ่มต้น: sync)
  • kasan.stacktrace=[on|off] - whether to collect stack traces (default: on)
    • การรวบรวม Stack Trace ยังต้องใช้ stack_depot_disable=off ด้วย
  • kasan.fault=[report|panic] - whether to only print the report, or also panic the kernel (default: report). Regardless of this option, tag checking gets disabled after the first reported error.

เราขอแนะนำอย่างยิ่งให้ใช้โหมด SYNC ระหว่างการเริ่มต้น การพัฒนา และ การทดสอบ คุณควรเปิดใช้ตัวเลือกนี้ทั่วโลกสำหรับกระบวนการทั้งหมดที่ใช้ตัวแปรสภาพแวดล้อมหรือระบบบิลด์ ในโหมดนี้ ระบบจะตรวจพบข้อบกพร่องตั้งแต่เนิ่นๆ ในกระบวนการพัฒนา ฐานของโค้ดจะมีความเสถียรเร็วขึ้น และช่วยประหยัดค่าใช้จ่ายในการตรวจหาข้อบกพร่องในภายหลังในขั้นตอนการผลิต

เราขอแนะนำอย่างยิ่งให้ใช้โหมด ASYNC ในเวอร์ชันที่ใช้งานจริง ซึ่งเป็นเครื่องมือที่มีค่าใช้จ่ายต่ำ สำหรับการตรวจหาข้อบกพร่องด้านความปลอดภัยของหน่วยความจำในกระบวนการ รวมถึงการป้องกันเชิงลึกเพิ่มเติม เมื่อตรวจพบข้อบกพร่อง นักพัฒนาแอปจะ ใช้ประโยชน์จาก API ของรันไทม์เพื่อเปลี่ยนเป็นโหมด SYNC และรับ Stack Trace ที่ถูกต้อง จากกลุ่มผู้ใช้ที่สุ่มตัวอย่างได้

เราขอแนะนำอย่างยิ่งให้กำหนดค่าระดับ MTE ที่ต้องการเฉพาะ CPU สำหรับ SoC โดยปกติแล้วโหมด Asymm จะมีลักษณะด้านประสิทธิภาพเหมือนกับ ASYNC และมักจะดีกว่าเสมอ โดยทั่วไปแล้ว คอร์แบบเรียงลำดับขนาดเล็กมักแสดงประสิทธิภาพที่คล้ายกันในทั้ง 3 โหมด และสามารถกำหนดค่าให้ใช้ SYNC เป็นค่าเริ่มต้นได้

นักพัฒนาแอปควรตรวจสอบว่ามีข้อขัดข้องหรือไม่โดยตรวจสอบ /data/tombstones, logcat หรือตรวจสอบไปป์ไลน์ DropboxManager ของผู้ให้บริการเพื่อดูข้อบกพร่องของผู้ใช้ปลายทาง ดูข้อมูลเพิ่มเติมเกี่ยวกับการแก้ไขข้อบกพร่องของโค้ดเนทีฟของ Android ได้ที่นี่

คอมโพเนนต์ของแพลตฟอร์มที่เปิดใช้ MTE

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

  • Daemon และยูทิลิตีเครือข่าย (ยกเว้น netd)
  • บลูทูธ, SecureElement, NFC HAL และแอปของระบบ
  • statsd daemon
  • system_server
  • zygote64 (เพื่อให้แอปเลือกใช้ MTE ได้)

เราเลือกเป้าหมายเหล่านี้ตามเกณฑ์ต่อไปนี้

  • กระบวนการที่มีสิทธิ์ (กำหนดเป็นกระบวนการที่มีสิทธิ์เข้าถึงบางอย่าง ที่โดเมน SELinux ของ unprivileged_app ไม่มี)
  • ประมวลผลอินพุตที่ไม่น่าเชื่อถือ (กฎ ของสอง)
  • ประสิทธิภาพที่ช้าลงได้ (ความช้าไม่ได้ทำให้เกิดเวลาในการตอบสนองที่ผู้ใช้มองเห็นได้ )

เราขอแนะนำให้ผู้ให้บริการเปิดใช้ MTE ในเวอร์ชันที่ใช้งานจริงสำหรับคอมโพเนนต์เพิ่มเติม ตามเกณฑ์ที่กล่าวถึงข้างต้น ในระหว่างการพัฒนา เราขอแนะนำให้ทดสอบ คอมโพเนนต์เหล่านี้โดยใช้โหมด SYNC เพื่อตรวจหาข้อบกพร่องที่แก้ไขได้ง่าย และประเมิน ผลกระทบของ ASYNC ต่อประสิทธิภาพ
ในอนาคต Android วางแผนที่จะขยายรายการคอมโพเนนต์ของระบบที่เปิดใช้ MTE โดยอิงตามลักษณะประสิทธิภาพของการออกแบบฮาร์ดแวร์ที่กำลังจะเปิดตัว