Åtgärda säkerhetsbrist vid omdirigering av intent

Den här informationen är avsedd för utvecklare vars appar har en säkerhetsbrist som gör dem sårbara vid omdirigering av intent.

Detta händer

I minst en av dina appar finns ett problem med omdirigering av intent som kan leda till att skadliga appar får tillgång till privata appkomponenter eller filer. Läs igenom anvisningarna för hur problemet ska åtgärdas nedan. Alla appar där säkerhetsbristen inte har åtgärdats tas bort från Google Play efter det datum som anges i Play Console.

Åtgärd som krävs​

  1. Logga in på Play Console och öppna avsnittet Varningar. Där ser du vilka appar som berörs av problemet och vilket datum det måste vara åtgärdat.
  2. Uppdatera de berörda apparna enligt anvisningarna nedan.
  3. Skicka in uppdaterade versioner av de berörda apparna.

När du skickar in den nya appversionen granskas den på nytt. Granskningen kan ta flera timmar. Om appen blir godkänd vid granskningen och publiceras utan problem behöver du inte göra något mer. Om appen inte blir godkänd vid granskningen kommer den nya appversionen inte att publiceras och du meddelas via e-post.

Ytterligare information

Det är farligt att använda ett osäkert intent för att starta en komponent (till exempel genom att anropa startActivity) eller returnera data (till exempel genom att anropa setResult) och kan ge skadliga appar möjlighet att orsaka följande problem: 

  1. Stjäla känsliga filer eller systemdata (som sms) från appen.
  2. Starta appens privata komponenter med skadliga argument.

Det är viktigt att appen inte anropar startActivity, startService, sendBroadcast eller setResult med osäkra intent utan att de först valideras eller rensas.

Vi rekommenderar att du åtgärdar säkerhetsbristen på något av följande sätt:

Alternativ 1: Gör den berörda appkomponenten, som det extraherade intentet omdirigeras från, privat.

Om den berörda appkomponenten inte behöver kunna ta emot intent från andra appar kan du göra komponenten privat genom att ställa in android:exported=”false” i manifestet.

Alternativ 2: Säkerställ att det extraherade intentet kommer från en betrodd källa.

Du kan kontrollera att den aktivitet som anropet kommer från är betrodd med metoder som getCallingActivity. Exempel:

 // kontrollera om ursprungsaktiviteten hör till ett betrott paket
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extrahera det kapslade intentet
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // omdirigera det kapslade intentet
   startActivity(forward);
 }

Obs!

  • Det räcker inte att kontrollera om getCallingActivity() returnerar ett värde som inte är null för att förhindra säkerhetsbristen. Skadliga appar kan ange värdet null för den här funktionen.
  • Om du skyddar en sändningsmottagare med SEND_PERMISSION för SMS Retriever Auth för Google Play-tjänster säkerställer du att ett intent kommer från Play-tjänster.

Alternativ 3: Säkerställ att intentet som ska omdirigeras inte är skadligt.

Kontrollera att det omdirigerade intentet

  1. inte skickas till någon av appens privata komponenter
  2. inte skickas till en extern apps komponent. Om omdirigeringen är avsedd att vara inriktad på en extern app bör du se till att intentet inte ger URI-behörighet till någon av appens privata innehållsleverantörer eller systemdata.

Du kan kontrollera vilken komponent som intentet ska hanteras med innan det omdirigeras med hjälp av metoder som resolveActivity. Exempel:

 Intent intent = getIntent();
 // extrahera det kapslade intentet
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // hämta komponentens namn
 ComponentName name = forward.resolveActivity(getPackageManager());
 // kontrollera att paketets namn och klassens namn är de avsedda
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // omdirigera det kapslade intentet
   startActivity(forward);
 }

Du kan kontrollera om ett intent ger URI-behörighet med metoder som getFlags. Exempel:

 // extrahera det kapslade intentet
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // hämta flaggorna
 int flags = forward.getFlags();
 // kontrollera att det kapslade intentet inte ger URI-behörighet
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // omdirigera det kapslade intentet
   startActivity(forward);
 }

Du kan även ta bort beviljanden av URI-behörigheter med removeFlags. Exempel:

 // osäkert intent
 Intent intent = getIntent();
 // ta bort den beviljade URI-behörigheten från det osäkra intentet
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // tilldela det osäkra intentet
 setResult(intent);

Förstå varningar och välja ett alternativ för uteslutning 

Varningar i Play Console rapporterar var appen anropar startActivity, startActivityForResult, startService, sendBroadcast eller setResult med ett osäkert intent. Om du vill veta mer om vilket alternativ för uteslutning som är mest lämpligt kan du spåra bakåt och titta på metodanrop för att identifiera ursprunget för det osäkra intentet. För alternativ 1 spårar du exempelvis bakåt för att avgöra vilken komponent som du vill göra privat.

Vi hjälper dig gärna

Om du har tekniska frågor som handlar om säkerhetsbristen kan du ställa dem på Stack Overflow. Använd taggen android-security. Om du behöver mer information om hur du åtgärdar problemet kontaktar du vårt supportteam för utvecklare.

false
Huvudmeny
14032918293675916416
true
Sök i hjälpcentret
true
true
true
true
true
5016068
false
false