Oprava chyby zabezpečení před útoky přesměrováním objektů Intent

Tyto informace jsou určeny vývojářům aplikací, které nejsou zabezpečené proti napadení přesměrováním objektů Intent.

K čemu dochází

U jedné nebo více vašich aplikací se vyskytuje problém s přesměrováním objektů Intent, který škodlivým aplikacím může umožnit přístup k soukromým komponentám aplikací nebo souborům. Opravte chybu v aplikacích podle následujících podrobných pokynů. Po termínech uvedených v Play Console budou všechny aplikace s neopravenými chybami zabezpečení z Google Play odstraněny.

Vyžadovaná akce

  1. Přihlaste se do Play Console a přejděte do sekce Upozornění, kde zjistíte, kterých aplikací se tento problém týká a do kdy je potřeba jej vyřešit.
  2. Aktualizujte dotčené aplikace podle níže uvedených pokynů.
  3. Odešlete aktualizované verze dotčených aplikací.

Po odeslání bude aplikace znovu zkontrolována. Tento proces může trvat několik hodin. Pokud aplikace při kontrole projde a bude úspěšně publikována, není potřeba podnikat žádné další kroky. Jestliže aplikace při kontrole neprojde, nová verze aplikace nebude publikována a obdržíte e‑mailem oznámení.

Další podrobnosti

Aplikace, které extrahují objekty Intent z pole Extras nedůvěryhodného objektu Intent a spouštějí nějakou komponentu voláním metody startActivity (nebo startService) na extrahovaném objektu Intent, lze podvodně přimět ke spuštění nechtěné soukromé komponenty. To může vést buď (1) k provedení citlivých akcí s upravenými argumenty, nebo (2) k odcizení citlivých souborů prostřednictvím udělených oprávnění k identifikátorům URI.

Doporučujeme, abyste této chybě zabezpečení zabránili jedním z následujících způsobů:

Možnost 1: Dotčenou komponentu aplikace, ze které se extrahovaný objekt Intent přesměrovává, nastavte jako soukromou.

Pokud dotčená komponenta aplikace nepotřebuje přijímat prvky Intent z jiných aplikací, můžete ji nastavit jako soukromou tím, že v Manifestu nastavíte android:exported="false"

Možnost 2: Zkontrolujte, zda extrahovaný objekt Intent pochází z důvěryhodného zdroje.

K ověření, zda lze zdrojové aktivitě důvěřovat, můžete použít metody jako getCallingActivity. Pří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);
 }

Možnost 3: Zajistěte, aby přesměrovávaný objekt Intent nebyl škodlivý.

Měli byste zajistit, aby přesměrovaný objekt Intent:

  1. nebyl odeslán do žádné soukromé komponenty aplikace a
  2. neuděloval oprávnění URI k žádnému ze soukromých poskytovatelů obsahu aplikace.

Před přesměrováním objektu Intent mohou aplikace pomocí metod, jako je resolveActivity, zkontrolovat, která komponenta bude použita k jeho zpracování. Pří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);
 }

Kontrolu, zda objekt Intent uděluje oprávnění k URI, lze v aplikacích provést pomocí metod, jako je getFags. Pří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);
 }

Rádi vám poradíme

Máte-li ohledně této zranitelnosti technické dotazy, publikuje příspěvek na webu Stack Overflow. Použijte štítek „android-security“. Pokud potřebujete poradit s jednotlivými kroky k řešení tohoto problému, obraťte se na náš tým podpory pro vývojáře.