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

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

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

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

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

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

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

ด้วยเหตุนี้ ไม่มี API ใดที่อธิบายไว้ด้านล่างพูดถึงโหมดแบบไม่สมมาตร แต่สามารถกำหนดค่าระบบปฏิบัติการให้ใช้โหมดแบบไม่สมมาตรทุกครั้งที่ขอแบบไม่สอดคล้องกันได้ โปรดดูข้อมูลเพิ่มเติมในส่วน "การกำหนดค่าระดับ 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 รายการรวม รายการที่ยกเว้น
async 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 ในโหมดซิงค์กับไบนารีเนทีฟทั้งหมดในระหว่างการพัฒนา

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

  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

รายการที่ลบไปแล้วจากกระบวนการโหมด ASYNC ที่ทำงานในโหมด SYNC จะมีสแต็กเทรซที่แม่นยำของตำแหน่งข้อผิดพลาดเกี่ยวกับหน่วยความจำ แต่จะไม่รวมสแต็กเทรซการจัดสรรหรือการยกเลิกการจัดสรร ข้อมูลสแต็กเทรซเหล่านี้จะพร้อมใช้งานก็ต่อเมื่อมีการกําหนดค่ากระบวนการให้ทํางานในโหมด 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 - เปิดใช้การตรวจหาข้อบกพร่องที่แน่นอนของบัฟเฟอร์เชิงเส้นที่ล้นหรือต่ำกว่าเกณฑ์โดยการกําหนดค่าแท็กที่แตกต่างกันให้กับการจัดสรรที่อยู่ติดกัน โหมดนี้มีแนวโน้มที่จะตรวจพบข้อบกพร่องการใช้หลังจากยกเลิกการจองหน่วยความจําได้น้อยลง เนื่องจากมีเพียงค่าแท็กครึ่งเดียวที่เป็นไปได้สําหรับตําแหน่งหน่วยความจําแต่ละแห่ง โปรดทราบว่า MTE ไม่สามารถตรวจหาการล้นภายในกลุ่มของแท็กเดียวกัน (กลุ่มที่สอดคล้องกับ 16 ไบต์) และอาจพลาดการล้นเล็กน้อยแม้ในโหมดนี้ การล้นดังกล่าวไม่ใช่สาเหตุของการเสียหายของหน่วยความจํา เนื่องจากหน่วยความจําภายใน Granule หนึ่งไม่เคยใช้สำหรับการจัดสรรหลายครั้ง
  • M_MEMTAG_TUNING_UAF - เปิดใช้แท็กแบบสุ่มอิสระเพื่อเพิ่มความน่าจะเป็นในการตรวจหาข้อบกพร่องทั้งแบบเชิงพื้นที่ (บัฟเฟอร์ล้น) และแบบเชิงเวลา (ใช้หลังจากยกเลิกการจัดสรร) ให้เป็น 93% เท่าๆ กัน

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

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

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] - กำหนดว่าจะรวบรวมหรือไม่รวบรวมสแต็กเทรซ (ค่าเริ่มต้น: on)
    • การเก็บรวบรวมสแต็กเทรซต้องใช้ stack_depot_disable=off ด้วย
  • kasan.fault=[report|panic] - ว่าจะพิมพ์รายงานเท่านั้น หรือจะหยุดการทำงานของเคอร์เนลด้วย (ค่าเริ่มต้น: report) ไม่ว่าจะเลือกตัวเลือกใด การตรวจสอบแท็กจะปิดอยู่หลังจากข้อผิดพลาดที่รายงานครั้งแรก

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

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

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

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

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

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

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

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

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

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