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ợ cho các nguồn lực đề nghị.

Tệp chính

Để kích hoạt SELinux, tích hợp mới nhất Android hạt nhân và sau đó kết hợp các tập tin được tìm thấy trong hệ thống / sepolicy thư mục. 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 thay đổi các system/sepolicy tập tin trực tiếp. Thay vào đó, thêm hoặc chỉnh sửa các tập tin chính sách thiết bị cụ thể của riêng 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ề tách sepolicy nào trong Android 8.0 và cao hơn, xem Tùy SEPolicy trong Android 8.0 trở lên . 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

File kết thúc bằng *.te là SELinux file nguồn chính sách, trong đó xác định các lĩnh vực và nhãn của họ. Bạn có thể cần để tạo ra tập tin 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 file đang tồn tại 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 chuyển nhượng nhãn để tập tin và được sử dụng bởi các thành phần userspace 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 mới file_contexts , xây dựng lại hình ảnh hệ thống tập tin hoặc chạy restorecon vào tập tin để được dán nhãn. Về nâng cấp, thay đổi file_contexts sẽ được tự động áp dụng cho các hệ thống và phân vùng userdata như một phần của việc nâng cấp. Những thay đổi cũng có thể được tự động áp dụng vào nâng cấp lên phân vùng khác bằng cách thêm restorecon_recursive cuộc gọi đến init của bạn. board tập tin rc sau khi phân vùng đã được gắn read-write.
  • genfs_contexts chuyển nhượng nhãn để hệ thống tập tin, chẳng hạn như proc hoặc vfat không hỗ trợ 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. Nhãn cụ thể cũng có thể được giao cho gắn kết cụ thể, chẳng hạn như vfat sử dụng context=mount tùy chọn.
  • property_contexts chuyển nhượng nhãn để thuộc tính hệ thống Android để kiểm soát những gì quá trình có thể cài đặt chúng. Cấu hình này được đọc bởi init quá trình trong quá trình khởi động.
  • service_contexts chuyển nhượng nhãn để Android binder dịch vụ để kiểm soát những gì quá trình có thể thêm (đăng ký) và tìm thấy (tra cứu) một tài liệu tham khảo chất kết dính cho dịch vụ. Cấu hình này được đọc bởi servicemanager quá trình trong quá trình khởi động.
  • seapp_contexts chuyển nhượng nhãn để quá trình ứng dụng và /data/data thư mục. Cấu hình này được đọc bởi các zygote quá trình trên mỗi lần khởi chạy ứng dụng và bởi installd lúc khởi động.
  • mac_permissions.xml chuyển nhượng một seinfo thẻ để các ứng dụng dựa trên chữ ký của họ và tùy chọn tên gói của họ. Các seinfo thẻ sau đó có thể được sử dụng như một chìa khóa trong seapp_contexts tập tin để gán một nhãn cụ thể cho tất cả các ứng dụng với điều đó seinfo thẻ. Cấu hình này được đọc bởi system_server lúc khởi động.

BoardConfig.mk makefile

Sau khi chỉnh sửa hoặc thêm các tập tin chính sách và bối cảnh, cập nhật của bạn /device/ manufacturer / device-name /BoardConfig.mk makefile để tham khảo các sepolicy thư mục con và mỗi tập tin chính sách mới. Để biết thêm thông tin về BOARD_SEPOLICY biến, xem system/sepolicy/README tập tin .

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. Bây giờ bạn có thể tùy chỉnh một trong hai chính sách SELinux của bạn để phù hợp với bổ sung của riêng bạn để hệ điều hành Android như mô tả trong Customization hoặc xác minh thiết lập hiện tại của bạn như được đề cập trong Validation .

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ị, xem Building sepolicy .

Thực hiện

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

  1. Kích hoạt SELinux trong kernel: CONFIG_SECURITY_SELINUX=y
  2. Thay đổi các tham số kernel_cmdline hoặc bootconfig để:
    BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
    hoặc
    BOARD_BOOTCONFIG := androidboot.selinux=permissive
    này chỉ dành cho 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á đầu ra cho những cảnh báo tương tự như init: Warning! Service name needs a SELinux domain defined; please fix! Xem Validation để được hướng dẫn và các 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. Nhìn vào *_contexts file để xem làm thế nào những điều đã được dán nhãn trước và sử dụng kiến thức trong những ý nghĩa nhãn để gán một hình 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. Tất cả các dịch vụ sinh ra từ init , ví dụ, nên có riêng của họ. 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. Xem lại init. device .rc để xác định những lĩnh vực mà không có một loại tên miền. Cung cấp cho họ một miền đầu trong quá trình phát triển của bạn để tránh thêm quy tắc để init hoặc gây nhầm lẫn init truy cập với các shortcut này nằm trong chính sách của mình.
  9. Thiết lập BOARD_CONFIG.mk sử dụng BOARD_SEPOLICY_* biến. Xem README trong system/sepolicy biết chi tiết về thiết lập này.
  10. Kiểm tra init. device rc và fstab. device tập tin và chắc chắn rằng tất cả các sử dụng mount tương ứng với một hệ thống tập tin được dán nhãn đúng cách hoặc một context= mount tùy chọn đượ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 Customization .

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à một cái nhìn sâu hơn về một số bước, xem Viết SELinux Policy .

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:

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

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 tin hệ thống - Cân nhắc các loại tập tin hệ thống cần được sửa đổi chỉ bởi hệ thống máy chủ. Tuy nhiên, kể từ khi netd , init , và vold chạy như là người chủ, họ có thể truy cập vào các tập tin hệ thống. Vì vậy, nếu netd trở nên bị tổn thương, nó có thể làm tổn hại các tập tin và có khả năng hệ thống máy chủ riêng của mình.

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 chúng là máy chủ hệ thống. Thậm chí nếu netd trở nên bị tổn thương, nó không thể chuyển tên miền đến lĩnh vực hệ thống máy chủ và truy cập vào các tập tin hệ thống mặc dù nó chạy như là người chủ.

App dữ liệu - Một ví dụ khác là lớp các chức năng mà phải chạy với quyền root nhưng không nên để dữ liệu ứng dụng truy cập. Đ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 các thiết lập của file nơi miền được liên kết có thể tiến hành 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 chmodchown chống lại những nhãn app_data_files nhưng không shell_data_files hoặc system_data_files .