Bảo mật ứng dụng

Trang này mô tả nhiều khía cạnh về tính bảo mật của ứng dụng.

Các phần tử của ứng dụng

Android cung cấp một nền tảng nguồn mở và môi trường ứng dụng cho các thiết bị di động. Hệ điều hành cốt lõi dựa trên nhân Linux. Các ứng dụng Android thường được viết bằng ngôn ngữ lập trình Java và chạy trong máy ảo Android Runtime (ART). Tuy nhiên, các ứng dụng cũng có thể được viết bằng mã gốc. Ứng dụng được cài đặt từ một tệp duy nhất có đuôi tệp APK.

Các thành phần chính để tạo ứng dụng Android là:

  • AndroidManifest.xml: Tệp AndroidManifest.xml là tệp kiểm soát cho hệ thống biết phải làm gì với tất cả các thành phần cấp cao nhất (cụ thể là các hoạt động, dịch vụ, broadcast receiver và content provider được mô tả bên dưới) trong một ứng dụng. Tệp này cũng chỉ định những quyền bắt buộc.

  • Hoạt động: Hoạt động thường là mã cho một tác vụ duy nhất, tập trung vào người dùng bằng cách sử dụng lớp Activity. Một hoạt động thường bao gồm việc hiển thị giao diện người dùng cho người dùng, nhưng không bắt buộc; một số hoạt động không bao giờ hiển thị giao diện người dùng. Thông thường, một trong các hoạt động của ứng dụng là điểm truy cập vào ứng dụng.

  • Dịch vụ: Dịch vụ là một đoạn mã chạy ở chế độ nền, dựa trên lớp Service. Nó có thể chạy trong quy trình riêng hoặc trong bối cảnh quy trình của một ứng dụng khác. Các thành phần khác liên kết với một dịch vụ và gọi các phương thức trên dịch vụ đó thông qua lệnh gọi quy trình từ xa. Ví dụ về một dịch vụ là trình phát nội dung nghe nhìn: ngay cả khi người dùng thoát khỏi giao diện người dùng chọn nội dung nghe nhìn, có thể người dùng vẫn muốn tiếp tục phát nhạc. Một dịch vụ sẽ tiếp tục phát nhạc ngay cả khi giao diện người dùng đã hoàn tất.

  • Bộ nhận tín hiệu truyền tin: Bộ nhận tín hiệu truyền tin là đối tượng của lớp BroadcastReceiver. BroadcastReceiver được khởi tạo khi một cơ chế IPC (giao tiếp giữa các tiến trình) được gọi là ý định, một thực thể của lớp Intent được hệ điều hành hoặc một ứng dụng khác phát hành. Ví dụ: một ứng dụng có thể đăng ký một BroadcastReceiver cho thông báo pin yếu và thay đổi hành vi của ứng dụng dựa trên thông tin đó.

Mô hình quyền trên Android: Truy cập vào các API được bảo vệ

Tất cả ứng dụng trên Android đều chạy trong Hộp cát ứng dụng. Theo mặc định, ứng dụng Android chỉ có thể truy cập vào một số tài nguyên hệ thống. Hệ thống quản lý quyền truy cập của ứng dụng Android vào các tài nguyên. Nếu được sử dụng không chính xác hoặc cho mục đích xấu, các tài nguyên này có thể ảnh hưởng tiêu cực đến trải nghiệm người dùng, mạng hoặc dữ liệu trên thiết bị.

Những hạn chế này được triển khai dưới nhiều hình thức khác nhau. Một số chức năng bị hạn chế do thiếu API cho chức năng nhạy cảm (ví dụ: không có API Android để thao tác trực tiếp với thẻ SIM). Trong một số trường hợp, việc tách biệt các vai trò sẽ giúp tăng cường bảo mật, chẳng hạn như khi có tính năng cách ly bộ nhớ theo từng ứng dụng. Trong những trường hợp khác, các API nhạy cảm này được dùng cho các ứng dụng đáng tin cậy và được bảo vệ thông qua một cơ chế bảo mật được gọi là Quyền.

Các API được bảo vệ này bao gồm:

  • Các chức năng của camera
  • Dữ liệu vị trí (GPS)
  • Các chức năng Bluetooth
  • Các hàm điện thoại
  • Các chức năng SMS/MMS
  • Kết nối mạng/dữ liệu

