Categoria OWASP: MASVS-PLATFORM: Interazione con la piattaforma
Panoramica
I ricevitori di trasmissione implementati in modo improprio possono consentire a un malintenzionato di inviare un messaggio malevolo per indurre l'applicazione vulnerabile a eseguire azioni non destinate agli utenti esterni.
La vulnerabilità si riferisce in genere a casi in cui il ricevitore di trasmissione viene esportato involontariamente impostando android:exported="true"
in AndroidManifest o creando un ricevitore di trasmissione tramite programmazione che rende il ricevitore pubblico per impostazione predefinita. Se il destinatario non contiene filtri di intent, il valore predefinito è "false"
, ma se il destinatario contiene almeno un filtro di intent, il valore predefinito di android:exported è "true"
.
I ricevitori di trasmissione esportati intenzionalmente senza un controllo dell'accesso adeguato possono essere oggetto di abusi se lo sviluppatore non intendeva che fossero chiamati da tutte le applicazioni.
Impatto
I broadcast receiver implementati in modo non sicuro possono essere utilizzati in modo improprio da un malintenzionato per ottenere accesso non autorizzato ed eseguire comportamenti nell'applicazione che lo sviluppatore non intendeva esporre a terze parti.
Mitigazioni
Evitare del tutto il problema
Per risolvere completamente il dilemma, imposta exported
su false
:
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
Utilizzare chiamate e richiami
Se hai utilizzato i broadcast receiver per scopi interni dell'app (ad es. la notifica di completamento dell'evento), puoi ristrutturare il codice in modo da passare un callback che verrà attivato al termine dell'evento.
Listener di completamento evento
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
Attività protetta
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");
}
}
}
Attività principale
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
// ...
}
}
Proteggere i ricevitori di trasmissione con le autorizzazioni
Registra i ricevitori dinamici solo per le trasmissioni protette (trasmissioni che possono essere inviate solo da applicazioni a livello di sistema) o con autorizzazioni a livello di firma autodichiarate.
Risorse
- Elementi del ricevitore esportati
- Documentazione relativa alle autorizzazioni del ricevitore di trasmissione
- Intent di trasmissione protetti