不安全的广播接收器

OWASP 类别: MASVS-PLATFORM: 平台交互

概览

不当实现的广播接收器可能允许攻击者发送恶意 Intent,使存在漏洞的应用执行原本不打算供外部调用方执行的操作。

该漏洞通常指广播接收器被意外导出,具体方法包括在 AndroidManifest 中设置 android:exported="true",或者以编程方式创建广播接收器(默认情况下会使接收器变为公开)。如果接收器不包含任何 intent 过滤器,默认值为 "false";但如果接收器包含至少一个 intent 过滤器,则 android:exported 的默认值为 "true"

如果开发者不打算让所有应用调用某个广播接收器,但该接收器被有意导出且未进行适当的访问控制,则可能会被滥用。

影响

实施不安全的广播接收器可能会被攻击者滥用,从而未经授权地访问应用中开发者不打算向第三方公开的行为并加以执行。

缓解措施

完全避免此问题

要完全解决此困境,请将 exported 设置为 false

<receiver android:name=".MyReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.example.myapp.MY_ACTION" />
    </intent-filter>
</receiver>

使用调用和回调

如果您将广播接收器用于应用内部目的(即事件完成通知),您可以重构代码,以便传递一个将在事件完成后触发的回调。

事件完成监听器

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
安全任务

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");
        }
    }
}
主 Activity

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
        // ...
    }
}

通过权限保护广播接收器

仅针对受保护的广播(只有系统级应用才能发送的广播)或通过自声明的签名级别权限注册动态接收器。

资源