Hộp cát ứng dụng

Nền tảng Android tận dụng cơ chế bảo vệ dựa trên người dùng Linux để xác định và tách biệt tài nguyên ứng dụng. Điều này tách biệt các ứng dụng với nhau và bảo vệ các ứng dụng cũng như hệ thống khỏi các ứng dụng độc hại. Để thực hiện việc này, Android chỉ định một ID người dùng (UID) duy nhất cho mỗi ứng dụng Android và chạy ứng dụng đó theo quy trình riêng.

Android sử dụng UID để thiết lập Hộp cát ứng dụng cấp hạt nhân. Hạt nhân thực thi 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ư ID người dùng và nhóm được gán cho ứng dụng. Theo mặc định, các ứng dụng không thể tương tác với nhau và có quyền truy cập hạn chế vào hệ điều hành. Nếu ứng dụng A cố gắng làm điều 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 mà không được phép, thì ứng dụng A sẽ bị ngăn không cho làm điều đó vì nó 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 được và dựa trên sự phân tách quy trình và quyền truy cập tệp của người dùng theo phong cách UNIX hàng chục năm tuổi.

Vì Hộp cát ứng dụng nằm trong kernel 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 kernel, 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ả cá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 trong 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 viết ứng dụng cần thiết để thực thi bảo mật; về mặt này, mã gốc cũng được đóng hộp cát như mã được diễn giải.

Bảo vệ

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

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 giới thiệu theo thời gian và đã củng cố đáng kể hộp cát kiểm soát truy cập tùy ý (DAC) dựa trên UID ban đầu. 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 sự phân tách kiểm soát truy cập bắt buộc (MAC) giữa hệ thống và ứng dụng. Tuy nhiên, tất cả các ứng dụng của bên thứ ba đều chạy trong cùng bối cảnh SELinux nên việc cách ly giữa các ứng dụng chủ yếu được thực thi bởi 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 người dùng thực tế. 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 chính của ứng dụng đã thay đổi từ 751 thành 700. Điều này 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 đè các giá trị mặc định này) .
  • Trong Android 8.0, tất cả các ứng dụng đều được thiết lập để chạy với bộ lọc seccomp-bpf nhằm giới hạn các tòa nhà chọc trời mà ứng dụng được phép sử dụng, do đó củng cố ranh giới ứng dụng/kernel.
  • Trong Android 9, tất cả các ứng dụng không có đặc quyền có targetSdkVersion >= 28 phải chạy trong các hộp cát SELinux riêng lẻ, cung cấp MAC trên cơ sở từng ứng dụng. Tính năng bảo vệ này cải thiện khả năng phân tách ứng dụng, ngăn ghi đè các giá trị mặc định an toàn và (đáng kể nhất) ngăn các ứng dụng giúp thế giới dữ liệu của chúng có thể truy cập được.
  • Trong các ứng dụng Android 10 có chế độ xem thô hạn chế đối với hệ thống tệp và 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 có toàn quyền truy cập thô vào các đường dẫn dành riêng cho gói của chúng, như được trả về bởi bất kỳ phương thức hiện hành nào, chẳng hạn như Context.getExternalFilesDir() .

Hướng dẫn chia sẻ file

Đặt dữ liệu ứng dụng ở chế độ có thể truy cập được trên toàn thế giới là một biện pháp bảo mật kém. Quyền truy cập được cấp cho tất cả mọi người và không thể giới hạn quyền truy cập chỉ cho (những) người nhận dự kiến. Cách làm này đã dẫn đến rò rỉ thông tin và các lỗ hổng bảo mật gây nhầm lẫn, đồng thời là mục tiêu ưa thích của phần mềm độc hại nhằm vào các ứng dụng có 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 rõ ràng không được phép đối với các ứng dụng có targetSdkVersion>=28 .

Thay vì làm cho dữ liệu ứng dụng có thể truy cập được trên toàn thế giới, 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 ứng dụng khác, hãy sử dụng nhà cung cấp nội dung . Nhà cung cấp nội dung chia sẻ dữ liệu với độ chi tiết phù hợp và không gặp nhiều nhược điểm về quyền UNIX có thể truy cập trên toàn thế giới (để biết chi tiết, hãy tham khảo Thông tin cơ bản về 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 được (chẳng hạn như ảnh), thì chúng phải dành riêng cho phương tiện (chỉ ảnh, video và tệp âm thanh) và được lưu trữ bằng lớp MediaStore . (Để biết thêm chi tiết về cách thêm mục phương tiện, hãy xem Truy cập tệp phương tiện từ bộ nhớ dùng chung .)

Quyền Thời gian chạy lưu trữ kiểm soát quyền truy cập vào các bộ sưu tập được gõ mạnh thông qua MediaStore . Để truy cập các tệp được nhập yếu như PDF và lớp MediaStore.Downloads , ứng dụng phải sử dụng các ý định như mục đích ACTION_OPEN_DOCUMENT .

Để kích hoạt hành vi của Android 10, hãy sử dụng thuộc tính tệp kê khai requestLegacyExternalStorage và làm theo các phương pháp hay nhất về quyền của ứng dụng .

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