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
ตัวจัดการข้อขัดข้องของระบบจะแสดงข้อมูลเพิ่มเติม เช่น สแต็กเทรซการจัดสรรและการยกเลิกการจัดสรร ฟังก์ชันการทํางานนี้ต้องใช้สิทธิ์เข้าถึงบิตแท็กและเปิดใช้โดยการส่ง FlagSA_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
daemonsystem_server
zygote64
(เพื่อให้แอปเลือกใช้ MTE ได้)
เป้าหมายเหล่านี้ได้รับการเลือกตามเกณฑ์ต่อไปนี้
- กระบวนการที่มีสิทธิ์ (หมายถึงกระบวนการที่มีสิทธิ์เข้าถึงสิ่งที่โดเมน SELinux ของ unprivileged_app ไม่มีสิทธิ์เข้าถึง)
- ประมวลผลข้อมูลที่ไม่น่าไว้วางใจ (กฎข้อที่ 2)
- ประสิทธิภาพที่ช้าลงซึ่งยอมรับได้ (การทํางานช้าลงจะไม่สร้างเวลาในการตอบสนองที่ผู้ใช้มองเห็นได้)
เราขอแนะนำให้ผู้ให้บริการเปิดใช้ MTE ในเวอร์ชันที่ใช้งานจริงสำหรับคอมโพเนนต์เพิ่มเติม โดยทำตามเกณฑ์ที่ระบุไว้ข้างต้น ในระหว่างการพัฒนา เราขอแนะนำให้ทดสอบคอมโพเนนต์เหล่านี้โดยใช้โหมด SYNC เพื่อตรวจหาข้อบกพร่องที่แก้ไขได้ง่าย และประเมินผลกระทบของ ASYNC ต่อประสิทธิภาพ
ในอนาคต Android วางแผนที่จะขยายรายการคอมโพเนนต์ของระบบที่เปิดใช้ MTE โดยอิงตามลักษณะประสิทธิภาพของการออกแบบฮาร์ดแวร์ที่กำลังจะมีให้บริการ