Unsichere Übertragungsempfänger

OWASP-Kategorie:MASVS-PLATFORM: Platform Interaction

Übersicht

Bei einer unsachgemäßen Implementierung von Broadcast-Empfängern kann ein Angreifer eine schädliche Absicht senden, damit die anfällige Anwendung Aktionen ausführt, die nicht für externe Aufrufer vorgesehen sind.

Die Sicherheitslücke bezieht sich im Allgemeinen auf Fälle, in denen der Übertragungsempfänger unbeabsichtigt exportiert wird, entweder durch Festlegen von android:exported="true" im AndroidManifest oder durch programmatisches Erstellen eines Übertragungsempfängers, wodurch der Übertragungsempfänger standardmäßig öffentlich wird. Wenn der Receiver keine Intent-Filter enthält, ist der Standardwert "false". Wenn der Receiver mindestens einen Intent-Filter enthält, ist der Standardwert von „android:exported“ "true".

Absichtlich exportierte Broadcast-Receiver ohne ordnungsgemäße Zugriffssteuerung können missbraucht werden, wenn der Entwickler nicht beabsichtigt hat, dass sie von allen Anwendungen aufgerufen werden.

Auswirkungen

Unsicher implementierte Broadcast-Empfänger können von einem Angreifer missbraucht werden, um unbefugten Zugriff zu erhalten und Verhalten in der Anwendung auszuführen, das der Entwickler nicht für Dritte vorgesehen hat.

Gegenmaßnahmen

Problem vollständig vermeiden

Um das Dilemma vollständig zu lösen, setzen Sie exported auf false:

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

Anrufe und Callbacks verwenden

Wenn Sie Broadcast-Receiver für interne App-Zwecke verwendet haben, z. B. für Benachrichtigungen über den Abschluss von Ereignissen, können Sie Ihren Code so umstrukturieren, dass stattdessen ein Callback übergeben wird, der nach Abschluss des Ereignisses ausgelöst wird.

Listener für den Abschluss von Ereignissen

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
Sichere Aufgabe

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");
        }
    }
}
Hauptaktivität

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

Broadcast-Empfänger mit Berechtigungen schützen

Registrieren Sie dynamische Empfänger nur für geschützte Broadcasts (Broadcasts, die nur von Anwendungen auf Systemebene gesendet werden können) oder mit selbst deklarierten Berechtigungen auf Signaturniveau.

Ressourcen