Danh mục OWASP: MASVS-PLATFORM: Tương tác với nền tảng
Tổng quan
Các ứng dụng Android và hệ thống Android có thể sử dụng thông báo truyền tin làm hệ thống nhắn tin để thông báo cho các ứng dụng khác về các sự kiện mà ứng dụng đó có thể quan tâm. Thông báo truyền tin cố định (sticky) là một loại thông báo truyền tin đặc biệt mà (các) đối tượng ý định đã gửi vẫn còn trong bộ nhớ đệm sau khi truyền tin xong. Hệ thống có thể truyền lại các ý định cố định cho các lượt đăng ký sau này của receiver (trình thu nhận). Tuy nhiên, API thông báo truyền tin cố định có một số thiếu sót liên quan đến bảo mật. Đó là lý do API này không còn được dùng trong Android 5.0 (API cấp 21).
Bất cứ ai cũng có thể truy cập vào thông báo truyền tin cố định
Không thể giới hạn các thông báo truyền tin cố định cho các trình thu nhận có một số quyền nhất định. Do đó, thông báo truyền tin cố định không phù hợp để truyền thông tin nhạy cảm. Bạn có thể nghĩ rằng việc chỉ định tên gói ứng dụng trong thông báo truyền tin Intent
sẽ giới hạn tập hợp BroadcastReceivers
:
Kotlin
val intent = Intent("com.example.NOTIFY").apply {
setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)
Java
Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);
Trong ví dụ này, chỉ trình thu nhận trong gói com.example.myapp
mới nhận được ý định khi thông báo truyền tin được gửi đi. Tuy nhiên, bộ lọc tên gói không được áp dụng khi Ý định được truyền lại từ bộ nhớ đệm cố định (sticky cache). Khi đăng ký một trình thu nhận bằng phương thức registerReceiver()
, tất cả ý định trong bộ nhớ đệm cố định khớp với bộ lọc chỉ định sẽ được truyền lại đến trình thu nhận đó, bất kể tên gói có chứa trình thu nhận.
Bất cứ ai cũng có thể gửi thông báo truyền tin cố định
Để gửi thông báo truyền tin cố định, một ứng dụng chỉ yêu cầu quyền android.permission.BROADCAST_STICKY
, được cấp tự động khi cài đặt ứng dụng. Do đó, những kẻ tấn công có thể gửi bất kỳ ý định nào cho bất kỳ trình thu nhận nào, và có thể giành được quyền truy cập trái phép vào một ứng dụng khác. Các trình thu nhận thông báo truyền tin (broadcast receiver) có thể hạn chế sender (trình gửi) ở những trình gửi có quyền nhất định. Tuy nhiên, khi làm vậy, trình thu nhận không thể nhận thông báo từ bộ nhớ đệm cố định vì các thông báo truyền tin không được gửi trong ngữ cảnh nhận dạng của bất kỳ ứng dụng nào và không được truyền tin với bất kỳ quyền nào.
Bất cứ ai cũng có thể sửa đổi thông báo truyền tin cố định
Khi một ý định nằm trong thông báo truyền tin cố định, ý định đó sẽ thay thế mọi thực thể trước có cùng thao tác, dữ liệu, loại, giá trị nhận dạng, lớp và danh mục trong bộ nhớ đệm cố định. Như vậy, kẻ tấn công có thể dễ dàng ghi đè dữ liệu bổ sung trong một ý định cố định từ một ứng dụng hợp pháp, ý định này sau đó có thể được truyền lại đến những trình thu nhận khác.
Các thông báo truyền tin được gửi bằng phương thức sendStickyOrderedBroadcast()
được phân phối đến trình thu nhận tại một thời điểm để cho phép các trình thu nhận có mức độ ưu tiên cao hơn sử dụng thông báo truyền tin trước khi truyền thông báo đến trình thu nhận có mức độ ưu tiên thấp hơn. Khi đến lượt trình thu nhận thực thi, nó có thể truyền kết quả đến trình thu nhận tiếp theo, chẳng hạn như bằng cách gọi setResultData()
hoặc có thể huỷ truyền tin, ngăn các trình thu nhận tiếp theo nhận thông báo truyền tin. Một kẻ tấn công có thể nhận được các thông báo truyền tin cố định có thứ tự từ một ứng dụng hợp pháp có thể tạo ra trình thu nhận có mức độ ưu tiên cao nhằm can thiệp vào dữ liệu kết quả của thông báo truyền tin hoặc hoàn toàn bỏ qua thông báo.
Mức độ tác động
Mức độ tác động khác nhau tuỳ thuộc vào cách sử dụng thông báo truyền tin cố định và dữ liệu được truyền đến broadcast receiver (trình thu nhận thông báo truyền tin). Nói chung, việc sử dụng thông báo truyền tin cố định có thể dẫn đến việc rò rỉ dữ liệu nhạy cảm, can thiệp vào dữ liệu, truy cập trái phép để thực hiện hành vi trong một ứng dụng khác và từ chối dịch vụ.
Giải pháp giảm thiểu
Không nên sử dụng thông báo truyền tin cố định. Mô hình đề xuất là sử dụng thông báo truyền tin không cố định với một cơ chế khác, chẳng hạn như cơ sở dữ liệu cục bộ, để truy xuất giá trị hiện tại bất cứ khi nào bạn muốn.
Nhà phát triển có thể kiểm soát những ai nhận được thông báo truyền tin không cố định bằng cách sử dụng quyền hoặc bằng cách đặt tên gói ứng dụng cho ý định. Hơn nữa, nếu không cần gửi thông báo truyền tin đến các thành phần bên ngoài ứng dụng, hãy sử dụng LiveData
. Lớp này sẽ triển khai mô hình trình quan sát.
Bạn có thể tìm thêm thông tin về cách bảo mật thông báo truyền tin trên trang tổng quan về thông báo truyền tin.