Security-Enhanced Linux trong Android

Là một phần của mô hình bảo mật Android, Android sử dụng Security-Enhanced Linux (SELinux) để thực thi tính năng kiểm soát quyền truy cập bắt buộc (MAC) trên tất cả các quy trình, ngay cả các quy trình chạy bằng đặc quyền gốc/quản trị viên (các tính năng của Linux). Nhiều công ty và tổ chức đã đóng góp vào việc triển khai SELinux của Android. Với SELinux, Android có thể bảo vệ và giới hạn các dịch vụ hệ thống tốt hơn, kiểm soát quyền truy cập vào dữ liệu ứng dụng và nhật ký hệ thống, giảm tác động của phần mềm độc hại và bảo vệ người dùng khỏi các lỗi tiềm ẩn trong mã trên thiết bị di động.

SELinux hoạt động theo nguyên tắc từ chối mặc định: Mọi thứ không được cho phép rõ ràng đều bị từ chối. SELinux có thể hoạt động ở hai chế độ chung:

  • Chế độ Cho phép, trong đó các trường hợp từ chối cấp quyền sẽ được ghi lại nhưng không được thực thi.
  • Chế độ Thực thi, trong đó các trường hợp từ chối cấp quyền đều được ghi lại thực thi.

Android bao gồm SELinux ở chế độ thực thi và một chính sách bảo mật tương ứng hoạt động theo mặc định trên AOSP. Ở chế độ thực thi, các hành động không được phép sẽ bị ngăn chặn và tất cả các hành vi vi phạm được cố gắng thực hiện sẽ được kernel ghi lại vào dmesglogcat. Khi phát triển, bạn nên sử dụng các lỗi này để tinh chỉnh phần mềm và chính sách SELinux trước khi thực thi. Để biết thêm thông tin, hãy xem phần Triển khai SELinux.

SELinux cũng hỗ trợ chế độ cho phép theo miền, trong đó các miền (quy trình) cụ thể có thể được đặt ở chế độ cho phép trong khi đặt phần còn lại của hệ thống ở chế độ thực thi toàn cục. Miền chỉ là một nhãn xác định một quy trình hoặc một nhóm quy trình trong chính sách bảo mật, trong đó tất cả các quy trình được gắn nhãn bằng cùng một miền đều được chính sách bảo mật xử lý giống nhau. Chế độ cho phép theo miền cho phép áp dụng SELinux một cách gia tăng cho một phần ngày càng tăng của hệ thống và phát triển chính sách cho các dịch vụ mới (trong khi vẫn duy trì việc thực thi phần còn lại của hệ thống).

Thông tin khái quát

Mô hình bảo mật của Android một phần dựa trên khái niệm hộp cát ứng dụng. Mỗi ứng dụng chạy trong hộp cát riêng. Trước Android 4.3, các hộp cát này được xác định bằng cách tạo một UID Linux duy nhất cho mỗi ứng dụng tại thời điểm cài đặt. Android 4.3 trở lên sử dụng SELinux để xác định thêm ranh giới của hộp cát ứng dụng Android.

Trong Android 5.0 trở lên, SELinux được thực thi đầy đủ, dựa trên bản phát hành cho phép của Android 4.3 và việc thực thi một phần của Android 4.4. Với thay đổi này, Android đã chuyển từ việc thực thi trên một số miền quan trọng (installd, netd, voldzygote) sang mọi miền (hơn 60 miền). Cụ thể:

  • Mọi thứ đều ở chế độ thực thi trong Android 5.x trở lên.
  • Không có quy trình nào khác ngoài init được chạy trong miền init.
  • Mọi trường hợp từ chối chung (đối với block_device, socket_device, default_service) đều cho biết thiết bị cần có một miền đặc biệt.

Android 6.0 đã tăng cường bảo mật hệ thống bằng cách giảm mức độ cho phép của chính sách để tăng cường khả năng tách biệt giữa người dùng, lọc IOCTL, giảm mối đe doạ của các dịch vụ bị lộ, thắt chặt hơn các miền SELinux và hạn chế tối đa quyền truy cập /proc.

Android 7.0 đã cập nhật cấu hình SELinux để khoá chặt hơn hộp cát ứng dụng và giảm bề mặt tấn công. Bản phát hành này cũng chia ngăn xếp mediaserver nguyên khối thành các quy trình nhỏ hơn để giảm phạm vi của các quyền. Để biết thêm thông tin, hãy xem phần Bảo vệ Android bằng các biện pháp bảo vệ hạt nhân Linux khácCủng cố ngăn xếp nội dung nghe nhìn.

Android 8.0 đã cập nhật SELinux để hoạt động với Treble, giúp tách mã nhà cung cấp cấp thấp khỏi khung hệ thống Android. Bản phát hành này đã cập nhật chính sách SELinux để cho phép nhà sản xuất thiết bị và nhà cung cấp SOC cập nhật các phần của chính sách, tạo hình ảnh (vendor.img, boot.img, v.v.), sau đó cập nhật các hình ảnh đó độc lập với nền tảng hoặc ngược lại.

Mặc dù có thể chạy phiên bản nền tảng (khung) cao hơn/mới hơn trên thiết bị, nhưng trường hợp ngược lại thì không được hỗ trợ; hình ảnh của nhà cung cấp (vendor.img/odm.img) không được có phiên bản mới hơn nền tảng (system.img). Vì vậy, phiên bản nền tảng mới hơn có thể gây ra các vấn đề về khả năng tương thích với SELinux vì chính sách SELinux của nền tảng ở phiên bản mới hơn các phần SELinux của nhà cung cấp trong chính sách. Mô hình Android 8.0 cung cấp một phương thức để duy trì khả năng tương thích nhằm ngăn chặn các bản cập nhật OTA đồng thời không cần thiết.

Tài nguyên khác

Để được trợ giúp xây dựng các chính sách SELinux hữu ích, hãy tham khảo các tài nguyên sau.