Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Triển khai SELinux

SELinux được thiết lập để từ chối mặc định, có nghĩa là mọi truy cập đơn lẻ mà nó có hook trong nhân phải được chính sách cho phép một cách rõ ràng. Điều này có nghĩa là một tệp chính sách bao gồm một lượng lớn thông tin liên quan đến các quy tắc, loại, lớp, quyền và hơn thế nữa. Việc xem xét đầy đủ về SELinux không nằm ngoài phạm vi của tài liệu này, nhưng hiểu biết về cách viết các quy tắc chính sách giờ đây là điều cần thiết khi mang đến các thiết bị Android mới. Đã có rất nhiều thông tin về SELinux. Xem Tài liệu hỗ trợ để biết các tài nguyên được đề xuất.

Tệp chính

Để kích hoạt SELinux, hãy tích hợp nhân Android mới nhất và sau đó kết hợp các tệp được tìm thấy trong thư mục system / sepolicy . Khi được biên dịch, các tệp đó bao gồm chính sách bảo mật nhân SELinux và bao gồm hệ điều hành Android ngược dòng.

Nói chung, bạn không nên sửa đổi trực tiếp các tệp system/sepolicy tệp riêng biệt. 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 thư mục /device/ manufacturer / device-name /sepolicy . 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ề cách tách riêng biệt công khai trong Android 8.0 trở lên, hãy xem Tùy chỉnh SEPolicy trong Android 8.0+ . Bất kể phiên bản Android nào, bạn vẫn đang sửa đổi các tệp này:

Tệp chính sách

Các tệp kết thúc bằng *.te là các tệp nguồn chính sách SELinux, các tệp này xác định các 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

Các 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 tệp và được sử dụng bởi các thành phần không gian người dùng khác nhau. Khi bạn tạo các chính sách mới, hãy tạo hoặc cập nhật tệp này để gán nhãn mới cho tệp. Để áp dụng file_contexts mới, hãy xây dựng lại hình ảnh hệ thống tệp hoặc chạy restorecon trên tệp sẽ được gắn nhãn lại. Khi nâng cấp, các thay đổi đối với file_contexts sẽ tự động được áp dụng cho hệ thống và phân vùng dữ liệu người dùng như một phần của quá trình nâng cấp. Các thay đổi cũng có thể được áp dụng tự động khi nâng cấp lên các phân vùng khác bằng cách thêm lệnh gọi restorecon_recursive vào init của bạn. tập tin .rc board sau khi phân vùng đã được gắn kết đọc-ghi.
  • genfs_contexts gán nhãn cho hệ thống tệp, chẳng hạn như proc hoặc vfat không hỗ trợ các thuộc tính mở rộng. Cấu hình này được tải như một phần của chính sách hạt nhân nhưng các thay đổi có thể không có hiệu lực đối với các inode trong lõi, yêu cầu khởi động lại hoặc ngắt kết nối và gắn lại hệ thống tệp để áp dụng đầy đủ thay đổi. Các nhãn cụ thể cũng có thể được gán cho các gắn kết cụ thể, chẳng hạn như vfat bằng cách sử dụng tùy chọn context=mount .
  • property_contexts gán nhãn cho các thuộc tính hệ thống Android để kiểm soát những quy trình nào có thể đặt chúng. Cấu hình này được đọc bởi quá trình init trong khi khởi động.
  • service_contexts gán nhãn cho các dịch vụ chất kết dính Android để kiểm soát những quy trình nào có thể thêm (đăng ký) và tìm (tra cứu) tham chiếu chất kết dính cho dịch vụ. Cấu hình này được đọc bởi quá trình quản lý dịch servicemanager trong khi khởi động.
  • seapp_contexts gán nhãn cho các quy trình ứng dụng và /data/data thư mục dữ liệu. Cấu hình này được đọc bởi quy trình zygote trên mỗi lần khởi chạy ứng dụng và bởi installd 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ý của chúng và tùy chọn tên gói của chúng. Sau đó, thẻ seinfo có thể được sử dụng làm khóa trong tệp seapp_contexts để gán một nhãn cụ thể cho tất cả các ứng dụng có thẻ seinfo đó. Cấu hình này được đọc bởi system_server trong khi khởi động.
  • keystore2_key_contexts gán nhãn cho không gian tên Keystore 2.0. Không gian tên này được thực thi bởi daemon keystore2. Keystore luôn cung cấp không gian tên dựa trên UID / AID. Keystore 2.0 bổ sung thực thi các không gian tên được xác định riêng. Bạn có thể tìm thấy mô tả chi tiết về định dạng và quy ước của tệp này tại đây .

BoardConfig.mk makefile

Sau khi chỉnh sửa hoặc thêm tệp ngữ cảnh và chính sách, hãy cập nhật trang /device/ manufacturer / device-name /BoardConfig.mk sepolicy bạn để tham chiếu đến thư mục con riêng biệt 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 xây dựng lại, thiết bị của bạn được kích hoạt SELinux. Giờ đây, bạn có thể tùy chỉnh các chính sách SELinux của mình để phù hợp với các bổ sung của riêng bạn vào hệ điều hành Android như được mô tả trong Tùy chỉnh hoặc xác minh thiết lập hiện có của bạn như được đề cập trong Xác thực .

Khi các tệp chính sách mới và các bản cập nhật BoardConfig.mk có sẵn, các cài đặt chính sách mới sẽ tự động được tích hợp vào tệp chính sách hạt nhân cuối cùng. Để biết thêm thông tin về cách sepolicy được xây dựng trên thiết bị, hãy xem mục Building sepolicy .

