Unsichere Übertragungsempfänger

OWASP-Kategorie: MASVS-PLATFORM: Plattforminteraktion

Übersicht

Unsachgemäß implementierte Broadcast-Empfänger können es einem Angreifer ermöglichen, einen schädlichen Intent zu senden, um die angreifbare Anwendung dazu zu bringen, Aktionen auszuführen, die nicht für externe Aufrufer bestimmt sind.

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

Bewusst exportierte Broadcastempfänger ohne ordnungsgemäße Zugriffssteuerung können missbraucht werden, wenn der Entwickler nicht beabsichtigt hat, dass sie von allen Anwendungen aufgerufen werden.

Positiv beeinflussen

Unsicher implementierte Broadcast-Empfänger können von einem Angreifer missbraucht werden, um unbefugten Zugriff auf die Ausführung von Aktionen in der Anwendung zu erhalten, die der Entwickler nicht für Dritte freigeben wollte.

Abhilfemaßnahmen

Problem vollständig vermeiden

Um das Problem vollständig zu beheben, 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 Rückrufe verwenden

Wenn Sie Broadcast-Empfänger für interne App-Zwecke verwendet haben (z. B. Benachrichtigung über den Abschluss eines Ereignisses), können Sie Ihren Code so umstrukturieren, dass stattdessen ein Rückruf übergeben wird, der nach Abschluss des Ereignisses ausgelöst wird.

Listener für den Abschluss eines Ereignisses

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 Übertragungen (Übertragungen, die nur von Anwendungen auf Systemebene gesendet werden können) oder mit selbstdeklarierten Berechtigungen auf Signaturebene.

Ressourcen