Ukrepanje za odpravo ranljivosti zaradi preusmeritve namena

Te informacije so namenjene razvijalcem aplikacij, ki vsebujejo ranljivost zaradi preusmeritve namena.

Kaj se dogaja?

Ena ali več vaših aplikacij vsebuje težavo zaradi preusmeritve namena, ki lahko zlonamernim aplikacijam omogoči dostop do zasebnih komponent ali datotek aplikacij. Oglejte si podrobna postopka spodaj, da odpravite težave z aplikacijami. Morebitne aplikacije, ki imajo po rokih, navedenih v Konzoli Play, še vedno varnostne ranljivosti, bodo odstranjene iz Googla Play.

Potrebno ukrepanje

  1. Prijavite se v Konzolo Play in pojdite v razdelek Opozorila, kjer si lahko ogledate aplikacije, na katere se to nanaša, in roke, do katerih je treba odpraviti težave.
  2. Aplikacije, na katere se to nanaša, posodobite s postopkom, opisanim spodaj.
  3. Pošljite posodobljene različice aplikacij, na katere se to nanaša.

Ko aplikacijo znova pošljete, jo bomo spet pregledali. Ta postopek lahko traja več ur. Če aplikacija uspešno opravi pregled in je objavljena, ni potrebno dodatno ukrepanje. Če pregled ni uspešen, nova različica aplikacije ne bo objavljena in boste prejeli e-poštno obvestilo.

Dodatne informacije

Uporaba zaupanja nevrednega namena za zagon komponente (na primer s klicem metode startActivity) ali prikazovanje podatkov (na primer s klicem metode setResult) je nevarna in lahko zlonamernim aplikacijam omogoča povzročanje tovrstnih težav: 

  1. Krajo občutljivih datotek ali sistemskih podatkov (na primer sporočil SMS) iz aplikacije.
  2. Zagon zasebnih komponent aplikacije z »zastrupljenimi« argumenti.

Pomembno je, da vaša aplikacija ne kliče metode startActivity, startService, sendBroadcast ali setResult oziroma zaupanja nevrednih namenov brez preverjanja oziroma prečiščenja teh namenov.

Priporočamo, da to ranljivost preprečite na enega od teh načinov:

1. možnost: Komponento, na katero to vpliva, iz katere se preusmeri pridobljeni namen, nastavite tako, da je zasebna.

Če zadevna komponenta ne prejema namenov iz drugih aplikacij, lahko določite, da je zasebna, in sicer tako, da v manifestu nastavite android:exported=”false”.

2. možnost: Poskrbite, da bo pridobljeni namen iz zaupanja vrednega vira.

Če želite preveriti, ali je izvorna dejavnost zaupanja vredna, lahko uporabite metode, kot je getCallingActivity. Primer:

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

Opomba:

3. možnost: Poskrbite, da namen, ki bo preusmerjen, ni škodljiv.

Prepričajte se, da preusmerjeni namen

  1. ne bo poslan v katero od zasebnih komponent vaše aplikacije; in
  2. ne bo poslan v komponento zunanje aplikacije. Če je namen preusmeritve ciljanje zunanje aplikacije, poskrbite, da namen ne bo podelil dovoljenja za URI kateremu od zasebnih ponudnikov vsebine vaše aplikacije ali sistemskim podatkom.

Aplikacije lahko z metodami, kot je resolveActivity, preverijo, katera komponenta bo uporabljena za ravnanje z namenom, preden ga preusmerijo. Primer:

 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 lahko z metodami, kot je getFlags, preverijo, ali namen podeli dovoljenje za URI. Primer:

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

Aplikacije lahko prav tako odstranijo podelitve dovoljenj za URI z metodo removeFlags. Primer:

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

Razumevanje opozoril in izbire možnosti preprečevanja 

Opozorilo Konzole Play sporoči, kje aplikacija začne klicati metodo startActivity, startActivityForResult, startService, sendBroadcast ali setResult z zaupanja nevrednim namenom. Zaradi boljšega razumevanja, katera možnost za preprečevanje je najustreznejša, preučite kodo in si oglejte klicatelje metod, da ugotovite izvor zaupanja nevrednega namena. Pri 1. možnosti preučite kodo, da ugotovite, katero komponento morate določiti kot zasebno.

Tu smo, da vam pomagamo

Če imate tehnična vprašanja glede ranljivosti, jih objavite v skupnosti Stack Overflow in uporabite oznako »android-security«. Če potrebujete pojasnilo postopka, ki ga morate uporabiti, če želite odpraviti to težavo, se lahko obrnete na skupino za podporo razvijalcem.

false
Glavni meni
12450147585838809884
true
Iskanje v centru za pomoč
true
true
true
true
true
5016068
false
false