Hộp cát về ứng dụng

Nền tảng Android tận dụng tính năng bảo vệ dựa trên người dùng của Linux để xác định và tách biệt các tài nguyên ứng dụng. Điều này giúp tách biệt các ứng dụng với nhau và bảo vệ ứng dụng và hệ thống khỏi các ứng dụng độc hại. Để thực hiện việc này, Android sẽ gán một mã nhận dạng người dùng duy nhất (UID) cho từng ứng dụng Android và chạy ứng dụng đó theo cách riêng của chúng tôi.

Android sử dụng UID để thiết lập Hộp cát ứng dụng ở cấp độ nhân. Hạt nhân thực thi tính bảo mật giữa các ứng dụng và hệ thống ở cấp quy trình thông qua các cơ sở Linux tiêu chuẩn như mã nhận dạng người dùng và nhóm được chỉ định cho các ứng dụng. Theo mặc định, các ứng dụng không thể tương tác với nhau và sẽ bị giới hạn truy cập vào hệ điều hành. Nếu ứng dụng A cố gắng làm việc gì đó độc hại, chẳng hạn như đọc dữ liệu của ứng dụng B hoặc quay số điện thoại khi chưa được phép, ứng dụng này không được phép làm như vậy vì không có đặc quyền người dùng mặc định thích hợp. Hộp cát đơn giản, có thể kiểm tra và dựa trên việc phân tách quy trình và quyền đối với tệp của người dùng theo kiểu UNIX đã có từ nhiều thập kỷ trước.

Do Hộp cát ứng dụng đang ở trong nhân, nên mô hình bảo mật này mở rộng cho cả mã gốc và ứng dụng hệ điều hành. Tất cả phần mềm phía trên hạt nhân, chẳng hạn như thư viện hệ điều hành, khung ứng dụng, thời gian chạy ứng dụng và tất cả ứng dụng, đều chạy trong Hộp cát ứng dụng. Trên một số nền tảng, nhà phát triển bị ràng buộc với một khung phát triển, bộ API hoặc ngôn ngữ cụ thể. Trên Android, không có hạn chế nào về cách hoạt động của một ứng dụng được viết là bắt buộc để thực thi an ninh; về khía cạnh này, mã gốc sẽ dưới dạng hộp cát dưới dạng mã được thông dịch.

Biện pháp bảo vệ

Nhìn chung, để thoát khỏi Hộp cát ứng dụng theo cách được định cấu hình đúng cách bạn phải xâm phạm tính bảo mật của nhân hệ điều hành Linux. Tuy nhiên, tương tự các tính năng bảo mật khác, những biện pháp bảo vệ riêng lẻ thực thi ứng dụng hộp cát không dễ bị tấn công, nên việc bảo vệ theo chiều sâu đóng vai trò quan trọng nhằm ngăn chặn lỗ hổng bảo mật nào dẫn đến việc hệ điều hành hoặc các ứng dụng khác bị xâm phạm.

Android dựa vào một số biện pháp bảo vệ để thực thi hộp cát ứng dụng. Các biện pháp thực thi này đã được đưa ra theo thời gian và đã tăng cường đáng kể hộp cát kiểm soát quyền truy cập tuỳ ý (DAC) ban đầu dựa trên UID. Các bản phát hành Android trước đây đã bao gồm các biện pháp bảo vệ sau:

  • Trong Android 5.0, SELinux đã cung cấp tính năng kiểm soát truy cập bắt buộc (MAC) tách biệt giữa hệ thống và ứng dụng. Tuy nhiên, tất cả các ứng dụng bên thứ ba đều chạy trong cùng một quy trình Bối cảnh SELinux nên chủ yếu được thực thi bằng UID DAC.
  • Trong Android 6.0, hộp cát SELinux đã được mở rộng để tách biệt các ứng dụng trên ranh giới theo thực tế của người dùng. Ngoài ra, Android cũng đặt các giá trị mặc định an toàn hơn cho dữ liệu ứng dụng: Đối với các ứng dụng có targetSdkVersion >= 24, quyền DAC mặc định trên thư mục gốc của ứng dụng đã thay đổi từ 751 thành 700. Điều này cũng mang lại mặc định an toàn hơn cho dữ liệu ứng dụng riêng tư (mặc dù các ứng dụng có thể ghi đè những dữ liệu này mặc định).
  • Trong Android 8.0, tất cả ứng dụng đều được đặt để chạy bằng bộ lọc seccomp-bpf. Bộ lọc này giới hạn các lệnh gọi hệ thống mà ứng dụng được phép sử dụng, do đó tăng cường ranh giới ứng dụng/hạt nhân.
  • Trong Android 9, tất cả ứng dụng không có đặc quyền có targetSdkVersion >= 28 đều phải chạy trong từng hộp cát SELinux, cung cấp địa chỉ MAC cho mỗi ứng dụng cơ sở. Biện pháp bảo vệ này cải thiện khả năng phân tách ứng dụng, ngăn chặn việc ghi đè an toàn mặc định và (đáng kể nhất là) ngăn các ứng dụng tạo thế giới dữ liệu dễ sử dụng.
  • Trong Android 10, các ứng dụng có chế độ xem thô hạn chế về hệ thống tệp mà không có quyền truy cập trực tiếp vào các đường dẫn như /sdcard/DCIM. Tuy nhiên, các ứng dụng vẫn giữ quyền truy cập thô đầy đủ vào các đường dẫn dành riêng cho gói, như được trả về bởi mọi phương thức có thể áp dụng, chẳng hạn như Context.getExternalFilesDir().

