Phần này chứa các đề xuất để đảm bảo tính bảo mật của ứng dụng trên thiết bị Android.
Xem xét mã nguồn
Việc xem xét mã nguồn có thể phát hiện nhiều vấn đề bảo mật, bao gồm cả những vấn đề được xác định trong tài liệu này. Android khuyến khích bạn thực hiện cả quy trình xem xét mã nguồn thủ công và tự động.
- Tuân thủ hướng dẫn bảo mật toàn diện khi tiến hành đánh giá để đảm bảo phạm vi áp dụng. Sử dụng các tiêu chuẩn nội bộ hoặc bên ngoài có liên quan để đảm bảo việc xem xét nhất quán và đầy đủ.
- Chạy trình tìm lỗi mã nguồn, chẳng hạn như trình tìm lỗi mã nguồn Android Studio, trên tất cả mã ứng dụng bằng cách sử dụng SDK Android và khắc phục mọi vấn đề đã xác định.
- Phân tích mã gốc bằng một công cụ tự động có thể phát hiện các vấn đề về quản lý bộ nhớ, chẳng hạn như tràn bộ đệm và lỗi chênh lệch một bit.
- Hệ thống xây dựng Android hỗ trợ nhiều trình dọn dẹp LLVM, chẳng hạn như AddressSanitizer và UndefinedBehaviorSanitizer. Bạn có thể dùng các trình dọn dẹp này để phân tích thời gian chạy của các vấn đề liên quan đến bộ nhớ. Khi kết hợp với tính năng tìm lỗi mã nguồn ngẫu nhiên (được hỗ trợ trong Android thông qua libFuzzer), trình dọn dẹp có thể phát hiện các trường hợp hiếm gặp bất thường cần được điều tra thêm.
- Người đánh giá bảo mật có kiến thức nên xem xét mã có mức độ rủi ro cao hơn, chẳng hạn như mã tiền mã hoá, quy trình thanh toán và quy trình xử lý PII.
Kiểm thử tự động
Bạn nên thường xuyên kiểm thử tự động để phát hiện nhiều vấn đề bảo mật.
- Thường xuyên chạy phiên bản CTS mới nhất trong suốt quá trình phát triển để phát hiện sớm các vấn đề và giảm thời gian khắc phục. Android sử dụng CTS trong quá trình tích hợp liên tục trong quy trình tạo bản dựng tự động của chúng tôi, tạo nhiều lần mỗi ngày.
- Tự động hoá quy trình kiểm thử bảo mật của các giao diện, bao gồm cả kiểm thử bằng dữ liệu đầu vào bị định dạng sai (kiểm thử tìm lỗi mã nguồn). Hệ thống xây dựng của Android hỗ trợ libFuzzer để viết kiểm thử tìm lỗi mã nguồn.
Quét lỗ hổng
Tính năng quét lỗ hổng có thể giúp đảm bảo rằng các ứng dụng được cài đặt sẵn không có lỗ hổng bảo mật đã biết. Tính năng phát hiện nâng cao có thể giúp giảm thời gian và chi phí cần thiết để giải quyết các lỗ hổng này, đồng thời ngăn chặn rủi ro cho người dùng và thiết bị.
- Quét tất cả ứng dụng được cài đặt sẵn bằng một công cụ quét lỗ hổng ứng dụng được công nhận trong ngành và xử lý các lỗ hổng đã phát hiện.
Ứng dụng có khả năng gây hại
Điều quan trọng là phải đảm bảo rằng các ứng dụng được cài đặt sẵn trên thiết bị của bạn không phải là Ứng dụng có khả năng gây hại (PHA). Bạn chịu trách nhiệm về hành vi của tất cả ứng dụng có trên thiết bị của mình. Trước khi khởi động thiết bị, hãy quét tất cả ứng dụng tải trước để tìm lỗ hổng.
Để biết thêm thông tin về PHA và cách Google chống lại các ứng dụng này trong Cửa hàng Play, hãy xem tài liệu dành cho nhà phát triển về Google Play Protect.
Quyền và việc cài đặt ứng dụng
Việc cấp quá nhiều quyền cho các ứng dụng được cài đặt sẵn có thể gây ra rủi ro bảo mật. Hạn chế các ứng dụng được cài đặt sẵn ở mức quyền tối thiểu cần thiết và đảm bảo rằng các ứng dụng đó không có quyền truy cập vào các quyền hoặc đặc quyền không cần thiết. Các quyền của ứng dụng được mô tả trong tệp AndroidManifest.xml.
- Không cấp các quyền hoặc đặc quyền không cần thiết cho các ứng dụng được cài đặt sẵn. Hãy xem xét kỹ các ứng dụng có đặc quyền hệ thống vì chúng có thể có các quyền rất nhạy cảm.
- Đảm bảo rằng tất cả các quyền được yêu cầu đều liên quan và cần thiết cho chức năng của ứng dụng cụ thể đó.
- Đảm bảo có thông tin công bố cho người dùng đối với tất cả ứng dụng được cài đặt sẵn sử dụng quyền
INSTALL_PACKAGES
. - Đảm bảo rằng nhà phát triển có nghĩa vụ theo hợp đồng là không được cài đặt bất kỳ ứng dụng nào dưới dạng UID 0.
- Đánh giá các quyền được khai báo trong tệp kê khai của tất cả ứng dụng sẽ được cài đặt thông qua mạng của nhà phát triển.
- Đảm bảo rằng nhà phát triển có nghĩa vụ theo hợp đồng phải quét tất cả URL tải xuống của ứng dụng trình cập nhật tự động và trình cài đặt bằng API Duyệt web an toàn của Google trước khi phân phát ứng dụng cho thiết bị.
Ký ứng dụng
Chữ ký ứng dụng đóng vai trò quan trọng trong việc bảo mật thiết bị và được dùng để kiểm tra quyền cũng như cập nhật phần mềm. Khi chọn khoá để dùng cho việc ký ứng dụng, điều quan trọng là phải xem xét liệu ứng dụng chỉ có trên một thiết bị hay phổ biến trên nhiều thiết bị.
- Đảm bảo rằng ứng dụng không được ký bằng khoá công khai, chẳng hạn như khoá nhà phát triển AOSP.
- Đảm bảo rằng các khoá dùng để ký ứng dụng được quản lý theo cách nhất quán với các phương pháp xử lý khoá nhạy cảm theo tiêu chuẩn ngành, bao gồm cả mô-đun bảo mật phần cứng (HSM) cung cấp quyền truy cập có giới hạn và có thể kiểm tra.
- Đảm bảo rằng ứng dụng không được ký bằng khoá nền tảng. Việc này cho phép ứng dụng truy cập vào các quyền chữ ký nền tảng. Đây là các quyền rất mạnh và chỉ dành cho các thành phần của hệ điều hành. Ứng dụng hệ thống phải sử dụng các quyền đặc quyền.
- Đảm bảo rằng các ứng dụng có cùng tên gói không được ký bằng các khoá khác nhau. Điều này thường xảy ra khi tạo ứng dụng cho nhiều thiết bị, đặc biệt là khi sử dụng khoá nền tảng. Nếu ứng dụng độc lập với thiết bị, hãy sử dụng cùng một khoá trên các thiết bị. Nếu ứng dụng dành riêng cho thiết bị, hãy tạo tên gói duy nhất cho mỗi thiết bị và khoá.
Tách biệt các ứng dụng và quy trình
Mô hình hộp cát của Android tăng cường bảo mật cho các ứng dụng và quy trình khi được sử dụng đúng cách.
Tách biệt các quy trình gốc
Các quy trình gốc là mục tiêu thường gặp nhất của các cuộc tấn công nâng cao đặc quyền; việc giảm số lượng quy trình gốc sẽ làm giảm nguy cơ nâng cao đặc quyền.
- Đảm bảo rằng thiết bị chạy mã tối thiểu cần thiết dưới dạng thư mục gốc. Nếu có thể, hãy sử dụng quy trình Android thông thường thay vì quy trình gốc. Nếu một quy trình phải chạy dưới quyền root trên thiết bị, hãy ghi lại quy trình đó trong yêu cầu tính năng AOSP để có thể xem xét công khai.
- Nếu có thể, bạn nên tách biệt mã gốc với dữ liệu không đáng tin cậy và truy cập thông qua giao tiếp liên quy trình (IPC). Ví dụ: giảm chức năng gốc xuống một dịch vụ nhỏ có thể truy cập được thông qua Binder và hiển thị dịch vụ có quyền ký cho một ứng dụng có ít hoặc không có đặc quyền để xử lý lưu lượng truy cập mạng.
- Các quy trình gốc không được nghe trên ổ cắm mạng.
- Các quy trình gốc không được bao gồm thời gian chạy có mục đích chung, chẳng hạn như máy ảo Java.
Tách biệt ứng dụng hệ thống
Nhìn chung, các ứng dụng cài đặt sẵn không được chạy bằng giá trị nhận dạng duy nhất (UID) của hệ thống dùng chung. Nếu cần thiết, ứng dụng có thể sử dụng UID dùng chung của hệ thống hoặc một dịch vụ đặc quyền khác (ví dụ: điện thoại). Tuy nhiên, ứng dụng không được xuất bất kỳ dịch vụ, broadcast receiver hoặc nhà cung cấp nội dung nào mà ứng dụng bên thứ ba do người dùng cài đặt có thể truy cập.
- Đảm bảo thiết bị chạy mã tối thiểu cần thiết dưới dạng hệ thống. Khi có thể, hãy sử dụng một quy trình Android có UID riêng thay vì sử dụng lại UID hệ thống.
- Nếu có thể, mã hệ thống phải được tách biệt với dữ liệu không đáng tin cậy và chỉ hiển thị IPC cho các quy trình đáng tin cậy khác.
- Các quy trình hệ thống không được nghe trên ổ cắm mạng. Đây là yêu cầu của CTS.
Tách biệt các quy trình
Hộp cát ứng dụng Android giúp tách biệt các ứng dụng với các quy trình khác trên hệ thống, bao gồm cả các quy trình gốc và trình gỡ lỗi. Trừ phi ứng dụng và người dùng bật tính năng gỡ lỗi một cách cụ thể, thì không ứng dụng nào được vi phạm kỳ vọng đó.
- Đảm bảo các quy trình gốc không truy cập vào dữ liệu trong các thư mục dữ liệu ứng dụng riêng lẻ, trừ phi sử dụng phương thức gỡ lỗi Android được ghi nhận.
- Đảm bảo các quy trình gốc không truy cập vào bộ nhớ của ứng dụng, trừ phi sử dụng phương thức gỡ lỗi Android được ghi lại.
- Đảm bảo thiết bị không có ứng dụng nào truy cập vào dữ liệu hoặc bộ nhớ của các ứng dụng hoặc quy trình khác.