Bạn chỉ có thể truy cập vào những tài nguyên này thông qua hệ điều hành. Để sử dụng các API được bảo vệ trên thiết bị, ứng dụng phải xác định những chức năng cần thiết trong tệp kê khai. Tất cả các phiên bản Android 6.0 trở lên đều sử dụng mô hình quyền khi bắt đầu chạy. Nếu người dùng yêu cầu một tính năng từ một ứng dụng yêu cầu API được bảo vệ, hệ thống sẽ hiển thị một hộp thoại, nhắc người dùng từ chối hoặc cho phép quyền.

Sau khi được cấp, các quyền này sẽ được áp dụng cho ứng dụng miễn là ứng dụng đó được cài đặt. Để tránh gây nhầm lẫn cho người dùng, hệ thống sẽ không thông báo lại cho người dùng về các quyền đã cấp cho ứng dụng. Ngoài ra, những ứng dụng có trong hệ điều hành cốt lõi hoặc được OEM đóng gói sẽ không yêu cầu người dùng cấp quyền. Các quyền sẽ bị xoá nếu một ứng dụng bị gỡ cài đặt, vì vậy, việc cài đặt lại sau đó sẽ dẫn đến việc hiển thị lại các quyền.

Trong phần cài đặt thiết bị, người dùng có thể xem các quyền đối với những ứng dụng mà họ đã cài đặt trước đó. Người dùng cũng có thể tắt một số chức năng trên toàn cầu khi họ muốn, chẳng hạn như tắt GPS, đài hoặc Wi-Fi.

Trong trường hợp một ứng dụng cố gắng sử dụng một tính năng được bảo vệ chưa được khai báo trong tệp kê khai của ứng dụng, lỗi về quyền thường dẫn đến việc một ngoại lệ bảo mật được gửi lại cho ứng dụng. Các quy trình kiểm tra quyền API được bảo vệ sẽ được thực thi ở cấp thấp nhất có thể để ngăn chặn hành vi lách luật. Hình 2 minh hoạ ví dụ về thông báo cho người dùng khi một ứng dụng được cài đặt trong khi yêu cầu quyền truy cập vào các API được bảo vệ.

Các quyền mặc định của hệ thống được mô tả tại Manifest.permission. Các ứng dụng có thể khai báo quyền riêng để các ứng dụng khác sử dụng. Những quyền như vậy không được liệt kê ở vị trí nêu trên.

Khi xác định một quyền, thuộc tính protectionLevel sẽ cho hệ thống biết người dùng sẽ nhận thông báo như thế nào về các ứng dụng cần được cấp quyền, hoặc người được phép giữ quyền. Thông tin chi tiết về cách tạo và sử dụng các quyền dành riêng cho ứng dụng được mô tả trong Danh sách kiểm tra bảo mật.

Một số chức năng của thiết bị (chẳng hạn như khả năng gửi ý định truyền tin nhắn SMS) không có sẵn cho các ứng dụng bên thứ ba, nhưng có thể được các ứng dụng do OEM cài đặt sẵn sử dụng. Các quyền này sử dụng quyền signatureOrSystem.

Cách người dùng hiểu về ứng dụng bên thứ ba

Android luôn cố gắng giúp người dùng biết rõ khi họ đang tương tác với các ứng dụng bên thứ ba và thông báo cho người dùng về các chức năng mà những ứng dụng đó có. Trước khi cài đặt bất kỳ ứng dụng nào, người dùng sẽ thấy một thông báo rõ ràng về các quyền mà ứng dụng đang yêu cầu. Sau khi cài đặt, người dùng sẽ không được nhắc xác nhận bất kỳ quyền nào nữa.

Có nhiều lý do để hiển thị các quyền ngay trước thời điểm cài đặt. Đây là thời điểm người dùng đang tích cực xem xét thông tin về ứng dụng, nhà phát triển và chức năng để xác định xem ứng dụng có đáp ứng nhu cầu và kỳ vọng của họ hay không. Điều quan trọng là họ chưa cam kết về tinh thần hoặc tài chính đối với ứng dụng và có thể dễ dàng so sánh ứng dụng này với các ứng dụng thay thế khác.

