Denne informasjonen er beregnet på utviklere med apper som har et sikkerhetsproblem med intensjonsviderekobling.
Hva skjer?
Én eller flere av appene dine inneholder et problem med intensjonsviderekobling som kan gi skadelige apper tilgang til private appkomponenter eller -filer. Gå gjennom trinnene nedenfor for å løse problemet med appene dine. Alle apper som inneholder uløste sikkerhetsproblemer, kan bli fjernet fra Google Play etter tidsfristene som vises i Play-konsollen.
Dette må du gjøre
- Logg på Play-konsollen, og gå til Varsler-delen for å se hvilke apper som er berørt, samt tidsfristene for å løse disse problemene.
- Oppdater de berørte appene dine ved å følge trinnene nedenfor.
- Send inn de oppdaterte versjonene av de berørte appene.
Hvis du sender apper inn igjen, blir de vurdert på nytt. Denne prosessen kan ta flere timer. Hvis appene godkjennes etter gjennomgangen og publiseres, trenger du ikke å gjøre noe mer. Hvis de ikke godkjennes, blir ikke de nye appversjonene publisert, og du mottar et varsel på e-post.
Flere detaljer
Bruk av ikke-klarerte intensjoner til å starte komponenter (for eksempel med startActivity) eller returnere data (for eksempel med setResultat) er farlig, og dette kan føre til at skadelige apper
- stjeler sensitive filer eller systemdata (f.eks. SMS-er) fra appen din
- starter private komponenter i appen din med skadelige argumenter
Det er viktig at appen din ikke bruker startActivity, startService, sendBroadcast eller setResultat for ikke-klarerte intensjoner uten først å validere eller sanere intensjonene.
Vi anbefaler at du forhindrer dette sikkerhetsproblemet på én av disse måtene:
Alternativ 1: Gjør den berørte appkomponenten (som den utpakkede intensjonen viderekobles fra) privat.
Hvis den berørte appkomponenten ikke trenger å motta intensjoner fra andre apper, kan du gjøre appkomponenten privat ved å angi android:exported="false" i manifestet.
Alternativ 2: Forsikre deg om at den utpakkede intensjonen kommer fra en pålitelig kilde.
Du kan bekrefte at opphavsaktiviteten er pålitelig, ved å bruke metoder som getCallingActivity. Eksempel:
// sjekk om opphavsaktiviteten (Activity) kommer fra en pålitelig pakke
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// hent ut den flettede intensjonen
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// viderekoble den flettede intensjonen
startActivity(forward);
}
Merk:
- Det er ikke nok å sjekke om getCallingActivity() returnerer en verdi som ikke er null, for å forhindre sikkerhetsproblemet. Skadelige apper kan levere en nullverdi for denne funksjonen.
- Google Play Services SMS Retriever Auth: Hvis du beskytter en mottaker med SEND_PERMISSION, sikrer det at intensjonen kommer fra Play Tjenester.
Alternativ 3: Forsikre deg om at den viderekoblede intensjonen ikke er skadelig.
Du bør bekrefte at den viderekoblede intensjonen
- ikke sendes til noen av appens private komponenter
- ikke sendes til eksterne appers komponenter – hvis viderekoblingen er målrettet mot en ekstern app, må du sørge for at intensjonen ikke gir URI-tillatelser til en av appens private innholdsleverandører eller systemdata
Apper kan sjekke hvilke komponenter som skal brukes til å håndtere intensjonen, før den viderekobles, ved å bruke metoder som resolveActivity. Eksempel:
Intent intent = getIntent();
// hent ut den flettede intensjonen
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// hent komponentnavnet
ComponentName name = forward.resolveActivity(getPackageManager());
// sjekk at pakkenavnet og klassenavnet er som de skal
if (name.getPackageName().equals(“safe_package”) &&
name.getClassName().equals(“safe_class”)) {
// viderekoble den flettede intensjonen
startActivity(forward);
}
Apper kan sjekke om intensjoner gir URI-tillatelser, ved å bruke metoder som getFlags. Eksempel:
// hent ut den flettede intensjonen
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// hent flaggene
int flags = forward.getFlags();
// sjekk at den flettede intensjonen ikke gir URI-tillatelser
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
(flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
// viderekoble den flettede intensjonen
startActivity(forward);
}
Apper kan også fjerne gitte URI-tillatelser med removeFlags. Eksempel:
// ikke-klarert intensjon
Intent intent = getIntent();
// fjern den gitte URI-tillatelsen i den ikke-klarerte intensjonen
intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// send den ikke-klarerte intensjonen
setResult(intent);
Forklaring av varsler og valg av alternativer for forebygging
Varsler i Play-konsollen rapporterer hvor appen din bruker startActivity, startActivityForResult, startService, sendBroadcast eller setResult med en ikke-klarert intensjon. For å få en bedre forståelse av hvilket alternativ for forebygging som er best egnet, kan du gå tilbake og se på tilbakekallere av metoder for å finne ut hvor den ikke-klarerte intensjonen kommer fra. For alternativ 1 kan du for eksempel gå tilbake for å bestemme hvilken komponent som skal gjøres privat.
Vi hjelper deg gjerne
Hvis du har tekniske spørsmål om sikkerhetsproblemet, kan du skrive et innlegg på Stack Overflow og bruke «android-security»-etiketten. Hvis du vil ha mer informasjon om hva du må gjøre for å løse dette problemet, kan du kontakte brukerstøtteteamet for utviklere.