Broadcast receiver không an toàn

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