Aquesta informació va dirigida als desenvolupadors d'aplicacions que contenen la vulnerabilitat de redirecció d'intent.
Què passa
Com a mínim una de les teves aplicacions conté un problema de redirecció d'intent, que pot permetre que aplicacions malicioses accedeixin als components o fitxers d'aplicacions privades. Revisa els passos detallats que s'indiquen a continuació per resoldre el problema de les aplicacions. Després de les dates límit que es mostren a Play Console, se suprimiran de Google Play les aplicacions que presentin vulnerabilitats de seguretat sense solucionar.
Acció necessària
- Inicia la sessió a Play Console i navega fins a la secció Alertes per consultar quines aplicacions es veuen afectades i les dates límit per resoldre aquests problemes.
- Segueix els passos destacats més avall per actualitzar les aplicacions afectades.
- Envia les versions actualitzades de les aplicacions afectades.
Un cop hagis tornat a enviar l'aplicació, la tornarem a revisar. Aquest procés pot tardar diverses hores a completar-se. Si l'aplicació supera la revisió i es publica correctament, no caldrà dur a terme cap altra acció. Si l'aplicació no supera la revisió, no se'n publicarà la versió nova i rebràs una notificació per correu electrònic.
Detalls addicionals
Utilitzar un intent que no sigui de confiança per iniciar un component (per exemple, cridar startActivity) o tornar dades (per exemple, cridar setResult) és perillós i pot permetre que aplicacions malicioses causin els problemes següents:
- Robar fitxers sensibles o dades del sistema (com ara missatges SMS) a l'aplicació.
- Iniciar els components privats de l'aplicació amb arguments enverinats.
És important que l'aplicació no cridi startActivity, startService, sendBroadcast o setResult en intents que no són de confiança sense validar-los o desinfectar-los.
Et recomanem que evitis aquesta vulnerabilitat d'una de les maneres següents:
Opció 1: fes que el component de l'aplicació afectada, des del qual es redirigeix l'intent extret, sigui privat.
Si no cal que el component de l'aplicació afectada rebi intents d'altres aplicacions, fes que aquest component de l'aplicació sigui privat definint-lo com a android:exported=”false” al fitxer de manifest.
Opció 2: assegura't que l'intent extret prové d'una font de confiança.
Pots verificar que l'activitat que s'origina és de confiança utilitzant mètodes com ara getCallingActivity. Per exemple:
// check if the originating Activity is from trusted package
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// redirect the nested Intent
startActivity(forward);
}
Nota:
- comprovar si getCallingActivity() torna un valor que no és nul no és suficient per evitar la vulnerabilitat. Les aplicacions malicioses poden proporcionar un valor nul a aquesta funció.
- En el cas de l'API SMS Retriever Auth de Serveis de Google Play, la protecció d'un receptor d'emissió amb SEND_PERMISSION garanteix que un intent prové dels Serveis de Play.
Opció 3: assegura't que l'intent que s'ha de redirigir no és perjudicial.
Has de verificar que l'intent redirigit:
- No s'enviarà a cap dels components privats de l'aplicació.
- No s'enviarà al component d'una aplicació externa. Si la redirecció està orientada a una aplicació externa, assegura't que l'intent no concedeix un permís URI a les dades del sistema o a un dels proveïdors de contingut privats de l'aplicació.
Les aplicacions poden comprovar quin component s'utilitzarà per gestionar l'intent abans de redirigir-lo utilitzant mètodes com ara resolveActivity. Per exemple:
Intent intent = getIntent();
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// get the component name
ComponentName name = forward.resolveActivity(getPackageManager());
// check that the package name and class name are as intended
if (name.getPackageName().equals(“safe_package”) &&
name.getClassName().equals(“safe_class”)) {
// redirect the nested Intent
startActivity(forward);
}
Les aplicacions poden comprovar si un intent concedeix permisos URI utilizant mètodes com ara getFlags. Per exemple:
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// get the flags
int flags = forward.getFlags();
// check that the nested intent does not grant URI permissions
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
(flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
// redirect the nested Intent
startActivity(forward);
}
Les aplicacions també poden suprimir la concessió de permisos URI mitjançant removeFlags. Per exemple:
// untrusted Intent
Intent intent = getIntent();
// remove the grant URI permissions in the untrusted Intent
intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// pass the untrusted Intent
setResult(intent);
Descripció de les alertes i selecció d'una opció de prevenció
L'alerta de Play Console t'informa quan l'aplicació crida startActivity, startActivityForResult, startService, sendBroadcast o setResult amb un intent que no és de confiança. Per entendre millor quina opció de prevenció és més adequada, examina els mètodes de crida per saber on s'origina l'intent que no és de confiança. Per exemple, per a l'opció 1, prova de determinar quin component s'ha de fer privat.
Som aquí per ajudar-te
Si tens cap dubte tècnic sobre la vulnerabilitat, pots publicar les teves preguntes a Stack Overflow amb l'etiqueta "android-security". Per aclarir els passos que has de seguir per resoldre aquest problema, pots contactar amb el nostre equip d'assistència per a desenvolupadors.