Một số nền tảng khác sử dụng phương pháp khác để thông báo cho người dùng, yêu cầu cấp quyền khi bắt đầu mỗi phiên hoặc trong khi ứng dụng đang được sử dụng. Tầm nhìn của Android là cho phép người dùng chuyển đổi liền mạch giữa các ứng dụng theo ý muốn. Việc cung cấp thông tin xác nhận mỗi lần sẽ làm chậm người dùng và ngăn Android mang lại trải nghiệm người dùng tuyệt vời. Khi người dùng xem xét các quyền tại thời điểm cài đặt, họ có thể chọn không cài đặt ứng dụng nếu cảm thấy không thoải mái.

Ngoài ra, nhiều nghiên cứu về giao diện người dùng đã cho thấy rằng việc nhắc nhở người dùng quá nhiều sẽ khiến người dùng bắt đầu nhấp vào OK cho mọi hộp thoại xuất hiện. Một trong những mục tiêu bảo mật của Android là truyền tải hiệu quả thông tin bảo mật quan trọng đến người dùng. Điều này không thể thực hiện được bằng cách sử dụng các hộp thoại mà người dùng được hướng dẫn bỏ qua. Bằng cách trình bày thông tin quan trọng một lần và chỉ khi thông tin đó quan trọng, người dùng sẽ có nhiều khả năng suy nghĩ về những điều mà họ đang đồng ý.

Một số nền tảng chọn không hiển thị bất kỳ thông tin nào về chức năng của ứng dụng. Phương pháp đó khiến người dùng khó hiểu và thảo luận về các chức năng của ứng dụng. Mặc dù không phải lúc nào tất cả người dùng cũng có thể đưa ra quyết định sáng suốt, nhưng mô hình quản lý quyền của Android giúp nhiều người dùng dễ dàng truy cập vào thông tin về các ứng dụng. Ví dụ: các yêu cầu cấp quyền không mong muốn có thể khiến những người dùng sành sỏi hơn đặt ra các câu hỏi quan trọng về chức năng của ứng dụng và chia sẻ mối lo ngại của họ ở những nơi như Google Play để tất cả người dùng đều thấy.

Các quyền khi cài đặt ứng dụng – Google Dịch Các quyền của một ứng dụng đã cài đặt – Gmail
Quyền khi cài đặt ứng dụng – Google Dịch Quyền của ứng dụng đã cài đặt – Gmail

Hình 1. Hiển thị các quyền cho ứng dụng.

Giao tiếp liên quy trình

Các quy trình có thể giao tiếp bằng bất kỳ cơ chế nào thuộc loại Unix truyền thống. Ví dụ: hệ thống tệp, ổ cắm cục bộ hoặc tín hiệu. Tuy nhiên, các quyền của Linux vẫn được áp dụng.

Android cũng cung cấp các cơ chế IPC mới:

  • Binder: Một cơ chế lệnh gọi quy trình từ xa dựa trên khả năng có kích thước nhẹ, được thiết kế để mang lại hiệu suất cao khi thực hiện các lệnh gọi trong quy trình và trên nhiều quy trình. Binder được triển khai bằng trình điều khiển Linux tuỳ chỉnh. Để biết nội dung mô tả về lớp này, hãy xem Binder.

  • Dịch vụ: Các dịch vụ có thể cung cấp những giao diện có thể truy cập trực tiếp bằng cách sử dụng trình liên kết. Để biết nội dung mô tả chi tiết hơn, hãy xem phần Các phần tử của ứng dụng

  • Ý định: Ý định là một đối tượng thông báo đơn giản thể hiện ý định làm một việc gì đó. Ví dụ: nếu ứng dụng của bạn muốn hiển thị một trang web, thì ứng dụng đó sẽ thể hiện ý định xem URL bằng cách tạo một thực thể ý định và chuyển thực thể đó cho hệ thống. Hệ thống sẽ xác định vị trí của một đoạn mã khác (trong trường hợp này là trình duyệt) biết cách xử lý ý định đó và chạy đoạn mã đó. Bạn cũng có thể dùng ý định để truyền tin các sự kiện thú vị (chẳng hạn như thông báo) trên toàn hệ thống. Để biết nội dung mô tả về lớp này, hãy xem Ý định.

  • Nhà cung cấp nội dung: Nhà cung cấp nội dung là một kho dữ liệu cung cấp quyền truy cập vào dữ liệu trên thiết bị; ví dụ điển hình là nhà cung cấp nội dung được dùng để truy cập vào danh sách người liên hệ của người dùng. Một ứng dụng có thể truy cập vào dữ liệu mà các ứng dụng khác đã hiển thị bằng một trình cung cấp nội dung, đồng thời một ứng dụng cũng có thể xác định trình cung cấp nội dung riêng để hiển thị dữ liệu của chính ứng dụng đó. Để biết nội dung mô tả về lớp này, hãy xem ContentProvider.

