Ricevitori di trasmissioni non sicuri

Categoria OWASP: MASVS-PLATFORM: Platform Interaction

Panoramica

I ricevitori di trasmissione implementati in modo errato possono consentire a un malintenzionato di inviare un intent dannoso per fare in modo che l'applicazione vulnerabile esegua azioni non destinate a chiamanti esterni.

La vulnerabilità si riferisce in genere alle istanze in cui il broadcast receiver viene esportato involontariamente, impostando android:exported="true" in AndroidManifest o creando un broadcast receiver a livello di programmazione che lo rende pubblico per impostazione predefinita. Se il ricevitore non contiene filtri per intent, il valore predefinito è "false", ma se il ricevitore contiene almeno un filtro per intent, il valore predefinito di android:exported è "true".

I ricevitori di trasmissione esportati intenzionalmente senza un controllo dell'accesso adeguato possono essere utilizzati in modo illecito se lo sviluppatore non intendeva che venissero chiamati da tutte le applicazioni.

Impatto

Un malintenzionato può utilizzare in modo illecito i ricevitori di trasmissione implementati in modo non sicuro per ottenere l'accesso non autorizzato all'esecuzione di comportamenti nell'applicazione che lo sviluppatore non intendeva esporre a terze parti.

Mitigazioni

Evitare completamente il problema

Per risolvere completamente il problema, 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 callback

Se hai utilizzato i broadcast receiver per scopi interni dell'app (ad es. notifica di completamento dell'evento), puoi ristrutturare il codice in modo da passare un callback che si attivi dopo il completamento dell'evento.

Listener di completamento dell'evento

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
Attività sicura

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 dalle applicazioni a livello di sistema) o con autorizzazioni a livello di firma autodichiarate.

Risorse