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. Việc này giúp tách riêng các ứng dụng với nhau và bảo vệ ứng dụng cũng như hệ thống khỏi các ứng dụng độc hại. Để làm việc này, Android chỉ định một mã nhận dạng người dùng duy nhất (UID) cho mỗi ứng dụng Android và chạy mã nhận dạng đó trong 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 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à 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 thực hiện hành vi độ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 đó sẽ bị ngăn chặn vì không có các đặc quyền mặc định thích hợp của người dùng. 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.
Vì Hộp cát ứng dụng nằm trong hạt 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ó quy định hạn chế nào về cách viết ứng dụng để thực thi bảo mật; về khía cạnh này, mã gốc được coi là hộp cát như mã được diễn giải.
Biện pháp bảo vệ
Nhìn chung, để thoát khỏi Hộp cát ứng dụng trong một thiết bị được định cấu hình đúng cách, bạn phải đánh đổi 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 thể chống lại mọi lỗ hổng. Vì vậy, việc phòng thủ chuyên sâu là rất quan trọng để ngăn chặn một lỗ hổng duy nhất dẫn đến việc 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 đư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 quyền 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ả ứng dụng bên thứ ba đều chạy trong cùng một ngữ cảnh SELinux, vì vậy, việc tách biệt giữa các ứng dụng 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 theo ranh giới người dùng thực. 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 đã cung cấp chế độ 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 chế độ mặc định này). - Trong Android 8.0, tất cả ứng dụng đều được đặt để chạy bằng bộ lọc
seccomp-bpf
hạn chế 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 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 chặn việc ghi đè các giá trị mặc định an toàn và (quan trọng nhất) ngăn các ứng dụng cung cấp quyền truy cập vào thế giới dữ liệu của chúng. - Trong Android 10, các ứng dụng có chế độ xem thô bị hạn chế của hệ thống tệp, 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
Việc đặt dữ liệu ứng dụng ở chế độ truy cập được trên toàn cầu là một phương 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à bạn không thể chỉ cấp quyền truy cập cho(các) người nhận dự kiến. Phương pháp này đã dẫn đến việc rò rỉ thông tin và nhầm lẫn các lỗ hổng của thư ký, đồng thời 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 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 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 trên thế giớ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 phù hợp và không có nhiều nhược điểm của các quyền UNIX có thể truy cập trên toàn thế giới (để biết thông tin chi tiết, hãy tham khảo phần Kiến thức 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 (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
.
Để bậ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 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 các ứng dụng nhắm đến Android 10. Để tạm thời chọn không sử dụng chế độ xem bộ nhớ được lọc trong các ứng dụng nhắm đến Android 10, hãy đặ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 sẽ được đưa vào hộp cát.