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
- Exportierte Receiver-Elemente
- Dokumentation zu Berechtigungen für Broadcast-Receiver
- Geschützte Broadcast-Intents