หน้านี้อธิบายวิธีที่ Android จัดการปัญหาความเข้ากันได้ของนโยบายกับการอัปเดตแพลตฟอร์มแบบ Over-The-Air (OTA) ซึ่งการตั้งค่า SELinux ของแพลตฟอร์มใหม่อาจแตกต่างจากการตั้งค่า SELinux ของผู้จำหน่ายเก่า
การเป็นเจ้าของและการติดป้ายกำกับออบเจ็กต์
ต้องกำหนดความเป็นเจ้าของสำหรับแต่ละออบเจ็กต์อย่างชัดเจนเพื่อแยกนโยบายของแพลตฟอร์มและผู้ให้บริการออกจากกัน
ตัวอย่างเช่น หากป้ายกำกับนโยบายของผู้ให้บริการ /dev/foo
และป้ายกำกับนโยบายของแพลตฟอร์ม /dev/foo ใน OTA ที่ตามมา
จะมีลักษณะการทำงานที่ไม่ได้กำหนดไว้ เช่น การปฏิเสธที่ไม่คาดคิด หรือที่สำคัญกว่านั้นคือการบูต
ล้มเหลว สำหรับ SELinux ปัญหานี้จะแสดงเป็นการติดป้ายกำกับที่ซ้ำกัน โหนดอุปกรณ์
มีได้เพียงป้ายกำกับเดียวซึ่งจะแสดงป้ายกำกับที่ใช้ล่าสุด
ผลที่เกิดขึ้นมีดังนี้
- กระบวนการที่ต้องเข้าถึงป้ายกำกับที่ใช้ไม่สำเร็จ จะเสียสิทธิ์เข้าถึงทรัพยากร
- กระบวนการที่ได้รับสิทธิ์เข้าถึงไฟล์อาจหยุดทำงานเนื่องจาก สร้างโหนดอุปกรณ์ที่ไม่ถูกต้อง
การชนกันระหว่างป้ายกำกับของแพลตฟอร์มและผู้ให้บริการอาจเกิดขึ้นกับออบเจ็กต์ใดก็ได้ที่มี ป้ายกำกับ SELinux ซึ่งรวมถึงพร็อพเพอร์ตี้ บริการ กระบวนการ ไฟล์ และซ็อกเก็ต โปรดระบุความเป็นเจ้าของออบเจ็กต์เหล่านี้ให้ชัดเจนเพื่อหลีกเลี่ยงปัญหาดังกล่าว
การกำหนดเนมสเปซของประเภท/ชื่อแอตทริบิวต์
นอกเหนือจากการทับซ้อนของป้ายกำกับแล้ว ชื่อประเภทและแอตทริบิวต์ของ SELinux ยังอาจทับซ้อนกันได้ด้วย SELinux ไม่อนุญาตให้ประกาศประเภทและแอตทริบิวต์เดียวกันหลายครั้ง นโยบายที่มีการประกาศซ้ำจะคอมไพล์ไม่สำเร็จ เราขอแนะนำอย่างยิ่งให้การประกาศของผู้ให้บริการทั้งหมดเริ่มต้นด้วยคำนำหน้า vendor_ เพื่อหลีกเลี่ยงการชนกันของประเภท
และชื่อแอตทริบิวต์ เช่น ผู้ขายควรใช้ type vendor_foo, domain; แทน type foo, domain;
การเป็นเจ้าของไฟล์
การป้องกันการชนกันของไฟล์เป็นเรื่องที่ท้าทายเนื่องจากทั้งนโยบายของแพลตฟอร์มและผู้ให้บริการ มักจะระบุป้ายกำกับสำหรับระบบไฟล์ทั้งหมด การตั้งชื่อไฟล์ตามเนมสเปซไม่สามารถทำได้เนื่องจากเคอร์เนลเป็นผู้สร้างไฟล์จำนวนมาก ซึ่งแตกต่างจากการตั้งชื่อประเภท หากต้องการป้องกันการชนกันเหล่านี้ ให้ทำตามคำแนะนำในการตั้งชื่อระบบไฟล์ ในส่วนนี้ สำหรับ Android 8.0 ข้อกำหนดเหล่านี้เป็นเพียงคำแนะนำที่ไม่มีการบังคับใช้ทางเทคนิค ในอนาคต ชุดทดสอบของผู้ให้บริการ (VTS) จะบังคับใช้คำแนะนำเหล่านี้
ระบบ (/system)
เฉพาะอิมเมจระบบเท่านั้นที่ต้องระบุป้ายกำกับสำหรับคอมโพเนนต์ /system
ถึง file_contexts, service_contexts ฯลฯ หากมีการเพิ่มป้ายกำกับ
สำหรับคอมโพเนนต์ /system ในนโยบายของผู้ให้บริการ การอัปเดต OTA เฉพาะเฟรมเวิร์กอาจเป็นไปไม่ได้
ผู้ให้บริการ (/vendor)
นโยบาย SELinux ของ AOSP ติดป้ายกำกับส่วนต่างๆ ของพาร์ติชัน vendor
ที่แพลตฟอร์มโต้ตอบด้วยอยู่แล้ว ซึ่งช่วยให้เขียนกฎ SELinux สำหรับกระบวนการของแพลตฟอร์มเพื่อให้สามารถพูดคุยหรือเข้าถึงส่วนต่างๆ ของพาร์ติชัน vendor
ได้ ตัวอย่าง
| /vendor path | ป้ายกำกับที่แพลตฟอร์มระบุ | กระบวนการของแพลตฟอร์มขึ้นอยู่กับป้ายกำกับ |
|---|---|---|
/vendor(/.*)?
|
vendor_file
|
ไคลเอ็นต์ HAL ทั้งหมดในเฟรมเวิร์ก ueventd ฯลฯ
|
/vendor/framework(/.*)?
|
vendor_framework_file
|
dex2oat, appdomain และอื่นๆ
|
/vendor/app(/.*)?
|
vendor_app_file
|
dex2oat, installd, idmap ฯลฯ
|
/vendor/overlay(/.*)
|
vendor_overlay_file
|
system_server, zygote, idmap ฯลฯ
|
ดังนั้น คุณต้องปฏิบัติตามกฎที่เฉพาะเจาะจง (บังคับใช้ผ่าน
neverallows) เมื่อติดป้ายกำกับไฟล์เพิ่มเติมในพาร์ติชัน
vendor
vendor_fileต้องเป็นป้ายกำกับเริ่มต้นสำหรับไฟล์ทั้งหมดใน พาร์ติชันvendorนโยบายแพลตฟอร์มกำหนดให้ต้องทำเช่นนี้เพื่อ เข้าถึงการใช้งาน HAL แบบส่งผ่านexec_typesใหม่ทั้งหมดที่เพิ่มในพาร์ติชันvendorผ่านนโยบายของผู้ให้บริการต้องมีแอตทริบิวต์vendor_file_typeซึ่งบังคับใช้ผ่าน neverallows- เพื่อหลีกเลี่ยงการขัดแย้งกับการอัปเดตแพลตฟอร์ม/เฟรมเวิร์กในอนาคต ให้หลีกเลี่ยงการติดป้ายกำกับ
ไฟล์อื่นๆ นอกเหนือจาก
exec_typesในพาร์ติชันvendor - การขึ้นต่อกันของไลบรารีทั้งหมดสำหรับ HAL ของกระบวนการเดียวกันที่ AOSP ระบุต้องมีป้ายกำกับเป็น
same_process_hal_file.
Procfs (/proc)
ไฟล์ใน /proc อาจติดป้ายกำกับได้โดยใช้ป้ายกำกับ genfscon
เท่านั้น ใน Android 7.0 ทั้งนโยบายแพลตฟอร์มและนโยบายผู้ให้บริการใช้ genfscon เพื่อติดป้ายกำกับไฟล์ใน procfs
คำแนะนำ: ป้ายกำกับนโยบายแพลตฟอร์มเท่านั้น /proc
หากกระบวนการของผู้ให้บริการต้องเข้าถึงไฟล์ใน /proc ที่ปัจจุบันมีป้ายกำกับเริ่มต้น (proc) นโยบายของผู้ให้บริการไม่ควรติดป้ายกำกับอย่างชัดเจน แต่ควรใช้ประเภท proc ทั่วไปเพื่อเพิ่มกฎสำหรับโดเมนของผู้ให้บริการแทน ซึ่งจะช่วยให้แพลตฟอร์ม
อัปเดตเพื่อรองรับอินเทอร์เฟซเคอร์เนลในอนาคตที่แสดงผ่าน procfs และติดป้ายกำกับอย่างชัดเจนได้ตามต้องการ
Debugfs (/sys/kernel/debug)
Debugfs สามารถติดป้ายกำกับได้ทั้งใน file_contexts และ genfscon ใน Android 7.0 ถึง Android 10 ทั้งแพลตฟอร์มและป้ายกำกับของผู้ให้บริการ
debugfs
ใน Android 11 debugfs จะเข้าถึงหรือติดตั้งในอุปกรณ์ที่ใช้งานจริงไม่ได้ ผู้ผลิตอุปกรณ์ควร
นำ debugfs ออก
Tracefs (/sys/kernel/debug/tracing)
Tracefs สามารถติดป้ายกำกับได้ทั้งใน file_contexts และ genfscon ใน Android 7.0 มีเพียงป้ายกำกับแพลตฟอร์ม
tracefs
คำแนะนำ: มีเพียงแพลตฟอร์มเท่านั้นที่ติดป้ายกำกับ tracefs ได้
Sysfs (/sys)
ไฟล์ใน /sys อาจมีป้ายกำกับโดยใช้ทั้ง file_contexts
และ genfscon ใน Android 7.0 ทั้งแพลตฟอร์มและผู้ให้บริการใช้
genfscon เพื่อติดป้ายกำกับไฟล์ใน sysfs
คำแนะนำ: แพลตฟอร์มอาจติดป้ายกำกับsysfs
โหนดที่ไม่เจาะจงอุปกรณ์ มิฉะนั้นจะมีเพียงผู้ให้บริการเท่านั้นที่ติดป้ายกำกับไฟล์ได้
tmpfs (/dev)
ไฟล์ใน /dev อาจติดป้ายกำกับใน file_contexts ใน Android 7.0 ทั้งแพลตฟอร์มและไฟล์ป้ายกำกับของผู้ให้บริการจะอยู่ที่นี่
คำแนะนำ: ผู้ให้บริการอาจติดป้ายกำกับเฉพาะไฟล์ใน
/dev/vendor (เช่น /dev/vendor/foo
/dev/vendor/socket/bar)
Rootfs (/)
ไฟล์ใน / อาจติดป้ายกำกับใน file_contexts ใน Android
7.0 ทั้งไฟล์ป้ายกำกับของแพลตฟอร์มและผู้ให้บริการจะอยู่ที่นี่
คำแนะนำ: มีเพียงระบบเท่านั้นที่ติดป้ายกำกับไฟล์ใน / ได้
ข้อมูล (/data)
ระบบจะติดป้ายกำกับข้อมูลผ่านการผสมผสานระหว่าง file_contexts และ seapp_contexts
คำแนะนำ: ไม่อนุญาตให้ติดป้ายกำกับของผู้ให้บริการภายนอก
/data/vendor มีเพียงแพลตฟอร์มเท่านั้นที่ติดป้ายกำกับส่วนอื่นๆ ของ
/data
เวอร์ชันป้ายกำกับ Genfs
ตั้งแต่ vendor API level 202504 เป็นต้นไป ป้ายกำกับ SELinux
รุ่นใหม่ที่กำหนดด้วย genfscon ใน
system/sepolicy/compat/plat_sepolicy_genfs_ver.cil จะ
ไม่บังคับสำหรับพาร์ติชัน vendor รุ่นเก่า ซึ่งจะช่วยให้พาร์ติชันรุ่นเก่า
vendorยังคงใช้การติดตั้งใช้งาน SEPolicy ที่มีอยู่ได้
ซึ่งควบคุมโดยตัวแปร Makefile BOARD_GENFS_LABELS_VERSION
ซึ่งจัดเก็บไว้ใน /vendor/etc/selinux/genfs_labels_version.txt
ตัวอย่าง
-
ในระดับ API ของผู้ให้บริการ 202404 ระบบจะติดป้ายกำกับโหนด
/sys/class/udcเป็นsysfsโดยค่าเริ่มต้น -
ตั้งแต่ API ระดับ 202504 ของผู้ให้บริการเป็นต้นไป
/sys/class/udcจะมีป้ายกำกับเป็นsysfs_udc
อย่างไรก็ตาม /sys/class/udc อาจใช้งานโดยพาร์ติชัน vendor
ที่ใช้ API ระดับ 202404 โดยมีป้ายกำกับ sysfs
เริ่มต้นหรือป้ายกำกับเฉพาะของผู้ให้บริการ การติดป้ายกำกับ /sys/class/udc เป็น sysfs_udc โดยไม่มีเงื่อนไขอาจทำให้เกิดปัญหาความเข้ากันได้
กับพาร์ติชัน vendor เหล่านี้ การเลือก
BOARD_GENFS_LABELS_VERSIONจะทำให้แพลตฟอร์มใช้ป้ายกำกับและสิทธิ์ก่อนหน้า
สำหรับพาร์ติชัน vendor รุ่นเก่าต่อไป
BOARD_GENFS_LABELS_VERSION อาจมากกว่าหรือเท่ากับระดับ API ของผู้ให้บริการ เช่น vendorพาร์ติชันที่ใช้ API ระดับ 202404 สามารถตั้งค่า
BOARD_GENFS_LABELS_VERSION เป็น 202504 เพื่อใช้ป้ายกำกับใหม่ที่เปิดตัว
ใน 202504 ดูรายการ
ป้ายกำกับ genfs ที่เฉพาะเจาะจงสำหรับ 202504
เมื่อติดป้ายกำกับโหนด genfscon แพลตฟอร์มต้องพิจารณาพาร์ติชันรุ่นเก่า
vendorและใช้กลไกการย้อนกลับเพื่อ
ความเข้ากันได้เมื่อจำเป็น แพลตฟอร์มสามารถใช้ไลบรารีเฉพาะแพลตฟอร์มเพื่อค้นหา
เวอร์ชันป้ายกำกับ genfs
-
ในโฆษณาเนทีฟ ให้ใช้
libgenfslabelsversionดูgenfslabelsversion.hสำหรับไฟล์ส่วนหัวของlibgenfslabelsversion -
ใน Java ให้ใช้
android.os.SELinux.getGenfsLabelsVersion()
นโยบายสาธารณะของแพลตฟอร์ม
นโยบาย SELinux ของแพลตฟอร์มแบ่งออกเป็นแบบส่วนตัวและแบบสาธารณะ
นโยบายสาธารณะของแพลตฟอร์มประกอบด้วยประเภทและแอตทริบิวต์ที่พร้อมใช้งานเสมอ
สำหรับระดับ API ของผู้ให้บริการ
ซึ่งทำหน้าที่เป็น API ระหว่างแพลตฟอร์มกับผู้ให้บริการ นโยบายนี้จะแสดงต่อผู้เขียนนโยบายของผู้ให้บริการ
เพื่อให้ผู้ให้บริการสร้างไฟล์นโยบายของผู้ให้บริการได้ ซึ่งเมื่อ
รวมกับนโยบายส่วนตัวของแพลตฟอร์มแล้ว จะส่งผลให้นโยบายของอุปกรณ์ทํางานได้อย่างเต็มที่
นโยบายแพลตฟอร์มสาธารณะกำหนดไว้ใน
system/sepolicy/public
เช่น ประเภท vendor_init ซึ่งแสดงถึงกระบวนการเริ่มต้นใน
บริบทของผู้ให้บริการ จะกำหนดไว้ใน
system/sepolicy/public/vendor_init.te ดังนี้
type vendor_init, domain;
ผู้ให้บริการสามารถดูประเภท vendor_init เพื่อเขียนกฎนโยบายที่กำหนดเองได้
# Allow vendor_init to set vendor_audio_prop in vendor's init scripts
set_prop(vendor_init, vendor_audio_prop)แอตทริบิวต์ความเข้ากันได้
นโยบาย SELinux คือการโต้ตอบระหว่างประเภทต้นทางและเป้าหมายสำหรับ คลาสออบเจ็กต์และสิทธิ์ที่เฉพาะเจาะจง ออบเจ็กต์ทุกรายการ (เช่น กระบวนการ ไฟล์) ที่ได้รับผลกระทบจากนโยบาย SELinux จะมีได้เพียงประเภทเดียว แต่ประเภทนั้นอาจมีแอตทริบิวต์หลายรายการ
นโยบายส่วนใหญ่เขียนขึ้นโดยอิงตามประเภทที่มีอยู่ ในที่นี้ ทั้ง
vendor_init และ debugfs เป็นประเภท
allow vendor_init debugfs:dir { mounton };
ซึ่งเป็นไปได้เนื่องจากนโยบายนี้เขียนขึ้นโดยมีความรู้เกี่ยวกับเนื้อหาทุกประเภท อย่างไรก็ตาม หากนโยบายของผู้ให้บริการและนโยบายของแพลตฟอร์มใช้ประเภทที่เฉพาะเจาะจง และป้ายกำกับของออบเจ็กต์ที่เฉพาะเจาะจงมีการเปลี่ยนแปลงในนโยบายใดนโยบายหนึ่งเท่านั้น อีกนโยบายหนึ่งอาจมีนโยบายที่ได้รับหรือเสียสิทธิ์เข้าถึงที่เคยใช้ก่อนหน้านี้ ตัวอย่างเช่น สมมติว่า
นโยบายแพลตฟอร์มติดป้ายกำกับโหนด sysfs เป็น sysfs
/sys(/.*)? u:object_r:sysfs:s0
นโยบายผู้ให้บริการให้สิทธิ์เข้าถึง /sys/usb ที่มีป้ายกำกับ
sysfs ดังนี้
allow vendor_init sysfs:chr_file rw_file_perms;
หากมีการเปลี่ยนแปลงนโยบายแพลตฟอร์มเพื่อติดป้ายกำกับ /sys/usb เป็น
sysfs_usb นโยบายของผู้ให้บริการจะยังคงเหมือนเดิม แต่
vendor_init จะสูญเสียสิทธิ์เข้าถึง /sys/usb เนื่องจากไม่มี
นโยบายสำหรับ sysfs_usb ประเภทใหม่
/sys/usb u:object_r:sysfs_usb:s0
Android จึงได้นำเสนอแนวคิดของแอตทริบิวต์ที่มีการกำหนดเวอร์ชันเพื่อแก้ปัญหานี้ ในเวลาคอมไพล์ ระบบบิลด์จะแปลประเภทสาธารณะของแพลตฟอร์มที่ใช้ในนโยบายของผู้ให้บริการเป็นแอตทริบิวต์ที่มีการกำหนดเวอร์ชันเหล่านี้โดยอัตโนมัติ การแปลนี้ เปิดใช้โดยการแมปไฟล์ที่เชื่อมโยงแอตทริบิวต์ที่มีการกำหนดเวอร์ชันกับประเภทสาธารณะอย่างน้อย 1 ประเภทจากแพลตฟอร์ม
เช่น สมมติว่า /sys/usb มีป้ายกำกับเป็น sysfs
ในนโยบายแพลตฟอร์ม 202504 และนโยบายผู้ขาย 202504 ให้สิทธิ์ vendor_init เข้าถึง /sys/usb
ในกรณีดังกล่าว ให้ทำดังนี้
-
นโยบายผู้ให้บริการเขียนกฎ
allow vendor_init sysfs:chr_file rw_file_perms;เนื่องจาก/sys/usbมีป้ายกำกับเป็นsysfsในนโยบายแพลตฟอร์ม 202504 เมื่อระบบบิลด์คอมไพล์ นโยบายของผู้ให้บริการ ระบบจะแปลกฎเป็นallow vendor_init_202504 sysfs_202504:chr_file rw_file_perms;โดยอัตโนมัติ แอตทริบิวต์vendor_init_202504และsysfs_202504สอดคล้องกับประเภทvendor_initและsysfsซึ่งเป็นประเภทที่แพลตฟอร์มกำหนด -
ระบบบิลด์จะสร้างไฟล์การจับคู่ข้อมูลประจำตัว
/system/etc/selinux/mapping/202504.cilเนื่องจากทั้งพาร์ติชันsystemและvendorใช้ เวอร์ชัน202504เดียวกัน ไฟล์การแมปจึงมีการจับคู่ข้อมูลประจำตัว จากtype_202504ไปยังtypeเช่นvendor_init_202504จับคู่กับvendor_initและsysfs_202504จับคู่กับsysfs(typeattributeset sysfs_202504 (sysfs)) (typeattributeset vendor_init_202504 (vendor_init)) ...
เมื่ออัปเกรดเวอร์ชันจาก 202504 เป็น 202604 ระบบจะสร้างไฟล์การแมปใหม่สำหรับพาร์ติชัน 202504
vendor ภายใต้
system/sepolicy/private/compat/202504/202504.cil ซึ่งจะติดตั้งลงใน /system/etc/selinux/mapping/202504.cil สำหรับพาร์ติชัน 202604
หรือใหม่กว่า system ในระยะแรก ไฟล์การแมปนี้จะมี
การแมปข้อมูลประจำตัวตามที่อธิบายไว้ก่อนหน้านี้ หากมีการเพิ่มป้ายกำกับใหม่ sysfs_usb
สำหรับ /sys/usb ลงในนโยบายแพลตฟอร์ม 202604 ระบบจะอัปเดตไฟล์การแมป
เพื่อแมป sysfs_202504 กับ sysfs_usb ดังนี้
(typeattributeset sysfs_202504 (sysfs sysfs_usb)) (typeattributeset vendor_init_202504 (vendor_init)) ...
การอัปเดตนี้จะช่วยให้กฎนโยบายของผู้ให้บริการที่แปลงแล้ว allow
vendor_init_202504 sysfs_202504:chr_file rw_file_perms; สามารถให้สิทธิ์เข้าถึงvendor_initประเภท sysfs_usb ใหม่โดยอัตโนมัติ
หากต้องการรักษาความเข้ากันได้กับพาร์ติชัน vendor รุ่นเก่า เมื่อใดก็ตามที่มีการเพิ่มประเภทสาธารณะใหม่ ประเภทนั้นจะต้องแมปกับแอตทริบิวต์ที่มีการกำหนดเวอร์ชันอย่างน้อย 1 รายการในไฟล์การแมป system/sepolicy/private/compat/ver/ver.cil
หรือแสดงอยู่ใน system/sepolicy/private/compat/ver/ver.ignore.cil
เพื่อระบุว่าไม่มีประเภทที่ตรงกันในเวอร์ชันของผู้ให้บริการก่อนหน้า
การรวมนโยบายแพลตฟอร์ม นโยบายของผู้ให้บริการ และไฟล์การแมป ช่วยให้ระบบอัปเดตได้โดยไม่ต้องอัปเดตนโยบายของผู้ให้บริการ นอกจากนี้ การแปลงเป็นแอตทริบิวต์ที่มีการกำหนดเวอร์ชันจะเกิดขึ้นโดยอัตโนมัติ ดังนั้นนโยบายของผู้ให้บริการจึงไม่จำเป็นต้องดูแลการกำหนดเวอร์ชัน และยังคงใช้ประเภทสาธารณะตามเดิมได้
system_ext public and product public policy
ตั้งแต่ Android 11 เป็นต้นไป system_ext และพาร์ติชัน product
จะได้รับอนุญาตให้ส่งออกประเภทสาธารณะที่กำหนดไปยังพาร์ติชัน vendor
เช่นเดียวกับนโยบายสาธารณะของแพลตฟอร์ม นโยบายของผู้ให้บริการ
จะใช้ประเภทและกฎที่แปลเป็นแอตทริบิวต์ที่มีการควบคุมเวอร์ชันโดยอัตโนมัติ เช่น จาก type เป็น
type_ver โดยที่ ver คือระดับ API ของผู้ให้บริการ
ของพาร์ติชัน vendor
เมื่อพาร์ติชัน system_ext และ product อิงตามแพลตฟอร์มเวอร์ชันเดียวกัน ver ระบบบิลด์จะสร้างไฟล์การแมปฐานไปยัง system_ext/etc/selinux/mapping/ver.cil
และ product/etc/selinux/mapping/ver.cil ซึ่งมี
การแมปข้อมูลประจำตัวจาก type ไปยัง type_ver
นโยบายของผู้ให้บริการสามารถเข้าถึง type ด้วยแอตทริบิวต์ที่มีการควบคุมเวอร์ชัน
type_ver
ในกรณีที่อัปเดตเฉพาะพาร์ติชัน system_ext และ product
เช่น ver เป็น ver+1 (หรือหลังจากนั้น) ในขณะที่พาร์ติชัน vendor ยังคงอยู่ที่ ver นโยบายของผู้ให้บริการอาจสูญเสียสิทธิ์เข้าถึงประเภทของพาร์ติชัน system_ext และ product เพื่อป้องกันการหยุดทำงาน พาร์ติชัน
system_ext และ product ควรมี
ไฟล์การแมปจากประเภทที่เฉพาะเจาะจงไปยังแอตทริบิวต์ type_ver
พาร์ทเนอร์แต่ละรายมีหน้าที่รับผิดชอบในการดูแลไฟล์การแมป
หากรองรับพาร์ติชัน ver vendor ที่มี
ver+1 (หรือใหม่กว่า) system_ext และพาร์ติชัน product
หากต้องการติดตั้งไฟล์การแมปไปยังพาร์ติชัน system_ext และ product
ผู้ติดตั้งใช้งานอุปกรณ์หรือผู้ให้บริการควรทำดังนี้
- คัดลอกไฟล์การแมปฐานที่สร้างขึ้นจากพาร์ติชัน ver
system_extและproductไปยังแผนผังแหล่งที่มา - แก้ไขไฟล์การแมปตามต้องการ
-
ติดตั้งver+1
system_extproduct
ตัวอย่างเช่น สมมติว่าพาร์ติชัน 202504 system_ext มีประเภทสาธารณะ 1 ประเภทชื่อ foo_type จากนั้น
system_ext/etc/selinux/mapping/202504.cil
ในพาร์ติชัน 202504 system_ext จะมีลักษณะดังนี้
(typeattributeset foo_type_202504 (foo_type)) (expandtypeattribute foo_type_202504 true) (typeattribute foo_type_202504)
หากมีการเพิ่ม bar_type ลงใน 202604 system_ext และหาก
bar_type ควรแมปกับ foo_type สำหรับพาร์ติชัน 202504
vendor คุณจะอัปเดต 202504.cil จาก
(typeattributeset foo_type_202504 (foo_type)) เป็น
(typeattributeset foo_type_202504 (foo_type bar_type))
แล้วติดตั้งลงในพาร์ติชัน 202604 system_ext ได้ พาร์ติชัน 202504
vendor จะยังคงเข้าถึง foo_type และ bar_type ของ 202604
system_ext ได้
การเปลี่ยนแปลงแอตทริบิวต์สำหรับ Android 9
อุปกรณ์ที่อัปเกรดเป็น Android 9 จะใช้แอตทริบิวต์ต่อไปนี้ได้ แต่อุปกรณ์ที่เปิดตัวด้วย Android 9 จะใช้ไม่ได้
แอตทริบิวต์ของผู้ละเมิด
Android 9 มีแอตทริบิวต์ที่เกี่ยวข้องกับโดเมนต่อไปนี้
data_between_core_and_vendor_violatorsแอตทริบิวต์สำหรับโดเมนทั้งหมดที่ละเมิดข้อกำหนดในการไม่แชร์ไฟล์ตาม เส้นทางระหว่างvendorกับcoredomainsกระบวนการของแพลตฟอร์มและ ผู้ให้บริการไม่ควรใช้ไฟล์ในดิสก์เพื่อสื่อสาร (ABI ไม่เสถียร) คำแนะนำ- รหัสผู้ให้บริการควรใช้
/data/vendor - ระบบไม่ควรใช้
/data/vendor
- รหัสผู้ให้บริการควรใช้
system_executes_vendor_violators. แอตทริบิวต์ สำหรับโดเมนของระบบทั้งหมด (ยกเว้นinitและshell domains) ที่ละเมิดข้อกำหนดในการไม่เรียกใช้ไบนารีของผู้ให้บริการ การดำเนินการไบนารีของผู้ให้บริการมี API ที่ไม่เสถียร แพลตฟอร์มไม่ควรเรียกใช้ไบนารีของผู้ให้บริการ โดยตรง คำแนะนำ- การขึ้นต่อกันของแพลตฟอร์มดังกล่าวกับไบนารีของผู้ให้บริการต้องอยู่เบื้องหลัง HIDL HAL
หรือ
coredomainsที่ต้องเข้าถึงไบนารีของผู้ให้บริการควรย้ายไปที่พาร์ติชันvendorและหยุดเป็นcoredomain
- การขึ้นต่อกันของแพลตฟอร์มดังกล่าวกับไบนารีของผู้ให้บริการต้องอยู่เบื้องหลัง HIDL HAL
แอตทริบิวต์ที่ไม่น่าเชื่อถือ
แอปที่ไม่น่าเชื่อถือซึ่งโฮสต์โค้ดที่กำหนดเองไม่ควรมีสิทธิ์เข้าถึงบริการ HwBinder ยกเว้นบริการที่ถือว่าปลอดภัยเพียงพอสำหรับการเข้าถึงจากแอปดังกล่าว (ดูบริการที่ปลอดภัยด้านล่าง) สาเหตุหลัก 2 ประการที่ทำให้เกิดกรณีนี้มีดังนี้
- เซิร์ฟเวอร์ HwBinder ไม่ได้ทำการตรวจสอบสิทธิ์ไคลเอ็นต์เนื่องจากปัจจุบัน HIDL ไม่ได้แสดงข้อมูล UID ของผู้โทร แม้ว่า HIDL จะเปิดเผยข้อมูลดังกล่าว แต่บริการ HwBinder จำนวนมาก ทำงานในระดับที่ต่ำกว่าแอป (เช่น HAL) หรือ ต้องไม่ใช้ข้อมูลประจำตัวของแอปเพื่อการให้สิทธิ์ ดังนั้น เพื่อความปลอดภัย สมมติฐานเริ่มต้น คือบริการ HwBinder ทุกบริการจะถือว่าไคลเอ็นต์ทั้งหมดได้รับอนุญาตให้ดำเนินการที่บริการนำเสนอ อย่างเท่าเทียมกัน
- เซิร์ฟเวอร์ HAL (ชุดย่อยของบริการ HwBinder) มีโค้ดที่มีอัตราการเกิดปัญหาด้านความปลอดภัยสูงกว่า
system/coreคอมโพเนนต์และมีสิทธิ์เข้าถึงเลเยอร์ที่ต่ำกว่าของสแต็ก (ลงไปจนถึงฮาร์ดแวร์) จึงเพิ่มโอกาสในการข้ามโมเดลความปลอดภัยของ Android
บริการที่ปลอดภัย
บริการที่ปลอดภัยมีดังนี้
same_process_hwserviceบริการเหล่านี้ (ตามคำจำกัดความ) ทำงานใน กระบวนการของไคลเอ็นต์ จึงมีสิทธิ์เข้าถึงเหมือนกับโดเมนไคลเอ็นต์ที่ กระบวนการทำงานcoredomain_hwserviceบริการเหล่านี้ไม่มีความเสี่ยง ที่เกี่ยวข้องกับเหตุผล #2hal_configstore_ISurfaceFlingerConfigsบริการนี้ออกแบบมาเพื่อใช้กับโดเมนใดก็ได้โดยเฉพาะhal_graphics_allocator_hwserviceการดำเนินการเหล่านี้ยัง มีให้บริการโดยบริการsurfaceflingerBinder ซึ่งแอปได้รับอนุญาต ให้เข้าถึงhal_omx_hwserviceนี่คือ HwBinder เวอร์ชันของmediacodecบริการ Binder ซึ่งแอปได้รับอนุญาตให้เข้าถึงhal_codec2_hwserviceนี่คือเวอร์ชันใหม่กว่าของhal_omx_hwservice
แอตทริบิวต์ที่ใช้ได้
hwservices ที่ไม่ถือว่าปลอดภัยทั้งหมดจะมีแอตทริบิวต์
untrusted_app_visible_hwservice เซิร์ฟเวอร์ HAL ที่เกี่ยวข้องมีแอตทริบิวต์ untrusted_app_visible_halserver อุปกรณ์ที่เปิดตัว
พร้อม Android 9 ต้องไม่ใช้
untrusted แอตทริบิวต์ใดแอตทริบิวต์หนึ่ง
คำแนะนำ
- แอปที่ไม่น่าเชื่อถือควรสื่อสารกับบริการของระบบที่สื่อสารกับ
HAL ของ HIDL ของผู้ให้บริการแทน เช่น แอปสามารถพูดคุยกับ
binderservicedomainจากนั้นmediaserver(ซึ่งเป็นbinderservicedomain) จะพูดคุยกับhal_graphics_allocatorหรือ
- แอปที่ต้องการเข้าถึง
vendorHAL โดยตรงควรมีโดเมน sepolicy ที่กำหนดโดยผู้ให้บริการของตนเอง
การทดสอบแอตทริบิวต์ไฟล์
Android 9 มีการทดสอบเวลาบิลด์ที่ช่วยให้มั่นใจว่าไฟล์ทั้งหมดในตำแหน่งที่เฉพาะเจาะจง
มีแอตทริบิวต์ที่เหมาะสม (เช่น ไฟล์ทั้งหมดใน
sysfs มีแอตทริบิวต์ sysfs_type ที่จำเป็น)
การติดป้ายกำกับบริบท SELinux
เพื่อรองรับความแตกต่างระหว่าง sepolicy ของแพลตฟอร์มและของผู้ให้บริการ ระบบจะสร้างไฟล์บริบท SELinux ในลักษณะที่แตกต่างกันเพื่อให้แยกกัน
บริบทของไฟล์
Android 8.0 ได้นำการเปลี่ยนแปลงต่อไปนี้มาใช้กับ file_contexts
- เพื่อหลีกเลี่ยงค่าใช้จ่ายในการคอมไพล์เพิ่มเติมในอุปกรณ์ระหว่างการบูต
file_contextsจะไม่มีอยู่ในรูปแบบไบนารี แต่จะเป็นไฟล์ข้อความนิพจน์ทั่วไปที่อ่านได้ เช่น{property, service}_contexts(เช่นเดียวกับในเวอร์ชันก่อน 7.0) file_contextsจะแยกออกเป็น 2 ไฟล์ ดังนี้plat_file_contexts- แพลตฟอร์ม Android
file_contextที่ไม่มีป้ายกำกับเฉพาะอุปกรณ์ ยกเว้นการติดป้ายกำกับส่วนของพาร์ติชัน/vendorที่ต้องติดป้ายกำกับอย่างถูกต้องเพื่อให้ไฟล์ sepolicy ทำงานได้อย่างเหมาะสม - ต้องอยู่ในพาร์ติชัน
systemที่/system/etc/selinux/plat_file_contextsในอุปกรณ์และ โหลดโดยinitเมื่อเริ่มต้นพร้อมกับfile_contextของผู้ให้บริการ
- แพลตฟอร์ม Android
vendor_file_contextsfile_contextเฉพาะอุปกรณ์ที่สร้างขึ้นโดยการรวมfile_contextsที่พบในไดเรกทอรีที่ระบุโดยBOARD_SEPOLICY_DIRSในไฟล์Boardconfig.mkของอุปกรณ์- ต้องติดตั้งที่
/vendor/etc/selinux/vendor_file_contextsในพาร์ติชันvendorและโหลดโดยinitที่จุดเริ่มต้นพร้อมกับแพลตฟอร์มfile_context
บริบทของพร็อพเพอร์ตี้
ใน Android 8.0 property_contexts จะแยกออกเป็น 2 ไฟล์ดังนี้
plat_property_contexts- แพลตฟอร์ม Android
property_contextที่ไม่มีป้ายกำกับเฉพาะอุปกรณ์ - ต้องอยู่ในพาร์ติชัน
systemที่/system/etc/selinux/plat_property_contextsและโหลดโดยinitเมื่อเริ่มต้นพร้อมกับproperty_contextsของผู้ให้บริการ
- แพลตฟอร์ม Android
vendor_property_contextsproperty_contextเฉพาะอุปกรณ์ที่สร้างขึ้นโดยการรวมproperty_contextsที่พบในไดเรกทอรีที่ระบุโดยBOARD_SEPOLICY_DIRSในBoardconfig.mkของอุปกรณ์- ต้องอยู่ในพาร์ติชัน
vendorที่/vendor/etc/selinux/vendor_property_contextsและต้อง โหลดโดยinitเมื่อเริ่มต้นพร้อมกับแพลตฟอร์มproperty_context
บริบทของบริการ
ใน Android 8.0 service_contexts จะแยกเป็นไฟล์ต่อไปนี้
plat_service_contextsservice_contextสำหรับservicemanagerโดยเฉพาะแพลตฟอร์ม Androidservice_contextไม่มีป้ายกำกับเฉพาะอุปกรณ์- ต้องอยู่ในพาร์ติชัน
systemที่/system/etc/selinux/plat_service_contextsและโหลดโดยservicemanagerที่จุดเริ่มต้นพร้อมกับservice_contextsของผู้ให้บริการ
vendor_service_contextsservice_contextเฉพาะอุปกรณ์ที่สร้างขึ้นโดยการรวมservice_contextsที่พบในไดเรกทอรีที่ระบุโดยBOARD_SEPOLICY_DIRSในBoardconfig.mkของอุปกรณ์- ต้องอยู่ในพาร์ติชัน
vendorที่/vendor/etc/selinux/vendor_service_contextsและโหลดโดยservicemanagerเมื่อเริ่มต้นพร้อมกับแพลตฟอร์มservice_contexts - แม้ว่า
servicemanagerจะค้นหาไฟล์นี้ในเวลาที่เปิดเครื่อง แต่สำหรับอุปกรณ์TREBLEที่เป็นไปตามข้อกำหนดอย่างสมบูรณ์vendor_service_contextsจะต้องไม่มีอยู่ เนื่องจาก การโต้ตอบทั้งหมดระหว่างvendorกับsystemต้องผ่านhwservicemanager/hwbinder
plat_hwservice_contexts- แพลตฟอร์ม Android
hwservice_contextสำหรับhwservicemanagerที่ไม่มีป้ายกำกับเฉพาะอุปกรณ์ - ต้องอยู่ในพาร์ติชัน
systemที่/system/etc/selinux/plat_hwservice_contextsและโหลดโดยhwservicemanagerที่จุดเริ่มต้นพร้อมกับvendor_hwservice_contexts
- แพลตฟอร์ม Android
vendor_hwservice_contextshwservice_contextเฉพาะอุปกรณ์ที่สร้างขึ้นโดยการรวมhwservice_contextsที่พบในไดเรกทอรีที่ระบุโดยBOARD_SEPOLICY_DIRSในBoardconfig.mkของอุปกรณ์- ต้องอยู่ในพาร์ติชัน
vendorที่/vendor/etc/selinux/vendor_hwservice_contextsและต้อง โหลดโดยhwservicemanagerที่จุดเริ่มต้นพร้อมกับplat_service_contexts
vndservice_contextsservice_contextเฉพาะอุปกรณ์สำหรับvndservicemanagerที่สร้างขึ้นโดยการรวมvndservice_contextsที่อยู่ในไดเรกทอรีที่ระบุโดยBOARD_SEPOLICY_DIRSในBoardconfig.mkของอุปกรณ์- ไฟล์นี้ต้องอยู่ในพาร์ติชัน
vendorที่/vendor/etc/selinux/vndservice_contextsและโหลดโดยvndservicemanagerเมื่อเริ่มต้น
บริบท Seapp
ใน Android 8.0 seapp_contexts จะแยกออกเป็น 2 ไฟล์ดังนี้
plat_seapp_contexts- แพลตฟอร์ม Android
seapp_contextที่ไม่มีการเปลี่ยนแปลง เฉพาะอุปกรณ์ - ต้องอยู่ในพาร์ติชัน
systemที่/system/etc/selinux/plat_seapp_contexts.
- แพลตฟอร์ม Android
vendor_seapp_contexts- ส่วนขยายเฉพาะอุปกรณ์สำหรับแพลตฟอร์ม
seapp_contextที่สร้างขึ้น โดยการรวมseapp_contextsที่พบในไดเรกทอรี ซึ่งBOARD_SEPOLICY_DIRSชี้ไปยังในไฟล์Boardconfig.mkของอุปกรณ์ - ต้องอยู่ในพาร์ติชัน
vendorที่/vendor/etc/selinux/vendor_seapp_contexts
- ส่วนขยายเฉพาะอุปกรณ์สำหรับแพลตฟอร์ม
สิทธิ์ MAC
ใน Android 8.0 mac_permissions.xml จะแยกออกเป็น 2 ไฟล์ดังนี้
- แพลตฟอร์ม
mac_permissions.xml- แพลตฟอร์ม Android
mac_permissions.xmlที่ไม่มี การเปลี่ยนแปลงเฉพาะอุปกรณ์ - ต้องอยู่ในพาร์ติชัน
systemที่/system/etc/selinux/.
- แพลตฟอร์ม Android
- นอกแพลตฟอร์ม
mac_permissions.xml- ส่วนขยายเฉพาะอุปกรณ์ไปยังแพลตฟอร์ม
mac_permissions.xmlสร้างจากmac_permissions.xmlพบในไดเรกทอรีที่ระบุโดยBOARD_SEPOLICY_DIRSในBoardconfig.mkของอุปกรณ์ - ต้องอยู่ในพาร์ติชัน
vendorที่/vendor/etc/selinux/.
- ส่วนขยายเฉพาะอุปกรณ์ไปยังแพลตฟอร์ม