Webview Attacks
Przewodnik po konfiguracjach i zabezpieczeniach WebView
Przegląd podatności WebView
Krytycznym aspektem rozwoju aplikacji na Androida jest poprawne zarządzanie WebViews. Ten przewodnik podkreśla kluczowe konfiguracje i praktyki związane z bezpieczeństwem w celu zmniejszenia ryzyka związanego z użyciem WebView.
Dostęp do plików w WebViews
Domyślnie WebViews zezwalają na dostęp do plików. Funkcjonalność ta jest kontrolowana przez metodę setAllowFileAccess()
, dostępną od poziomu interfejsu API Androida 3 (Cupcake 1.5). Aplikacje posiadające uprawnienie android.permission.READ_EXTERNAL_STORAGE mogą odczytywać pliki z pamięci zewnętrznej za pomocą schematu adresu URL pliku (file://ścieżka/do/pliku
).
Funkcje przestarzałe: Uniwersalny dostęp i dostęp do plików z adresów URL
Uniwersalny dostęp z adresów URL plików: Ta funkcja, która została oznaczona jako przestarzała, umożliwiała żądania międzydomenowe z adresów URL plików, stanowiąc znaczne ryzyko bezpieczeństwa związanego z potencjalnymi atakami XSS. Domyślne ustawienie to wyłączone (
false
) dla aplikacji kierowanych na Androida Jelly Bean i nowsze.Aby sprawdzić to ustawienie, użyj
getAllowUniversalAccessFromFileURLs()
.Aby zmodyfikować to ustawienie, użyj
setAllowUniversalAccessFromFileURLs(boolean)
.Dostęp do plików z adresów URL plików: Ta również przestarzała funkcja kontrolowała dostęp do treści z innych adresów URL schematu pliku. Podobnie jak w przypadku uniwersalnego dostępu, domyślnie jest wyłączona dla zwiększonego bezpieczeństwa.
Użyj
getAllowFileAccessFromFileURLs()
do sprawdzenia isetAllowFileAccessFromFileURLs(boolean)
do ustawienia.
Bezpieczne ładowanie plików
Aby wyłączyć dostęp do systemu plików, zachowując jednocześnie dostęp do zasobów i zasobów, używana jest metoda setAllowFileAccess()
. Dla Androida R i nowszych, domyślne ustawienie to false
.
Sprawdź za pomocą
getAllowFileAccess()
.Włącz lub wyłącz za pomocą
setAllowFileAccess(boolean)
.
WebViewAssetLoader
Klasa WebViewAssetLoader to nowoczesne podejście do ładowania plików lokalnych. Wykorzystuje adresy URL http(s) do dostępu do lokalnych zasobów i zasobów, zgodnie z zasadą tego samego pochodzenia, ułatwiając zarządzanie CORS.
loadUrl
To powszechna funkcja używana do ładowania dowolnych adresów URL w WebView:
Oczywiście, potencjalny atakujący nie powinien nigdy móc kontrolować adresu URL, który ma zostać załadowany przez aplikację.
Obsługa JavaScript i schematu Intent
JavaScript: Domyślnie wyłączony w WebViews, może być włączony za pomocą
setJavaScriptEnabled()
. Zaleca się ostrożność, ponieważ włączenie JavaScript bez odpowiednich zabezpieczeń może wprowadzić podatności na bezpieczeństwo.Schemat Intent: WebViews mogą obsługiwać schemat
intent
, co potencjalnie prowadzi do eksploatacji, jeśli nie jest ostrożnie zarządzany. Przykładem podatności było ujawnione parametru WebView "support_url", który mógł być wykorzystany do wykonania ataków typu cross-site scripting (XSS).
Przykład eksploatacji za pomocą adb:
Most JavaScript Bridge
Android udostępnia funkcję, która umożliwia JavaScript w WebView wywoływanie funkcji natywnych aplikacji Android. Jest to osiągane poprzez wykorzystanie metody addJavascriptInterface
, która integruje JavaScript z funkcjami natywnymi Androida, określanymi jako most JavaScript WebView. Zaleca się ostrożność, ponieważ ta metoda pozwala wszystkim stronom w WebView na dostęp do zarejestrowanego obiektu interfejsu JavaScript, co stanowi ryzyko bezpieczeństwa, jeśli wrażliwe informacje są ujawnione poprzez te interfejsy.
Wymagana jest skrajna ostrożność dla aplikacji kierowanych do wersji Androida poniżej 4.2 z powodu podatności umożliwiającej zdalne wykonanie kodu poprzez złośliwy JavaScript, wykorzystujący odbicie.
Implementacja mostu JavaScript
Interfejsy JavaScript mogą współdziałać z kodem natywnym, jak pokazano w przykładach, gdzie metoda klasy jest udostępniana JavaScriptowi:
JavaScript Bridge jest włączony poprzez dodanie interfejsu do WebView:
Potencjalne wykorzystanie poprzez JavaScript, na przykład za pomocą ataku XSS, umożliwia wywołanie ujawnionych metod Java:
Aby zmniejszyć ryzyko, ogranicz używanie mostka JavaScript do kodu dostarczonego w pliku APK i zapobiegaj ładowaniu JavaScript z zdalnych źródeł. Dla starszych urządzeń ustaw minimalny poziom API na 17.
Wykonanie zdalnego kodu oparte na refleksji (RCE)
Udokumentowana metoda pozwala osiągnąć RCE poprzez refleksję poprzez wykonanie określonej ładunku. Jednak adnotacja
@JavascriptInterface
zapobiega nieautoryzowanemu dostępowi do metody, ograniczając powierzchnię ataku.
Zdalne debugowanie
Zdalne debugowanie jest możliwe dzięki Chrome Developer Tools, umożliwiając interakcję i dowolne wykonanie JavaScript w treści WebView.
Włączanie zdalnego debugowania
Zdalne debugowanie można włączyć dla wszystkich WebViews w aplikacji poprzez:
Aby warunkowo włączyć debugowanie na podstawie stanu debugowania aplikacji:
Wyciek dowolnych plików
Demonstruje wyciek dowolnych plików za pomocą obiektu XMLHttpRequest:
Odnośniki
Last updated