Mặc dù có thể triển khai IPC bằng các cơ chế khác, chẳng hạn như ổ cắm mạng hoặc tệp mà bất cứ ai cũng có thể ghi, nhưng đây là các khung IPC được đề xuất cho Android. Nhà phát triển Android nên áp dụng các phương pháp hay nhất để bảo mật dữ liệu của người dùng và tránh đưa ra các lỗ hổng bảo mật.

API nhạy cảm về chi phí

API nhạy cảm về chi phí là mọi chức năng có thể phát sinh chi phí cho người dùng hoặc mạng. Nền tảng Android đã đưa các API nhạy cảm về chi phí vào danh sách API được bảo vệ do hệ điều hành kiểm soát. Người dùng phải cấp quyền rõ ràng cho các ứng dụng bên thứ ba yêu cầu sử dụng các API nhạy cảm về chi phí. Các API này bao gồm:

  • Điện thoại
  • SMS/MMS
  • Mạng/Dữ liệu
  • Thanh toán trong ứng dụng
  • Quyền truy cập NFC

Android 4.2 bổ sung thêm chế độ kiểm soát việc sử dụng SMS. Android sẽ cung cấp thông báo nếu một ứng dụng cố gắng gửi SMS đến một mã ngắn sử dụng các dịch vụ đặc biệt có thể phát sinh thêm phí. Người dùng có thể chọn cho phép ứng dụng gửi tin nhắn hoặc chặn ứng dụng.

Quyền truy cập vào thẻ SIM

Các ứng dụng bên thứ ba không có quyền truy cập ở cấp thấp vào thẻ SIM. Hệ điều hành xử lý mọi hoạt động giao tiếp với thẻ SIM, bao gồm cả quyền truy cập vào thông tin cá nhân (danh bạ) trong bộ nhớ thẻ SIM. Các ứng dụng cũng không thể truy cập vào các lệnh AT vì các lệnh này chỉ do Lớp giao diện vô tuyến (RIL) quản lý. RIL không cung cấp API cấp cao cho các lệnh này.

Thông tin cá nhân

Android đã đặt các API cung cấp quyền truy cập vào dữ liệu người dùng vào bộ API được bảo vệ. Khi sử dụng bình thường, các thiết bị Android cũng tích luỹ dữ liệu người dùng trong các ứng dụng bên thứ ba do người dùng cài đặt. Các ứng dụng chọn chia sẻ thông tin này có thể sử dụng các bước kiểm tra quyền của hệ điều hành Android để bảo vệ dữ liệu khỏi các ứng dụng bên thứ ba.

Chỉ có thể truy cập vào dữ liệu người dùng nhạy cảm thông qua các API được bảo vệ

Hình 2. Bạn chỉ có thể truy cập vào dữ liệu người dùng nhạy cảm thông qua các API được bảo vệ.

Các trình cung cấp nội dung hệ thống có khả năng chứa thông tin cá nhân hoặc thông tin nhận dạng cá nhân (chẳng hạn như danh bạ và lịch) đã được tạo bằng các quyền được xác định rõ ràng. Mức độ chi tiết này giúp người dùng biết rõ các loại thông tin có thể được cung cấp cho ứng dụng. Trong quá trình cài đặt, ứng dụng bên thứ ba có thể yêu cầu quyền truy cập vào các tài nguyên này. Nếu được cấp quyền, ứng dụng có thể được cài đặt và có quyền truy cập vào dữ liệu được yêu cầu bất cứ lúc nào khi ứng dụng được cài đặt.

Theo mặc định, mọi ứng dụng thu thập thông tin cá nhân đều chỉ có quyền truy cập vào dữ liệu đó. Nếu một ứng dụng chọn cung cấp dữ liệu cho các ứng dụng khác thông qua IPC, thì ứng dụng cấp quyền truy cập có thể áp dụng các quyền cho cơ chế IPC do hệ điều hành thực thi.

