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
- 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.
- Aplikacije, na katere se to nanaša, posodobite s postopkom, opisanim spodaj.
- 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:
- Krajo občutljivih datotek ali sistemskih podatkov (na primer sporočil SMS) iz aplikacije.
- 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:
- Preverjanje, ali funkcija getCallingActivity() vrne vrednost, ki ni enaka nič, ne zadošča za preprečevanje ranljivosti. Zlonamerne aplikacije lahko zagotovijo vrednost nič za to funkcijo.
- V primeru preverjanja pristnosti pri prenosu sporočil SMS za Storitve Google Play zaščita sprejemnika oddaje z dovoljenjem SEND_PERMISSION zagotavlja, da namen prihaja iz Storitev Play.
3. možnost: Poskrbite, da namen, ki bo preusmerjen, ni škodljiv.
Prepričajte se, da preusmerjeni namen
- ne bo poslan v katero od zasebnih komponent vaše aplikacije; in
- 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.