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 trình thu nhận thông báo 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 các hành động không dành cho phương thức gọi bên ngoài.

Lỗ hổng này thường đề cập đến các trường hợp mà broadcast receiver được xuất không chủ ý, bằng cách đặt android:exported="true" trong AndroidManifest hoặc bằng cách tạo broadcast receiver theo phương thức lập trình, khiến receiver trở thành 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 sẽ 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 sẽ là "true".

Các trình thu nhận thông báo truyền tin được xuất có chủ ý mà không có quyền kiểm soát truy cập thích hợp có thể bị lợi dụng nếu nhà phát triển không có ý định cho phép tất cả ứng dụng gọi trình thu nhận đó.

Tác động

Kẻ tấn công có thể lợi dụng các broadcast receiver đượ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 có ý định tiết lộ cho bên thứ ba.

Giải pháp giảm thiểu

Tránh hoàn toàn vấn đề

Để 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 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 lệnh gọi lại sẽ kích hoạt sau khi sự kiện hoàn tất.

Trình nghe hoàn tất sự kiện

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
Bảo mật tác vụ

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 broadcast receiver bằng quyền

Chỉ đăng ký trình thu phát động cho thông báo truyền tin được bảo vệ (thông báo truyền tin mà chỉ các ứng dụng cấp hệ thống mới có thể gửi) hoặc với quyền cấp chữ ký tự khai báo.

Tài nguyên