Kategoria OWASP: MASVS-STORAGE: Storage
Omówienie
Ten dokument dotyczy kilku problemów związanych z uwzględnianiem plików, które mają podobne rozwiązania. Te problemy dotyczą luk w zabezpieczeniach związanych z dostępem do plików w komponencie WebView. Zakres problemów obejmuje niebezpieczne WebSettings
, które zezwala na dostęp do plików, lub włączanie JavaScriptu w ramach metody WebKit, która tworzy żądanie wyboru pliku. Ten dokument powinien okazać się przydatny, jeśli szukasz wskazówek dotyczących rozwiązywania problemów w komponencie WebView wynikających z użycia schematu file://
, nieograniczonego dostępu do plików lokalnych i ataków typu cross-site scripting.
W szczególności dokument ten dotyczy tych tematów:
WebSettings
to klasa zawierająca metody, które zarządzają stanami ustawień WebView. Te metody mogą otwierać WebView na różne ataki, które zostaną omówione później. W tym dokumencie omówimy metody dostępu do plików i ustawienie, które umożliwia wykonywanie kodu JavaScript:- Metod
setAllowFileAccess
,setAllowFileAccessFromFileURLs
isetAllowUniversalAccessFromFileURLs
można używać do przyznawania dostępu do plików lokalnych za pomocą adresu URL schematu pliku (file://
). Mogą one jednak zostać wykorzystane przez złośliwe skrypty do uzyskania dostępu do dowolnych plików lokalnych, do których aplikacja ma dostęp, takich jak własny folder/data/
. Z tego powodu te metody zostały oznaczone jako niezabezpieczone i wycofane w wersji interfejsu API 30 na rzecz bezpieczniejszych alternatyw, takich jakWebViewAssetLoader
. - Metody
setJavascriptEnabled
można używać do włączania wykonywania kodu JavaScript w komponentach WebView. W efekcie aplikacje są podatne na ataki typu XSS na poziomie pliku. Szczególnie wtedy, gdy aplikacja jest skonfigurowana tak, aby zezwalać na wczytywanie plików lokalnych lub niesprawdzonych treści internetowych, które mogą zawierać kod wykonywalny, zezwala na dostęp do plików, które mogą być tworzone lub zmieniane przez zewnętrzne źródła, lub zezwala komponentom WebView na wykonywanie kodu JavaScript, użytkownicy i ich dane są narażeni na ryzyko. WebChromeClient.onShowFileChooser
to metoda należąca do pakietuandroid.webkit
, który udostępnia narzędzia do przeglądania stron internetowych. Ta metoda może służyć do umożliwienia użytkownikom wybierania plików w komponencie WebView. Można jednak nadużyć tej funkcji, ponieważ WebViews nie narzuca ograniczeń dotyczących wybranego pliku.
Wpływ
Wpływ uwzględniania plików może zależeć od tego, jakie ustawienia WebSettings są skonfigurowane w WebView. Zbyt szerokie uprawnienia do plików mogą umożliwiać osobom przeprowadzającym atak dostęp do plików lokalnych i kradzież danych wrażliwych, informacji umożliwiających identyfikację lub prywatnych danych aplikacji. Włączenie wykonywania kodu JavaScript może umożliwić atakującym uruchamianie kodu JavaScript w komponencie WebView lub na urządzeniu użytkownika. Pliki wybrane za pomocą metody onShowFileChooser
mogą zagrażać bezpieczeństwu użytkownika, ponieważ nie ma możliwości sprawdzenia przez tę metodę ani przez WebView, czy źródło pliku jest zaufane.
Ryzyko: ryzykowny dostęp do plików przez file://
Włączenie opcji setAllowFileAccess
, setAllowFileAccessFromFileURLs
i setAllowUniversalAccessFromFileURLs
może umożliwić złośliwym intensom i żądaniom WebView z kontekstem file://
dostęp do dowolnych plików lokalnych, w tym plików cookie WebView i prywatnych danych aplikacji. Ponadto metoda onShowFileChooser
umożliwia użytkownikom wybieranie i pobieranie plików z niezaufanych źródeł.
W zależności od konfiguracji aplikacji te metody mogą prowadzić do wycieku informacji umożliwiających identyfikację, danych logowania lub innych danych wrażliwych.
Środki zaradcze
Weryfikowanie adresów URL plików
Jeśli Twoja aplikacja wymaga dostępu do plików za pomocą adresów URL file://
, ważne jest, aby do listy dozwolonych dodać tylko te adresy URL, które są znane jako prawidłowe, unikając typowych błędów.
Używanie WebViewAssetLoader
Zamiast wymienionych metod użyj metody WebViewAssetLoader
. Ta metoda używa schematu http(s)//:
zamiast schematu file://
do uzyskiwania dostępu do zasobów lokalnego systemu plików i nie jest podatna na opisany atak.
Kotlin
val assetLoader: WebViewAssetLoader = Builder()
.addPathHandler("/assets/", AssetsPathHandler(this))
.build()
webView.setWebViewClient(object : WebViewClientCompat() {
@RequiresApi(21)
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse {
return assetLoader.shouldInterceptRequest(request.url)
}
@Suppress("deprecation") // for API < 21
override fun shouldInterceptRequest(view: WebView?, url: String?): WebResourceResponse {
return assetLoader.shouldInterceptRequest(Uri.parse(url))
}
})
val webViewSettings: WebSettings = webView.getSettings()
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.allowFileAccessFromFileURLs = false
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.allowUniversalAccessFromFileURLs = false
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.allowFileAccess = false
webViewSettings.allowContentAccess = false
// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webView.loadUrl("https://appassets.androidplatform.net/assets/www/index.html")
Java
final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
.addPathHandler("/assets/", new AssetsPathHandler(this))
.build();
webView.setWebViewClient(new WebViewClientCompat() {
@Override
@RequiresApi(21)
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return assetLoader.shouldInterceptRequest(request.getUrl());
}
@Override
@SuppressWarnings("deprecation") // for API < 21
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return assetLoader.shouldInterceptRequest(Uri.parse(url));
}
});
WebSettings webViewSettings = webView.getSettings();
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.setAllowFileAccessFromFileURLs(false);
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.setAllowUniversalAccessFromFileURLs(false);
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.setAllowFileAccess(false);
webViewSettings.setAllowContentAccess(false);
// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webview.loadUrl("https://appassets.androidplatform.net/assets/www/index.html");
Wyłączanie niebezpiecznych metod WebSettings
Wartości metod setAllowFileAccess()
,
setAllowFileAccessFromFileURLs()
i setAllowUniversalAccessFromFileURLs()
są domyślnie ustawione na TRUE
w przypadku poziomu API 29 lub niższego oraz na FALSE
w przypadku poziomu API 30 lub wyższego.
Jeśli trzeba skonfigurować inne WebSettings
, najlepiej wyraźnie wyłączyć te metody, zwłaszcza w przypadku aplikacji kierowanych na interfejs API na poziomie 29 lub niższym.
Zagrożenie: atak typu XSS na poziomie pliku
Ustawienie metody setJavacriptEnabled
na TRUE
umożliwia wykonywanie kodu JavaScript w komponencie WebView. W połączeniu z włączonym dostępem do plików, jak opisano wcześniej, możliwe jest XSS oparte na plikach, które polega na wykonaniu kodu w dowolnych plikach lub złośliwych witrynach otwieranych w komponencie WebView.
Środki zaradcze
Uniemożliwianie komponentom WebView wczytywania plików lokalnych
Podobnie jak w przypadku poprzedniego zagrożenia, ataku typu XSS na poziomie pliku można uniknąć, jeśli ustawienia setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
i setAllowUniversalAccessFromFileURLs()
mają wartość FALSE
.
Zapobieganie wykonywaniu kodu JavaScript przez WebViews
Ustaw metodę setJavascriptEnabled
na FALSE
, aby uniemożliwić wykonywanie kodu JavaScript w komponencie WebView.
Zadbaj o to, aby komponenty WebView nie wczytywały niezaufanych treści
Czasami w komponencie WebView konieczne jest włączenie tych ustawień. W takim przypadku ważne jest, aby wczytywać tylko zaufane treści. Ograniczenie wykonywania kodu JavaScript tylko do kodu, który jest pod Twoją kontrolą, oraz zablokowanie wykonywania dowolnego kodu JavaScript to jeden ze sposobów na zapewnienie wiarygodności treści. W przeciwnym razie zapobieganie wczytywaniu ruchu w pełnym tekście zapewnia, że komponenty WebView z niebezpiecznymi ustawieniami nie będą mogły wczytywać adresów URL w protokole HTTP. Można to zrobić w pliku manifestu, ustawiając wartość android:usesCleartextTraffic
na False
lub ustawiając wartość Network Security Config
, która zablokuje ruch HTTP.
Materiały
- setAllowUniversalAccessFromFileURLs na stronie referencyjnej API
- setAllowFileAccessFromFileURLs strona referencyjna API
- Strona dokumentacji interfejsu WebViewAssetLoader API
- Dokumentacja CodeQL
- Blog z nadmiernym poziomem zabezpieczeń
- Strona pomocy onShowFileChooser