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
- Exportierte Empfängerelemente
- Dokumentation zu Berechtigungen für Broadcast-Empfänger
- Geschützte Broadcast-Intents