SELinux được thiết lập thành mặc định từ chối, nghĩa là mọi lượt truy cập đơn lẻ cho việc tác vụ có nội dung hấp dẫn trong nhân phải được chính sách cho phép rõ ràng. Chiến dịch này có nghĩa là tệp chính sách bao gồm một lượng lớn thông tin về quy tắc, loại, lớp, quyền, v.v. Cân nhắc đầy đủ về SELinux nằm ngoài phạm vi của tài liệu này, nhưng không hiểu được cách viết quy tắc chính sách hiện là cần thiết khi hiển thị thiết bị Android mới. Có một đã có rất nhiều thông tin về SELinux. Xem phần Hỗ trợ để biết các tài nguyên được đề xuất.
Tệp khoá
Để bật SELinux, hãy tích hợp mới nhất Android kernel, rồi kết hợp các tệp có trong hệ thống/chính sách thư mục. Khi được biên dịch, những tệp đó bao gồm biện pháp bảo mật hạt nhân SELinux và bao gồm hệ điều hành Android ngược dòng.
Nhìn chung, bạn không nên sửa đổi các tệp system/sepolicy
trực tiếp. Thay vào đó, hãy thêm hoặc chỉnh sửa các tệp chính sách dành riêng cho thiết bị của bạn trong
/device/manufacturer/device-name/sepolicy
thư mục. Trong Android 8.0 trở lên, những thay đổi bạn thực hiện đối với các tệp này sẽ
chỉ ảnh hưởng đến chính sách trong thư mục nhà cung cấp của bạn. Để biết thêm chi tiết về việc phân tách
sepolicy công khai trong Android 8.0 trở lên, hãy xem
Tuỳ chỉnh SEPolicy trong Android
8.0 trở lên. Bất kể phiên bản Android, bạn vẫn đang sửa đổi các tệp sau:
Tệp chính sách
Những tệp kết thúc bằng *.te
là tệp nguồn của chính sách SELinux mà
xác định tên miền và nhãn của chúng. Bạn có thể cần tạo các tệp chính sách mới trong
/device/manufacturer/device-name/sepolicy
,
nhưng bạn nên cố gắng cập nhật các tệp hiện có nếu có thể.
Tệp ngữ cảnh
Tệp ngữ cảnh là nơi bạn chỉ định nhãn cho các đối tượng của mình.
file_contexts
gán nhãn cho các tệp và được nhiều người khác nhau sử dụng không gian người dùng. Khi bạn tạo chính sách mới, hãy tạo hoặc cập nhật tệp này để chỉ định nhãn mới cho tệp. Cách áp dụngfile_contexts
mới: tạo lại hình ảnh hệ thống tệp hoặc chạyrestorecon
trên tệp để sẽ được gắn nhãn lại. Khi nâng cấp, các thay đổi đối vớifile_contexts
sẽ tự động được áp dụng cho các phân vùng dữ liệu người dùng và hệ thống như một phần của nâng cấp. Các thay đổi cũng có thể tự động được áp dụng khi nâng cấp lên bằng cách thêmrestorecon_recursive
lệnh gọi vào init.board.rc sau khi phân vùng đã được gắn kết đọc-ghi.genfs_contexts
chỉ định nhãn cho các hệ thống tệp, chẳng hạn nhưproc
hoặcvfat
không hỗ trợ gói mở rộng . Cấu hình này được tải như một phần của chính sách nhân hệ điều hành nhưng các thay đổi có thể không có hiệu lực đối với các nút trong lõi, đòi hỏi phải khởi động lại hoặc ngắt kết nối và kết nối lại hệ thống tệp để áp dụng đầy đủ thay đổi. Bạn cũng có thể gán các nhãn cụ thể cho các giá đỡ cụ thể, chẳng hạn nhưvfat
bằng cách sử dụng tuỳ chọncontext=mount
.property_contexts
chỉ định nhãn cho các thuộc tính hệ thống của Android kiểm soát những quy trình có thể thiết lập các quy trình đó. Cấu hình này được đọc bằng Quá trìnhinit
trong khi khởi động.service_contexts
chỉ định nhãn cho các dịch vụ liên kết của Android kiểm soát những quy trình có thể thêm (đăng ký) và tìm (tra cứu) một liên kết cho dịch vụ. Cấu hình này được đọc bằng Quá trìnhservicemanager
trong khi khởi động.seapp_contexts
chỉ định nhãn cho các quy trình của ứng dụng và/data/data
thư mục. Cấu hình này được đọc bằng Quy trìnhzygote
trong mỗi lần khởi chạy ứng dụng và muộn nhất vào ngàyinstalld
trong khi khởi động.mac_permissions.xml
chỉ định một thẻseinfo
cho các ứng dụng dựa trên chữ ký và tên gói (không bắt buộc). Chiến lược phát hành đĩa đơn Sau đó, bạn có thể dùng thẻseinfo
làm khoá trongseapp_contexts
để chỉ định một nhãn cụ thể cho tất cả ứng dụng thẻseinfo
đó. Người đọc cấu hình nàysystem_server
trong khi khởi động.keystore2_key_contexts
chỉ định nhãn cho các không gian tên Kho khoá 2.0. Không gian tên này được thực thi bằng trình nền kho khoá2. Kho khoá luôn không gian tên dựa trên UID/AID được cung cấp. Kho khoá 2.0 thực thi thêm sepolicy không gian tên đã xác định. Nội dung mô tả chi tiết về định dạng và quy ước của chính sách này tại đây.
Tệp makefile BoardConfig.mk
Sau khi chỉnh sửa hoặc thêm tệp chính sách và ngữ cảnh, hãy cập nhật
/device/manufacturer/device-name/BoardConfig.mk
makefile để tham chiếu đến thư mục con sepolicy
và từng tệp chính sách mới.
Để biết thêm thông tin về các biến BOARD_SEPOLICY
, hãy xem
system/sepolicy/README
.
BOARD_SEPOLICY_DIRS += \ <root>/device/manufacturer/device-name/sepolicy BOARD_SEPOLICY_UNION += \ genfs_contexts \ file_contexts \ sepolicy.te
Sau khi tạo lại, thiết bị của bạn sẽ được bật SELinux. Giờ đây, bạn có thể tuỳ chỉnh các chính sách SELinux cho phù hợp với các bổ sung của riêng bạn vào Hệ điều hành Android như mô tả trong Tuỳ chỉnh hoặc xác minh chế độ thiết lập hiện tại như được đề cập trong Xác thực.
Khi có các tệp chính sách mới và nội dung cập nhật BoardConfig.mk, cài đặt chính sách được tự động tích hợp vào tệp chính sách nhân hệ điều hành cuối cùng. Để biết thêm thông tin về cách xây dựng sepolicy trên thiết bị, hãy xem Xây dựng sepolicy.
Triển khai
Để bắt đầu sử dụng SELinux:
- Bật SELinux trong nhân:
CONFIG_SECURITY_SELINUX=y
- Hãy thay đổi tham số kernel_cmdline hoặc bootconfig để:
BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
hoặcBOARD_BOOTCONFIG := androidboot.selinux=permissive
Việc này chỉ dành cho quá trình phát triển ban đầu của chính sách cho thiết bị. Sau khi có chính sách tự khởi động ban đầu, hãy xóa tham số này để thiết bị đang thực thi hoặc sẽ không vượt qua CTS. - Khởi động hệ thống một cách thoải mái và xem gặp phải tình trạng từ chối nào khi khởi động:
Trên Ubuntu 14.04 trở lên:adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy
Trên Ubuntu 12.04:adb pull /sys/fs/selinux/policy adb logcat -b all | audit2allow -p policy
- Đánh giá kết quả để tìm các cảnh báo tương tự như
init: Warning! Service name needs a SELinux domain defined; please fix!
Xem Xác thực để xem hướng dẫn và công cụ. - Xác định thiết bị và các tệp mới khác cần gắn nhãn.
- Sử dụng các nhãn hiện có hoặc nhãn mới cho đối tượng của bạn. Hãy xem
*_contexts
tệp để xem cách các mục đã được gắn nhãn trước đó và sử dụng kiến thức về ý nghĩa của nhãn để gán một nhãn mới. Tốt nhất là bạn nên đây sẽ là một nhãn hiện có phù hợp với chính sách, nhưng đôi khi bạn sẽ cần một nhãn mới và các quy tắc cấp quyền truy cập vào nhãn đó sẽ cần thiết. Thêm nhãn vào các tệp ngữ cảnh thích hợp. - Xác định những miền/quy trình cần có miền bảo mật riêng.
Có thể bạn sẽ cần phải viết một chính sách hoàn toàn mới cho mỗi loại. Tất cả
ví dụ: dịch vụ được tạo từ
init
sẽ có của bạn. Các lệnh sau đây giúp hiển thị những lệnh vẫn đang chạy (nhưng TẤT CẢ các dịch vụ đều cần được đối xử như vậy):
adb shell su -c ps -Z | grep init
adb shell su -c dmesg | grep 'avc: '
- Xem lại
init.device.rc
để xác định bất kỳ miền nào không có loại miền. Cung cấp cho họ một miền sớm trong để tránh việc thêm quy tắc vàoinit
hoặc nếu không nhầm lẫn giữa truy cậpinit
với những truy cập nằm trong chính sách của riêng bạn. - Thiết lập
BOARD_CONFIG.mk
để sử dụngBOARD_SEPOLICY_*
biến. Xem ĐỌC trongsystem/sepolicy
để biết chi tiết về cách thiết lập tính năng này. - Kiểm tra tệp init.device.rc và fstab.device và
hãy đảm bảo mọi lần sử dụng
mount
đều tương ứng với có nhãn hệ thống tệp hoặc tuỳ chọncontext= mount
là đã chỉ định. - Xem xét từng lần từ chối và tạo chính sách SELinux để xử lý từng từ chối đúng cách. Xem các ví dụ trong bài viết Tuỳ chỉnh.
Bạn nên bắt đầu với các chính sách trong AOSP, rồi xây dựng dựa trên các chính sách đó cho các lựa chọn tuỳ chỉnh của riêng bạn. Để biết thêm thông tin về chiến lược chính sách và xem xét kỹ hơn một số bước này, xem Viết chính sách SELinux.
Trường hợp sử dụng
Sau đây là ví dụ cụ thể về những chỗ khai thác cần xem xét khi tự tạo phần mềm và các chính sách SELinux được liên kết:
Đường liên kết tượng trưng – Do các đường liên kết tượng trưng xuất hiện dưới dạng tệp, nên chúng thường
đọc dưới dạng tệp, do đó có thể dẫn đến việc khai thác. Ví dụ: một số đặc quyền
thành phần, chẳng hạn như init
, thay đổi quyền của một số tệp nhất định,
đôi khi quá cởi mở.
Sau đó, kẻ tấn công có thể thay thế các tệp đó bằng các đường liên kết tượng trưng để mã hoá mà chúng kiểm soát. cho phép kẻ tấn công ghi đè các tệp tuỳ ý. Nhưng nếu bạn biết ứng dụng sẽ không bao giờ truyền tải đường liên kết tượng trưng, bạn có thể cấm ứng dụng làm như vậy bằng SELinux.
Tệp hệ thống – Xem xét loại tệp hệ thống
chỉ được máy chủ hệ thống sửa đổi. Tuy nhiên, kể từ netd
,
init
và vold
chạy dưới dạng thư mục gốc, nên có thể truy cập
các tệp hệ thống đó. Vì vậy, nếu netd
bị xâm nhập, tính năng này có thể
xâm phạm các tệp đó và có thể là chính máy chủ hệ thống.
Với SELinux, bạn có thể xác định những tệp đó là tệp dữ liệu máy chủ hệ thống.
Do đó, miền duy nhất có quyền đọc/ghi các API này là máy chủ hệ thống.
Ngay cả khi netd
bị xâm nhập, ứng dụng này cũng không thể chuyển miền sang
miền máy chủ hệ thống và truy cập vào các tệp hệ thống đó mặc dù tệp này chạy dưới dạng thư mục gốc.
Dữ liệu ứng dụng – Một ví dụ khác là lớp hàm phải chạy dưới dạng thư mục gốc nhưng không truy cập được vào dữ liệu ứng dụng. Điều này vô cùng hữu ích vì có thể đưa ra được câu nhận định trên phạm vi rộng, chẳng hạn như một số miền không liên quan vào dữ liệu ứng dụng bị cấm truy cập Internet.
setattr – Đối với các lệnh như chmod
và
chown
, bạn có thể xác định tập hợp các tệp mà trong đó
có thể tiến hành setattr
. Những việc nằm ngoài phạm vi đó có thể
bị cấm đối với những thay đổi này, thậm chí cả thư mục gốc. Vì vậy, ứng dụng có thể chạy
chmod
và chown
so với các mục có nhãn
app_data_files
nhưng không phải shell_data_files
hoặc system_data_files
.