Nguyên tắc chia sẻ tệp

Đặt dữ liệu ứng dụng ở chế độ có thể truy cập được trên toàn thế giới là một phương pháp bảo mật kém hiệu quả. Quyền truy cập được cấp cho tất cả mọi người và bạn không thể chỉ giới hạn quyền truy cập cho (các) người nhận dự kiến. Hành vi này đã dẫn đến việc rò rỉ thông tin và gây nhầm lẫn và là mục tiêu ưa thích của phần mềm độc hại nhắm đến các ứng dụng với dữ liệu nhạy cảm (chẳng hạn như ứng dụng email). Trong Android 9 trở lên, việc chia sẻ tệp theo cách này bị cấm rõ ràng đối với các ứng dụng có targetSdkVersion>=28.

Thay vì cho phép mọi người truy cập vào dữ liệu ứng dụng, hãy sử dụng các nguyên tắc sau khi chia sẻ tệp:

  • Nếu ứng dụng của bạn cần chia sẻ tệp với một ứng dụng khác, hãy sử dụng trình cung cấp nội dung. Nhà cung cấp nội dung chia sẻ dữ liệu với độ chi tiết thích hợp và không có nhiều nhược điểm của quyền UNIX mà thế giới có thể tiếp cận (đối với chi tiết, tham khảo Thông tin cơ bản về trình cung cấp nội dung).
  • Nếu ứng dụng của bạn có các tệp mà mọi người thực sự có thể truy cập (chẳng hạn như ảnh), thì các tệp đó phải dành riêng cho nội dung nghe nhìn (chỉ ảnh, video và tệp âm thanh) và được lưu trữ bằng lớp MediaStore. (Để biết thêm thông tin chi tiết về cách thêm mục nội dung nghe nhìn, hãy xem phần Truy cập các tệp nội dung nghe nhìn từ bộ nhớ dùng chung.)

Quyền khi bắt đầu chạy Bộ nhớ kiểm soát quyền truy cập vào các bộ sưu tập được xác định kiểu mạnh thông qua MediaStore. Để truy cập vào các tệp có kiểu yếu như PDF và lớp MediaStore.Downloads, ứng dụng phải sử dụng các ý định như ý định ACTION_OPEN_DOCUMENT.

Để cho phép hành vi của Android 10, hãy sử dụng Tệp kê khai requestLegacyExternalStorage rồi làm theo Các phương pháp hay nhất về quyền cho ứng dụng.

  • Giá trị mặc định của cờ tệp kê khai là true đối với các ứng dụng nhắm đến Android 9 (trở xuống).
  • Giá trị mặc định là false đối với ứng dụng nhắm đến Android 10. Để tạm thời chọn không sử dụng các tính năng đã lọc chế độ xem bộ nhớ trong các ứng dụng nhắm đến Android 10, đặt giá trị của cờ tệp kê khai thành true.
  • Khi sử dụng các quyền bị hạn chế, trình cài đặt sẽ đưa các ứng dụng được phép sử dụng bộ nhớ không phải hộp cát vào danh sách cho phép. Các ứng dụng không có trong danh sách cho phép hộp cát.