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
- 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.
- Aktualizujte dotčené aplikace a chybu zabezpečení opravte.
- 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.