Thiết bị đầu vào dữ liệu nhạy cảm

Các thiết bị Android thường cung cấp những thiết bị đầu vào dữ liệu nhạy cảm, cho phép các ứng dụng tương tác với môi trường xung quanh, chẳng hạn như camera, micrô hoặc GPS. Để truy cập vào các thiết bị này, trước tiên, người dùng phải cấp quyền truy cập một cách rõ ràng cho ứng dụng bên thứ ba thông qua việc sử dụng Quyền của hệ điều hành Android. Khi cài đặt, trình cài đặt sẽ nhắc người dùng yêu cầu cấp quyền cho cảm biến theo tên.

Nếu muốn biết vị trí của người dùng, ứng dụng cần có quyền truy cập vào vị trí của người dùng. Khi cài đặt, trình cài đặt sẽ nhắc người dùng hỏi xem ứng dụng có thể truy cập vào vị trí của người dùng hay không. Bất cứ lúc nào, nếu không muốn bất kỳ ứng dụng nào truy cập vào vị trí của mình, người dùng có thể chạy ứng dụng Cài đặt, chuyển đến phần Vị trí và bảo mật, rồi bỏ chọn Sử dụng mạng không dâyBật vệ tinh GPS. Thao tác này sẽ tắt các dịch vụ dựa trên vị trí cho tất cả ứng dụng trên thiết bị của người dùng.

Siêu dữ liệu của thiết bị

Android cũng cố gắng hạn chế quyền truy cập vào dữ liệu vốn không nhạy cảm, nhưng có thể gián tiếp tiết lộ các đặc điểm về người dùng, lựa chọn ưu tiên của người dùng và cách họ sử dụng thiết bị.

Theo mặc định, các ứng dụng không có quyền truy cập vào nhật ký hệ điều hành, nhật ký trình duyệt, số điện thoại hoặc thông tin nhận dạng phần cứng hoặc mạng. Nếu một ứng dụng yêu cầu quyền truy cập vào thông tin này tại thời điểm cài đặt, thì trình cài đặt sẽ nhắc người dùng hỏi xem ứng dụng có thể truy cập vào thông tin hay không. Nếu người dùng không cấp quyền truy cập, ứng dụng sẽ không được cài đặt.

Tổ chức phát hành chứng chỉ

Android có một tập hợp các Tổ chức phát hành chứng chỉ hệ thống đã cài đặt, được tin cậy trên toàn hệ thống. Trước Android 7.0, các nhà sản xuất thiết bị có thể sửa đổi bộ CA được vận chuyển trên thiết bị của họ. Tuy nhiên, các thiết bị chạy Android 7.0 trở lên có một bộ CA hệ thống đồng nhất vì nhà sản xuất thiết bị không còn được phép sửa đổi nữa.

