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

Použití nedůvěryhodného objektu Intent ke spuštění komponenty (např. voláním metody startActivity) nebo k vrácení dat (např. voláním metody setResult) je nebezpečné a může umožnit škodlivým aplikacím způsobit následující problémy: 

  1. odcizit z aplikace citlivé soubory nebo systémová data (např. SMS),
  2. spustit soukromé komponenty aplikace s nekale upravenými argumenty.

Je důležité, aby aplikace nevolala metody startActivity, startService, sendBroadcast ani setResult u nedůvěryhodných objektů Intent, aniž by tyto objekty nejprve ověřila nebo vyčistila.

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

Poznámka:

  • Kontrola, zda metoda getCallingActivity() vrací jinou hodnotu než null, k prevenci této chyby zabezpečení nestačí. Škodlivé aplikace u této funkce mohou vracet hodnotu null.
  • Pokud používáte ověření pomocí rozhraní Služeb Google Play SMS Retriever a ochráníte přijímač vysílání oprávněním SEND_PERMISSION, zajistíte tím, aby objekt Intent pocházel ze Služeb Play.

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. nebyl odeslán do komponenty externí aplikace. Pokud má přesměrování cílit na externí aplikaci, zajistěte, aby objekt Intent neuděloval oprávnění URI k žádnému ze soukromých poskytovatelů obsahu aplikace ani k systémovým datům.

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

Aplikace také mohou udělená oprávnění k adresám URI odebírat pomocí metody removeFlags. Příklad:

 // untrusted Intent
 Intent intent = getIntent();
 // odstranit udělená oprávnění URI v nedůvěryhodném objektu Intent
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // předat nedůvěryhodný objekt Intent
 setResult(intent);

Vysvětlení upozornění a výběr možnosti prevence 

V upozornění služby Play Console je uvedeno, kde aplikace volá metodu startActivity, startActivityResult, startService, sendBroadcast nebo setResult pomocí nedůvěryhodného objektu Intent. Pokud chcete zjistit, která možnost prevence je pro vás nejvhodnější, trasujte volání zpět a podívejte se, odkud volání nedůvěryhodných objektů Intent pochází. Například v případě možnosti 1 pomocí zpětného trasování určete, kterou komponentu je potřeba nastavit jako soukromou.

Rádi vám poradíme

Případné technické dotazy ohledně této zranitelnosti publikuje 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.

false
Hlavní nabídka
3785961952741650855
true
Prohledat Centrum nápovědy
true
true
true
true
true
5016068
false
false