Các phương pháp hay nhất để bảo mật ứng dụng

Phần này trình bày 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

Quy trình 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 cả quy trình đánh giá mã nguồn thủ công và tự động.

  • Tuân thủ hướng dẫn toàn diện về bảo mật khi tiến hành đánh giá để đảm bảo phạm vi đánh giá. 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 các bài đánh giá nhất quán và đầy đủ.
  • Chạy một trình tìm lỗi mã nguồn (chẳng hạn như trình tìm lỗi mã nguồn của Android Studio) trên tất cả mã ứng dụng bằ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ư lỗi tràn bộ đệm và lỗi lệch một.
  • Hệ thống tạo Android hỗ trợ nhiều trình dọn dẹp LLVM, chẳng hạn như AddressSanitizerUndefinedBehaviorSanitizer. 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ác vấn đề liên quan đến bộ nhớ. Kết hợp với fuzzing (kiểm thử ngẫu nhiên), được hỗ trợ trong Android thông qua libFuzzer, các trình dọn dẹp có thể phát hiện các trường hợp biên bất thường cần đ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ó rủi ro cao hơn, chẳng hạn như mã xử lý tiền mã hoá, mã xử lý thanh toán và mã xử lý thông tin nhận dạng cá nhân.

Kiểm thử tự động

Kiểm thử tự động có thể giúp phát hiện nhiều vấn đề về bảo mật và bạn nên thực hiện kiểm thử thường xuyên.

  • Thường xuyên chạy phiên bản mới nhất của CTS 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 quy 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, quy trình này 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 các đầu vào bị lỗi (kiểm thử ngẫu nhiên). Hệ thống bản dựng của Android hỗ trợ libFuzzer để viết các kiểm thử fuzz.

Quét lỗ hổng bảo mật

Quá trình 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ảm thời gian và chi phí cần thiết để giải quyết những 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ả cá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 ngành công nhận và giải quyết 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ả các ứng dụng có trên thiết bị của bạn. Trước khi ra mắt 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 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 của 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 cần thiết tối thiểu và đảm bảo rằng các ứng dụng này không có quyền truy cập vào những quyền hoặc đặc quyền không cần thiết. 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. 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 có thông tin công bố cho 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 nhà phát triển có nghĩa vụ theo hợp đồng là phải 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á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 một khoá để dùng ký ứng dụng, bạn cần cân nhắc xem ứng dụng chỉ có trên một thiết bị hay dùng chung trên nhiều thiết bị.

  • Đảm bảo rằng ứng dụng không được ký bằng một 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 tiêu chuẩn trong ngành để xử lý các khoá 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 có giới hạn và có thể kiểm tra.
  • Đảm bảo rằng các ứng dụng không được ký bằng khoá nền tảng. Khi đó, ứng dụng sẽ có quyền truy cập vào các quyền chữ ký nền tảng. Đây là những quyền rất mạnh mẽ và chỉ dành cho các thành phần của hệ điều hành. Các ứng dụng hệ thống phải sử dụng quyền có đặ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 bạn tạo một ứ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 không phụ thuộc vào thiết bị, hãy 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 riêng biệ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 cung cấp thêm tính 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 xuyên nhất của các cuộc tấn công leo thang đặc quyền; việc giảm số lượng quy 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ã tối thiểu cần thiết dưới dạng 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 dạng gốc trên thiết bị, hãy ghi lại quy trình đó trong yêu cầu về tính năng AOSP để có thể xem xét công khai.
  • Nếu có thể, mã gốc phải được tách biệt với dữ liệu không đáng tin cậy và được truy cập thông qua giao tiếp giữa các 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 Trình liên kết và hiển thị dịch vụ bằng quyền chữ 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 theo dõi trên một ổ cắm mạng.
  • Các quy trình gốc không được bao gồm một thời gian chạy đa năng, chẳng hạn như VM Java.

Tách biệt các ứng dụng hệ thống

Nhìn chung, các ứng dụng cài đặt sẵn không nên 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 để một ứng dụng 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), thì ứng dụng đó không được xuất bất kỳ dịch vụ, broadcast receiver hoặc trình cung cấp nội dung nào mà các ứ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ã tối thiểu cần thiết dưới dạng hệ thống. Nếu có thể, hãy sử dụng một quy trình Android có mã nhận dạng duy nhất riêng thay vì dùng lại mã nhận dạng duy nhất của 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ỉ cho phép IPC đối với các quy trình đáng tin cậy khác.
  • Các quy trình hệ thống không được theo dõi trên một ổ 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 cung cấp cho các ứng dụng một kỳ vọng về khả năng tách biệt 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 chế độ gỡ lỗi một cách cụ 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 một phương thức gỡ lỗi Android được ghi lại.
  • Đả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.