Để được thêm làm CA công khai mới vào bộ CA gốc của Android, CA phải hoàn tất Quy trình thêm CA của Mozilla, sau đó gửi yêu cầu về tính năng cho Android ( https://code.google.com/p/android/issues/entry) để thêm CA vào bộ CA gốc của Android trong Dự án nguồn mở Android (AOSP).

Vẫn có những CA dành riêng cho thiết bị và không nên được đưa vào bộ CA cốt lõi của AOSP, chẳng hạn như CA riêng của nhà mạng có thể cần thiết để truy cập an toàn vào các thành phần trong cơ sở hạ tầng của nhà mạng, chẳng hạn như cổng SMS/MMS. Nhà sản xuất thiết bị nên chỉ đưa các CA riêng tư vào những thành phần/ứng dụng cần tin tưởng các CA này. Để biết thêm thông tin chi tiết, hãy xem phần Cấu hình bảo mật mạng.

Ký ứng dụng

Ký mã cho phép nhà phát triển xác định tác giả của ứng dụng và cập nhật ứng dụng mà không cần tạo các giao diện và quyền phức tạp. Mọi ứng dụng chạy trên nền tảng Android đều phải được nhà phát triển ký. Google Play hoặc trình cài đặt gói trên thiết bị Android sẽ từ chối những ứng dụng cố gắng cài đặt mà không được ký.

Trên Google Play, tính năng ký ứng dụng giúp xây dựng niềm tin giữa Google và nhà phát triển, cũng như giữa nhà phát triển và ứng dụng của họ. Nhà phát triển biết rằng ứng dụng của họ được cung cấp cho thiết bị Android mà không bị sửa đổi; và nhà phát triển có thể chịu trách nhiệm về hành vi của ứng dụng.

Trên Android, tính năng ký ứng dụng là bước đầu tiên để đặt một ứng dụng vào Hộp cát ứng dụng. Chứng chỉ ứng dụng đã ký xác định mã nhận dạng người dùng nào được liên kết với ứng dụng nào; các ứng dụng khác nhau chạy theo các mã nhận dạng người dùng khác nhau. Quy trình ký ứng dụng đảm bảo rằng một ứng dụng không thể truy cập vào bất kỳ ứng dụng nào khác, ngoại trừ thông qua IPC được xác định rõ.

Khi một ứng dụng (tệp APK) được cài đặt trên thiết bị Android, Trình quản lý gói sẽ xác minh rằng APK đã được ký đúng cách bằng chứng chỉ có trong APK đó. Nếu chứng chỉ (hoặc chính xác hơn là khoá công khai trong chứng chỉ) khớp với khoá dùng để ký bất kỳ tệp APK nào khác trên thiết bị, thì tệp APK mới có thể chỉ định trong tệp kê khai rằng tệp này dùng chung một UID với các tệp APK khác được ký tương tự.

Ứng dụng có thể được ký bởi bên thứ ba (OEM, nhà mạng, thị trường thay thế) hoặc tự ký. Android cung cấp tính năng ký mã bằng chứng chỉ tự ký mà nhà phát triển có thể tạo mà không cần sự trợ giúp hoặc quyền của bên ngoài. Ứng dụng không cần phải được ký bởi một cơ quan trung ương. Android hiện không thực hiện quy trình xác minh CA cho chứng chỉ ứng dụng.

Các ứng dụng cũng có thể khai báo quyền bảo mật ở cấp độ bảo vệ chữ ký, chỉ hạn chế quyền truy cập đối với những ứng dụng được ký bằng cùng một khoá trong khi vẫn duy trì các UID và Hộp cát ứng dụng riêng biệt. Bạn có thể có mối quan hệ chặt chẽ hơn với Hộp cát ứng dụng dùng chung thông qua tính năng UID dùng chung. Theo đó, hai hoặc nhiều ứng dụng được ký bằng cùng một khoá nhà phát triển có thể khai báo một UID dùng chung trong tệp kê khai của chúng.

Xác minh ứng dụng

Android 4.2 trở lên hỗ trợ quy trình xác minh ứng dụng. Người dùng có thể chọn bật tính năng Xác minh ứng dụng và để trình xác minh ứng dụng đánh giá các ứng dụng trước khi cài đặt. Tính năng xác minh ứng dụng có thể cảnh báo người dùng nếu họ cố gắng cài đặt một ứng dụng có thể gây hại; nếu một ứng dụng đặc biệt xấu, tính năng này có thể chặn quá trình cài đặt.

Quản lý quyền kỹ thuật số

Nền tảng Android cung cấp một khung quản lý quyền kỹ thuật số (DRM) có thể mở rộng, cho phép các ứng dụng quản lý nội dung được bảo vệ bằng quyền theo các hạn chế về giấy phép liên kết với nội dung đó. Khung DRM hỗ trợ nhiều cơ chế DRM; nhà sản xuất thiết bị sẽ quyết định thiết bị hỗ trợ cơ chế DRM nào.

Khung DRM Android được triển khai ở 2 lớp kiến trúc (xem hình 3):

  • Một API khung DRM, được cung cấp cho các ứng dụng thông qua khung ứng dụng Android và chạy thông qua ART VM cho các ứng dụng tiêu chuẩn.

  • Một trình quản lý DRM mã gốc, triển khai khung DRM và hiển thị một giao diện cho các trình bổ trợ (tác nhân) DRM để xử lý việc quản lý quyền và giải mã cho nhiều lược đồ DRM

Cấu trúc của hệ thống Quản lý quyền kỹ thuật số trên nền tảng Android

Hình 3. Cấu trúc của DRM trên nền tảng Android.