hacktricks/mobile-pentesting/android-app-pentesting/webview-attacks.md
2024-02-10 13:03:23 +00:00

9 KiB
Raw Blame History

Attacchi a WebView

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Guida semplificata sulle configurazioni e la 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 di WebView.

Esempio di WebView

Accesso ai file nelle WebView

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

Funzionalità deprecate: Accesso universale e accesso ai file dagli URL

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

  • Per verificare questa impostazione, utilizzare getAllowUniversalAccessFromFileURLs().

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

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

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

Caricamento sicuro dei file

Per disabilitare l'accesso al file system pur continuando ad accedere alle risorse e agli asset, viene utilizzato il metodo setAllowFileAccess(). Con Android R e versioni successive, l'impostazione predefinita è false.

  • Verificare 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 alle risorse e agli asset locali, allineandosi alla politica Same-Origin, facilitando così la gestione di CORS.

Gestione di JavaScript e Intent Scheme

  • JavaScript: Disabilitato di default nelle WebView, può essere abilitato tramite setJavaScriptEnabled(). Si consiglia cautela in quanto l'abilitazione di JavaScript senza adeguate protezioni può introdurre vulnerabilità di sicurezza.

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

WebView vulnerabile

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 dell'app Android. Ciò viene realizzato utilizzando il metodo addJavascriptInterface, che integra JavaScript con le funzionalità native di Android, chiamato 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, creando un rischio per la sicurezza se informazioni sensibili vengono esposte attraverso queste interfacce.

Considerazioni importanti

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

Implementazione di un JavaScript Bridge

  • Le interfacce JavaScript possono interagire con il codice nativo, come mostrato negli esempi in cui un metodo di classe viene esposto a JavaScript:
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • Il JavaScript Bridge viene abilitato aggiungendo un'interfaccia al WebView:
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • Possibile sfruttamento tramite JavaScript, ad esempio, attraverso un attacco XSS, consente di chiamare metodi Java esposti:
<script>alert(javascriptBridge.getSecret());</script>
  • Per mitigare i rischi, limitare l'uso del bridge 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 (RCE) basata su reflection

  • Un metodo documentato consente di ottenere RCE attraverso la reflection 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 l'interazione e l'esecuzione arbitraria di JavaScript all'interno del contenuto WebView.

Abilitazione del debug remoto

  • Il debug remoto può essere abilitato per tutte le WebView all'interno di un'applicazione tramite:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Per abilitare condizionalmente il debug in base allo stato di debug dell'applicazione:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Estrarre file arbitrari

  • Dimostra l'estrazione 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

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: