Oprava chyby zabezpečenia presmerovania intencie

Tieto informácie sú určené pre vývojárov aplikácií, ktoré obsahujú chybu zabezpečenia presmerovania intencie.

Čo sa deje

Minimálne jedna vaša aplikácia obsahuje problém s presmerovaním intencie, ktorý môže umožniť škodlivým aplikáciám prístup k súkromným prvkom alebo súborom aplikácie. Problém s aplikáciou vyriešte podľa podrobných pokynov uvedených nižšie. Po uplynutí termínov uvedených v službe Play Console budú všetky aplikácie s neopravenými chybami zabezpečenia odstránené zo služby Google Play.

Vyžaduje sa akcia​

  1. Prihláste sa do služby Play Console, prejdite do sekcie Upozornenia a pozrite si termíny, dokedy treba problémy vyriešiť, ako aj aplikácie, ktorých sa to týka.
  2. Aktualizujte dotyčné aplikácie pomocou pokynov zvýraznených nižšie.
  3. Odošlite aktualizované verzie dotyčných aplikácií.

Po opätovnom odoslaní bude vaša aplikácia znova skontrolovaná. Tento proces môže trvať niekoľko hodín. Ak aplikácia úspešne prejde kontrolou a bude zverejnená, nie je potrebné vykonať žiadne ďalšie kroky. Ak aplikácia neprejde kontrolou, jej nová verzia sa nezverejní a dostanete upozornenie e‑mailom.

Ďalšie podrobnosti

Spustenie komponentu (napríklad volaním funkcie startActivity) alebo vrátenie údajov (napríklad volaním funkcie setResult) pomocou nedôveryhodnej intencie je nebezpečné a môže škodlivým aplikáciám napríklad umožniť: 

  1. kradnúť citlivé údaje alebo údaje systému (napríklad správy SMS) z aplikácie;
  2. spúšťať súkromné komponenty aplikácie s nebezpečnými argumentmi.

Je dôležité, aby aplikácia nevolala funkciu startActivity, startService, sendBroadcast ani setResult v nedôveryhodných intenciách bez ich overenia alebo očistenia.

Túto chybu zabezpečenia odporúčame vyriešiť jedným z nasledujúcich spôsobov:

1. možnosť: zmeňte ovplyvnený komponent aplikácie, z ktorého je extrahovaná intencia presmerovaná, na súkromný.

Ak ovplyvnený komponent aplikácie nepotrebuje prijímať intencie z ostatných aplikácií, môžete ho zmeniť na súkromný nastavením hodnoty android:exported=”false” v manifeste.

2. možnosť: zaistite, aby extrahovaná intencia pochádzala z dôveryhodného zdroja.

Dôveryhodnosť pôvodnej aktivity môžete overiť metódami, ako je getCallingActivity. Príklad:

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

Poznámka:

  • Kontrolou toho, či getCallingActivity() vracia nenulovú hodnotu, nezabránite tejto chybe zabezpečenia. Škodlivé aplikácie môžu pre túto funkciu poskytnúť nulovú hodnotu.
  • V prípade overenia Google Play Services SMS Retriever Auth zaistíte ochranou nástroja broadcast receiver povolením SEND_PERMISSION, že intencia bude pochádzať zo Služieb Play.

3. možnosť: zaistite, aby intencia, ktorá sa má presmerovať, nebola škodlivá.

Mali by ste overiť, či presmerovaná intencia

  1. nebude odoslaná do žiadneho súkromného komponentu aplikácie,
  2. nebude odoslaná do externého komponentu aplikácie. Ak má byť presmerovanie zacielené na externú aplikáciu, zaistite, aby intencia neudelila povolenie URI niektorému súkromnému poskytovateľovi obsahu vašej aplikácie alebo údajom systému.

Aplikácie môžu skontrolovať, pomocou ktorého komponentu sa intencia spracuje pred presmerovaním, a to metódami, ako je resolveActivity. Príklad:

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

Aplikácie môžu skontrolovať, či intencia udeľuje povolenie URI metódami, ako je getFlags. Príklad:

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

Aplikácie môžu udelenia povolení URI odstrániť aj metódou removeFlags. Príklad:

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

Vysvetlenie upozornení a výber možnosti prevencie

Upozornenie služby Play Console nahlási, kde vaša aplikácia volá funkcie startActivity, startActivityForResult, startService, sendBroadcast alebo setSet pomocou nedôveryhodnej intencie. Ak chcete lepšie porozumieť, ktorá možnosť prevencie je najvhodnejšia, spätne sledujte a skontrolujte volania metód. Zistíte tak pôvod nedôveryhodnej intencie. Napríklad pri prvej možnosti spätným sledovaním určite, ktorý komponent treba nastaviť ako súkromný.

Sme tu pre vás

Ak máte technické otázky týkajúce sa nedostatkov zabezpečenia, uverejnite príspevok vo fóre Stack Overflow a použite značku android-security. Ak potrebujete pomoc s jednotlivými krokmi potrebnými na vyriešenie tohto problému, obráťte sa na tím podpory pre vývojárov.

false
Hlavná ponuka
14184238118031261654
true
Vyhľadávanie v Centre pomoci
true
true
true
true
true
5016068
false
false