Thực hiện

Để bắt đầu với SELinux:

  1. Bật SELinux trong nhân: CONFIG_SECURITY_SELINUX=y
  2. Thay đổi tham số kernel_cmdline hoặc bootconfig thành:
    BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
    hoặc
    BOARD_BOOTCONFIG := androidboot.selinux=permissive
    Điều này chỉ dành cho sự phát triển ban đầu của chính sách cho thiết bị. Sau khi bạn có chính sách bootstrap ban đầu, hãy xóa tham số này để thiết bị của bạn được thực thi, nếu không thiết bị sẽ bị lỗi CTS.
  3. Khởi động hệ thống một cách dễ dàng và xem những gì từ chối gặp phải khi khởi động:
    Trên Ubuntu 14.04 hoặc mới hơ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
    
  4. Đánh giá kết quả đầu ra cho các cảnh báo giống với init: Warning! Service name needs a SELinux domain defined; please fix! Xem Xác thực để biết hướng dẫn và công cụ.
  5. Xác định thiết bị và các tệp mới khác cần gắn nhãn.
  6. Sử dụng các nhãn hiện có hoặc nhãn mới cho các đối tượng của bạn. Xem các tệp *_contexts để biết cách mọi thứ đã được gắn nhãn trước đó và sử dụng kiến ​​thức về ý nghĩa nhãn để gán một nhãn mới. Lý tưởng nhất, đây sẽ là một nhãn hiện có sẽ phù hợp với chính sách, nhưng đôi khi sẽ cần một nhãn mới và cần có các quy tắc để truy cập vào nhãn đó. Thêm nhãn của bạn vào các tệp ngữ cảnh thích hợp.
  7. Xác định các miền / quy trình cần có miền bảo mật riêng. Bạn có thể sẽ cần phải viết một chính sách hoàn toàn mới cho mỗi chính sách. Ví dụ, tất cả các dịch vụ được tạo ra từ init , nên có của riêng chúng. Các lệnh sau đây giúp tiết lộ những lệnh vẫn chạy (nhưng TẤT CẢ các dịch vụ cần được xử lý như vậy):
    adb shell su -c ps -Z | grep init
    
    adb shell su -c dmesg | grep 'avc: '
    
  8. Đánh giá 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 quá trình phát triển của bạn để tránh thêm các quy tắc vào init hoặc gây nhầm lẫn giữa các quyền truy cập init với các quyền truy cập nằm trong chính sách của riêng họ.
  9. Thiết lập BOARD_CONFIG.mk để sử dụng các biến BOARD_SEPOLICY_* . Xem README trong system/sepolicy để biết chi tiết về cách thiết lập.
  10. Kiểm tra init. device .rc và fstab. tệp device và đảm bảo rằng mọi lần sử dụng mount đều tương ứng với hệ thống tệp được gắn nhãn đúng cách hoặc tùy chọn context= mount được chỉ định.
  11. Đi qua từng từ chối và tạo chính sách SELinux để xử lý đúng từng việc. Xem các ví dụ trong Tùy chỉnh .

Bạn nên bắt đầu với các chính sách trong AOSP và sau đó xây dựng dựa trên chúng cho các tùy 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, hãy xem Viết Chính sách SELinux .

Trường hợp sử dụng

Dưới đây là các ví dụ cụ thể về các cách khai thác cần xem xét khi tạo phần mềm của riêng bạn và các chính sách SELinux liên quan:

Liên kết tượng trưng - Bởi vì các liên kết tượng trưng xuất hiện dưới dạng tệp, chúng thường được đọc dưới dạng tệp, điều này có thể dẫn đến việc khai thác. Ví dụ, một số thành phần đặc quyền, chẳng hạn như init , thay đổi quyền của một số tệp nhất định, đôi khi bị mở quá mức.

Những kẻ tấn công sau đó có thể thay thế các tệp đó bằng các liên kết tượng trưng để mã hóa chúng kiểm soát, cho phép kẻ tấn công ghi đè các tệp tùy ý. Nhưng nếu bạn biết ứng dụng của mình sẽ không bao giờ duyệt qua một liên kết biểu tượng, bạn có thể cấm nó làm như vậy với SELinux.

Tệp hệ thống - Xem xét loại tệp hệ thống chỉ nên được sửa đổi bởi máy chủ hệ thống. Tuy nhiên, vì netd , initvold chạy dưới dạng root nên chúng có thể truy cập các tệp hệ thống đó. Vì vậy, nếu netd bị xâm nhập, nó có thể làm tổn hại 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 các 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 đối với chúng là máy chủ hệ thống. Ngay cả khi netd bị xâm nhập, nó không thể chuyển miền sang miền máy chủ hệ thống và truy cập các tệp hệ thống đó mặc dù nó chạy dưới quyền root.

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 root nhưng không thể truy cập vào dữ liệu ứng dụng. Điều này cực kỳ hữu ích vì có thể đưa ra các xác nhận trên phạm vi rộng, chẳng hạn như một số miền nhất định không liên quan đến dữ liệu ứng dụng bị cấm truy cập internet.

setattr - Đối với các lệnh như chmodchown , bạn có thể xác định tập hợp các tệp mà miền liên kết có thể thực hiện setattr . Bất kỳ thứ gì bên ngoài điều đó đều có thể bị cấm đối với những thay đổi này, ngay cả bởi root. Vì vậy, một ứng dụng có thể chạy chmod và bị system_data_files đối với những chown được gắn nhãn nhưng không phải app_data_files hoặc shell_data_files .