Ricevitori di trasmissioni non sicuri

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