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