Te informacje są przeznaczone dla programistów aplikacji, które zawierają lukę dotyczącą przemierzania ścieżki.
O co chodzi?
Od 16 stycznia 2018 r. Google Play blokuje publikowanie nowych aplikacji i aktualizacji zawierających lukę dotyczącą przemierzania ścieżki. Zapoznaj się z powiadomieniem w Konsoli Play. Po przekroczeniu terminów wskazanych w Konsoli Play wszystkie aplikacje z lukami w zabezpieczeniach mogą zostać usunięte z Google Play.
Wymagane działania
- Zaloguj się w Konsoli Play i przejdź do sekcji Alerty, by sprawdzić, których aplikacji dotyczy problem i jaki jest termin jego rozwiązania.
- Zaktualizuj te aplikacje i usuń lukę w zabezpieczeniach.
- Prześlij zaktualizowane wersje tych aplikacji.
Po ponownym przesłaniu aplikacja zostanie jeszcze raz sprawdzona. Ten proces może potrwać kilka godzin. Jeśli aplikacja pomyślnie przejdzie weryfikację i zostanie opublikowana, nie musisz już nic robić. Jeśli wynik weryfikacji nie będzie pomyślny, nowa wersja aplikacji nie zostanie opublikowana, a Ty otrzymasz powiadomienie e-mailem.
Dodatkowe szczegóły
Implementacje funkcji openFile w wyeksportowanych komponentach ContentProvider mogą być podatne na atak, jeśli nieprawidłowo sprawdzają przychodzące parametry identyfikatorów URI. Złośliwa aplikacja może mieć własny identyfikator URI (np. zawierający fragment „/../”), by nakłonić aplikację do zwrócenia deskryptora ParcelFileDescriptor dla pliku spoza oczekiwanego katalogu. Skutkuje to przyznaniem złośliwej aplikacji dostępu do dowolnego pliku, do którego ma dostęp aplikacja.
Do wyeliminowania problemu z luką dotyczącą przemierzania ścieżki w komponencie ContentProvider służą dwie strategie:
1. Jeśli komponent ContentProvider nie musi być widoczny dla innych aplikacji:
- W pliku manifestu możesz zmodyfikować tag <provider> komponentu ContentProvider, którego dotyczy problem, by miał wartość android:exported=”false”. Uniemożliwi to innym aplikacjom wysyłanie intencji do tego komponentu.
- Możesz też określić atrybut android:permission, by element permission miał wartość android:protectionLevel=“signature”. Uniemożliwisz w ten sposób aplikacjom innych deweloperów wysyłanie intencji do komponentu ContentProvider, którego dotyczy problem.
2. Jeśli komponent ContentProvider musi być widoczny dla innych aplikacji:
Upewnij się, że dane wejściowe funkcji openFile, które zawierają znaki przemierzania ścieżki, nie mogą wymóc na aplikacji zwrócenia nieoczekiwanych plików. Możesz to zrobić, sprawdzając ścieżkę kanoniczną pliku. Na przykład:
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);
}
Zastrzeżenie: użycie funkcji getLastPathSegment na parametrze identyfikatora URI nie jest bezpieczne. Złośliwa aplikacja może dostarczyć zakodowaną ścieżkę URI taką jak %2F..%2F..path%2Fto%2Fsecret.txt, co spowoduje, że wynikiem funkcji getLastPathSegment będzie /../../path/to/secret.txt. Na atak wciąż jest podatna na przykład ta implementacja:
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
Chętnie Ci pomożemy
Jeśli masz pytania techniczne związane z tą luką w zabezpieczeniach, możesz je opublikować na Stack Overflow, używając tagu „android-security”. Jeśli potrzebujesz wyjaśnienia czynności potrzebnych do rozwiązania tego problemu, skontaktuj się z naszym zespołem pomocy dla deweloperów.