Danh mục OWASP: MASVS-PLATFORM: Tương tác với nền tảng
Tổng quan
Việc triển khai không đúng cách các bộ nhận tín hiệu truyền tin có thể cho phép kẻ tấn công gửi một ý định độc hại để khiến ứng dụng dễ bị tấn công thực hiện những hành động không dành cho người gọi bên ngoài.
Lỗ hổng này thường đề cập đến các trường hợp bộ nhận tín hiệu truyền tin vô tình được xuất, bằng cách đặt android:exported="true" trong AndroidManifest hoặc bằng cách tạo một bộ nhận tín hiệu truyền tin theo phương thức lập trình, theo đó, bộ nhận tín hiệu truyền tin sẽ công khai theo mặc định. Nếu broadcast receiver không chứa bộ lọc ý định nào, thì giá trị mặc định là "false", nhưng nếu broadcast receiver chứa ít nhất một bộ lọc ý định, thì giá trị mặc định của android:exported là "true".
Các trình nhận thông báo truyền tin được xuất một cách có chủ ý mà không có cơ chế kiểm soát quyền truy cập phù hợp có thể bị lợi dụng nếu nhà phát triển không muốn tất cả các ứng dụng gọi đến trình nhận này.
Tác động
Kẻ tấn công có thể lợi dụng các bộ nhận tín hiệu truyền tin được triển khai không an toàn để giành quyền truy cập trái phép nhằm thực thi hành vi trong ứng dụng mà nhà phát triển không muốn tiết lộ cho bên thứ ba.
Giải pháp giảm thiểu
Tránh hoàn toàn vấn đề này
Để giải quyết hoàn toàn vấn đề này, hãy đặt exported thành false:
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
Sử dụng các lệnh gọi và lệnh gọi lại
Trong trường hợp bạn sử dụng broadcast receiver cho các mục đích nội bộ của ứng dụng (ví dụ: thông báo hoàn tất sự kiện), bạn có thể tái cấu trúc mã để truyền một lệnh gọi lại sẽ kích hoạt sau khi hoàn tất sự kiện.
Trình nghe trạng thái hoàn thành sự kiện
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
Việc cần làm bảo mật
Kotlin
class SecureTask(private val listener: EventCompletionListener?) {
fun executeTask() {
// Do some work...
// Notify that the event is complete
listener?.onEventComplete("Some secure data")
}
}
Java
public class SecureTask {
final private EventCompletionListener listener;
public SecureTask(EventCompletionListener listener) {
this.listener = listener;
}
public void executeTask() {
// Do some work...
// Notify that the event is complete
if (listener != null) {
listener.onEventComplete("Some secure data");
}
}
}
Hoạt động chính
Kotlin
class MainActivity : AppCompatActivity(), EventCompletionListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val secureTask = SecureTask(this)
secureTask.executeTask()
}
override fun onEventComplete(data: String) {
// Handle event completion securely
// ...
}
}
Java
public class MainActivity extends AppCompatActivity implements EventCompletionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureTask secureTask = new SecureTask(this);
secureTask.executeTask();
}
@Override
public void onEventComplete(String data) {
// Handle event completion securely
// ...
}
}
Bảo mật bộ thu phát sóng bằng các quyền
Chỉ đăng ký các receiver động cho thông báo được bảo vệ (chỉ các ứng dụng cấp hệ thống mới có thể gửi thông báo) hoặc với các quyền cấp chữ ký tự khai báo.
Tài nguyên
- Các phần tử của thiết bị nhận đã xuất
- Tài liệu về Quyền của Broadcast Receiver
- Protected Broadcast Intents