Uklanjanje ranjivosti na preusmjeravanje namjere

Ove su informacije namijenjene razvojnim programerima aplikacija koje su ranjive na preusmjeravanje namjere.

Što se događa

Barem jedna vaša aplikacija ima poteškoću preusmjeravanja namjere, što može omogućiti zlonamjernim aplikacijama da pristupaju privatnim komponentama ili datotekama aplikacija. Pregledajte detaljne upute u nastavku kako biste riješili problem s aplikacijama. Aplikacije koje budu sadržavale neriješene sigurnosne ranjivosti nakon rokova prikazanih na vašoj Play konzoli uklonit će se s Google Playa.

Potrebna je radnja​

  1. Prijavite se na Play konzolu i u odjeljku Upozorenja pogledajte koje su aplikacije podložne ranjivostima i koji su rokovi za rješavanje tih poteškoća.
  2. Ažurirajte ranjive aplikacije prema uputama u nastavku.
  3. Pošaljite ažurirane verzije ranjivih aplikacija.

Nakon slanja ponovo ćemo pregledati vašu aplikaciju. Taj postupak može trajati nekoliko sati. Ako aplikacija prođe pregled i uspješno se objavi, ne morate više ništa poduzimati. Ako aplikacija ne prođe pregled, nova verzija aplikacije neće se objaviti i dobit ćete obavijest e-poštom.

Dodatne pojedinosti

Upotreba nepouzdane namjere za pokretanje komponente (na primjer pozivanje metode startActivity) ili vraćanje podataka (na primjer pozivanje metode setResult) opasno je i može omogućiti zlonamjernim aplikacijama da uzrokuju sljedeće probleme: 

  1. krađa osjetljivih datoteka ili podataka sustava (kao što su SMS poruke) iz aplikacije
  2. pokretanje privatnih komponenti aplikacije sa zatrovanim argumentima.

Važno je da vaša aplikacija ne poziva startActivity, startService, sendBroadcast ili setResult za nepouzdane namjere bez potvrđivanja ili zaštite tih namjera.

Preporučujemo da spriječite tu ranjivost na jedan od sljedećih načina:

Prva opcija: ranjivu komponentu aplikacije, iz koje se izdvojena namjera preusmjerava, postavite kao privatnu.

Ako ranjiva komponenta aplikacije ne treba primati namjere od drugih aplikacija, tu komponentu možete postaviti kao privatnu tako što ćete u manifestu postaviti android:exported=”false”.

Druga opcija: pobrinite se da izdvojena namjera bude iz pouzdanog izvora.

Pouzdanost izvorne aktivnosti možete potvrditi metodama kao što je getCallingActivity. Na primjer:

 // 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);
 }

Napomena:

  • Provjeravanje vraća li getCallingActivity() vrijednost koja nije "null" nije dovoljno za sprječavanje ranjivosti. Zlonamjerne aplikacije mogu navesti vrijednost "null" za tu funkciju.
  • Ako koristite Google Play Services SMS Retriever Auth, zaštitom prijamnika emitiranja pomoću dopuštenja SEND_PERMISSION osigurat će se da namjera dolazi s usluga za Play.

Treća opcija: pobrinite se da namjera koja se preusmjerava nije štetna.

Trebali biste potvrditi:

  1. da se preusmjerena namjera neće slati nijednoj privatnoj komponenti vaše aplikacije i
  2. da se preusmjerena namjera neće slati komponenti vanjske aplikacije. Ako je namjera preusmjeravanja ciljati vanjsku aplikaciju, pobrinite se da namjera ne odobrava dopuštenje za URI-je jednom od privatnih davatelja sadržaja vaše aplikacije ili podacima o sustavu.

Aplikacije mogu provjeriti koja će se komponenta koristiti za rukovanje namjerom prije njezinog preusmjeravanja pomoću metoda kao što je resolveActivity. Na primjer:

 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);
 }

Aplikacije mogu provjeriti odobrava li namjera dopuštenje za URI-je pomoću metoda kao što je getFlags. Na primjer:

 // izdvoji ugniježđenu namjeru
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// preuzmi oznake
int flags = forward.getFlags();
// provjeri da ugniježđena namjera ne daje dopuštenje za URI-je
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
(flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
// preusmjeri ugniježđenu namjeru
startActivity(forward);
}

Aplikacije mogu i ukloniti odobrenja dopuštenja za URI-je pomoću metode removeFlags. Na primjer:

// nepouzdana namjera
Intent intent = getIntent();
// ukloni odobrenje dopuštenja za URI-je u nepouzdanoj namjeri
intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// proslijedi nepouzdanu namjeru
setResult(intent);

Razumijevanje upozorenja i odabir opcije sprečavanja 

Upozorenje Play konzole izvještava o tome gdje vaša aplikacija poziva startActivity, startActivityForResult, startService, sendBroadcast ili setResult pomoću nepouzdane namjere. Da biste bolje shvatili koja je opcija prevencije najprikladnija, vratite se i pogledajte pozivatelje metoda kako biste saznali odakle potječe nepouzdana namjera. Na primjer, za prvu opciju vratite se da biste utvrdili koju komponentu treba postaviti kao privatnu.

Obratite nam se ako vam zatreba pomoć

Ako imate tehnička pitanja o toj ranjivosti, možete objaviti post na Stack Overflowu uz oznaku "android-security". Za upute za rješavanje te poteškoće možete se obratiti našem timu za podršku razvojnim programerima.

false
Glavni izbornik
4577664815541876262
true
Pretraži Centar za pomoć
true
true
true
true
true
5016068
false
false