Soluzione per la vulnerabilità di Reindirizzamento intent

Queste informazioni sono rivolte agli sviluppatori di app che contengono la vulnerabilità di Reindirizzamento intent.

Situazione attuale

Una o più delle tue app presentano un problema di Reindirizzamento intent che potrebbe consentire ad app dannose di accedere a file o componenti privati delle app. Consulta la procedura dettagliata riportata di seguito per risolvere i problemi delle tue app. Dopo le scadenze indicate nella Play Console, tutte le app che contengono vulnerabilità di sicurezza non corrette verranno rimosse da Google Play.

Azione richiesta​

  1. Accedi a Play Console e vai alla sezione Avvisi per scoprire quali app sono interessate dai problemi e le scadenze per risolverli.
  2. Aggiorna le app interessate dai problemi tramite i passaggi indicati sotto.
  3. Invia le versioni aggiornate delle tue app coinvolte.

Quando invii nuovamente le app, queste vengono riesaminate. Questa procedura può richiedere diverse ore. Se l'app supera il controllo e viene pubblicata correttamente, non sono necessari ulteriori interventi. Se invece l'app non supera il controllo, la nuova versione dell'app non verrà pubblicata e riceverai una notifica via email.

Ulteriori dettagli

L'utilizzo di un intent non attendibile per avviare un componente (ad esempio, chiamando startActivity) o restituire dati (ad esempio, chiamando setResult) è pericoloso e può consentire ad app dannose di causare i seguenti problemi: 

  1. Furto di file sensibili o dati di sistema (come messaggi SMS) dalla tua app.
  2. Avvio di componenti privati della tua app con argomenti alterati.

È importante che la tua app non chiami startActivity, startService, sendBroadcast o setResult sugli intent non attendibili senza convalidare o sanificare questi intent.

È consigliabile evitare questa vulnerabilità seguendo una delle procedure indicate sotto:

Opzione 1: rendi privato il componente dell'app interessato dal problema, da cui viene reindirizzato l'intent.

Se il componente dell'app interessato dal problema non necessita di intent da altre app, puoi renderlo privato impostando android:exported="false" nel tuo file manifest.

Opzione 2: assicurati che l'Intent estratto provenga da una fonte attendibile.

Puoi verificare che l'attività di origine sia attendibile utilizzando metodi come getCallingActivity. Ad esempio:

 // controlla se l'attività di origine proviene da un pacchetto attendibile
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // estrai l'intent nidificato
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // reindirizza l'intent nidificato
   startActivity(forward);
 }

Nota:

  • Controllare se getCallActivityActivity() restituisce un valore diverso da null non è sufficiente per prevenire la vulnerabilità. Anche le app dannose possono fornire un valore null per funzione.
  • Nel caso dell'SMS Retriever Auth di Google Play Services, proteggere il broadcast receiver con SEND_PERMISSION assicurerà che l'intent proviene da Play Services.

Opzione 3: assicurati che l'intent da reindirizzare non sia dannoso.

Devi verificare che l'intent reindirizzato

  1. non verrà inviato a nessun componente privato dell'app e
  2. non verrà inviato al componente di un'app esterna. Se il reindirizzamento è destinato a un'app esterna, assicurati che l'intent non conceda un'autorizzazione URI a uno dei fornitori di contenuti privati della tua app o a dati di sistema.

Le app possono controllare quale componente verrà utilizzato per gestire l'intent prima del suo reindirizzamento, tramite metodi come resolveActivity. Ad esempio:

 Intent intent = getIntent();
 // estrai l'intent nidificato
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // recupera il nome del componente
 ComponentName name = forward.resolveActivity(getPackageManager());
 // verifica che il nome pacchetto e il nome classe siano quelli previsti
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // reindirizza l'intet nidificato
   startActivity(forward);
 }

Le app possono controllare se un intent concede un'autorizzazione URI, tramite metodi come getFlags. Ad esempio:

 // estrai l'intent nidificato
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // recupera i flag
 int flags = forward.getFlags();
 // controlla che l'intent nidificato non conceda autorizzazioni URI
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // reindirizza l'intent nidificato
   startActivity(forward);
 }

Le app possono anche rimuovere le concessioni di autorizzazione URI utilizzando removeFlags. Ad esempio:

 // intent non attendibile
 Intent intent = getIntent();
 // rimuovi la concessione di autorizzazione URL nell'intent non attendibile
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // passa l'intent non attendibile
 setResult(intent);

Comprensione degli avvisi e scelta di un'opzione di prevenzione 

L'avviso di Play Console segnala in che posizione l'app chiama startActivity, startActivityForResult, startService, sendBroadcast o setResult utilizzando un intent non attendibile. Per capire meglio quale opzione di prevenzione sia la più appropriata, puoi risalire ai chiamanti dei metodi ed esaminarli per scoprire da dove ha origine l'intent non attendibile. Ad esempio, per l'opzione 1, torna indietro per stabilire quale componente rendere privato.

Siamo qui per aiutarti

Puoi pubblicare eventuali domande tecniche relative alla vulnerabilità su Stack Overflow utilizzando il tag "android-security". Per chiarimenti sui passaggi da seguire per risolvere il problema, puoi contattare il nostro team di assistenza per sviluppatori.

È stato utile?

Come possiamo migliorare l'articolo?
false
App Google
Menu principale
8095223656949488906