Chyba zabezpečení před útoky typu Path Traversal

Tyto informace jsou určeny vývojářům aplikací, které nejsou zabezpečeny proti útokům typu Path Traversal.

K čemu dochází

Od 16. ledna 2018 služba Google Play začala blokovat publikování nových aplikací a aktualizací, které nejsou zabezpečeny proti útokům typu Path Traversal. Další informace najdete v oznámení ve službě Play Console. Po termínech uvedených v Play Console mohou být 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 a chybu zabezpečení opravte.
  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

Implementace metody openFile v exportovaných objektech ContentProvider mohou být zranitelné, pokud v nich nejsou správně ověřovány příchozí parametry Uri. Předáním speciálně vytvořeného parametru Uri (např. s řetězcem /../) může škodlivá aplikace vaši aplikaci přimět k vrácení popisovače ParcelFileDescriptor souboru mimo zamýšlený adresář. Škodlivá aplikace se tak může dostat k libovolnému souboru, který je přístupný vaší aplikaci.

Chybu zabezpečení proti útokům Path Traversal lze v objektech ContentProvider odstranit dvěma způsoby.

1. Pokud ContentProvider nemusí být dostupný ostatním aplikacím:

  • V manifestu můžete upravit značku <provider> příslušného objektu ContentProvider tak, aby obsahovala atribut android:exported="false". Tím zajistíte, že mu ostatní aplikace nebudou moci odesílat objekty Intent.
  • Můžete také nastavit atribut android:permission na oprávnění (permission) s atributem android:protectionLevel="signature". Objekty Intent pak příslušnému ContentProvideru budou moci odesílat pouze vaše aplikace (aplikace jiných vývojářů nikoliv). 

2. Pokud ContentProvider musí být dostupný ostatním aplikacím:

Je potřeba zajistit, aby vstupní parametry metody openFile se znaky, které lze zneužít k útokům Path Traversal, nemohly způsobit, že aplikace vrátí neočekávané soubory. Můžete to provést zkontrolováním kanonické cesty souboru. Příklad:

public ParcelFileDescriptor openFile (Uri uri, String mode)
   throws FileNotFoundException {
 File f = new File(DIR, uri.getLastPathSegment());
 if (!f.getCanonicalPath().startsWith(DIR)) {
   throw new IllegalArgumentException();
 }
 return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
 

Upozornění: Volání metody getLastPathSegment na parametr Uri není bezpečné. Škodlivá aplikace totiž může cestu Uri předat zakódovanou. Pokud například předá cestu %2F..%2F..%2Ftajne%2Fsoubor.txt, výsledkem volání metody getLastPathSegment bude řetězec /../../tajne/soubor.txt. Následující implementace je proto zranitelná.

public ParcelFileDescriptor openFile(Uri uri, String mode){
 File f = new File(DIR, uri.getLastPathSegment());
 return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
 

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.