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