WebView - Inclusione di file non sicuri

Categoria OWASP: MASVS-STORAGE: archiviazione

Panoramica

Questo documento illustra diversi problemi relativi all'inclusione di file che condividono simili misure di mitigazione. Questi problemi riguardano le vulnerabilità derivanti dall'accesso ai file all'interno di WebView e vanno da WebSettings pericolosi che consentono l'accesso ai file o attivano JavaScript a un metodo WebKit che crea una richiesta di selezione dei file. Questo documento dovrebbe essere utile se cerchi indicazioni per la risoluzione dei problemi in WebView derivanti dall'utilizzo dello schema file://, dall'accesso senza restrizioni ai file locali e dal cross-site scripting.

Nello specifico, questo documento tratta i seguenti argomenti:

  • WebSettings è una classe contenente metodi che gestiscono gli stati di impostazione per le WebView. Questi metodi possono aprire le WebView a diversi attacchi, che verranno illustrati in seguito. In questo documento esamineremo i metodi relativi alla modalità di accesso ai file e all'impostazione che consente l'esecuzione di JavaScript:
  • I metodi setAllowFileAccess, setAllowFileAccessFromFileURLs e setAllowUniversalAccessFromFileURLs possono essere utilizzati per concedere l'accesso ai file locali utilizzando un URL dello schema file (file://). Tuttavia, possono essere sfruttati da script dannosi per accedere a file locali arbitrari a cui ha accesso l'applicazione, ad esempio la propria cartella /data/. Per questo motivo, questi metodi sono stati segnalati come non sicuri e sono stati ritirati nell'API 30 a favore di alternative più sicure, come WebViewAssetLoader.
  • Il metodo setJavascriptEnabled può essere utilizzato per abilitare l'esecuzione di JavaScript all'interno di WebView. Ciò rende le applicazioni vulnerabili agli attacchi XSS basati su file. In particolare, se sono configurati per consentire il caricamento di file locali o contenuti web non attendibili che potrebbero contenere codice eseguibile, se sono configurati per consentire l'accesso a file che possono essere creati o modificati da origini esterne o se consentono ai componenti WebView di eseguire JavaScript, gli utenti e i loro dati sono a rischio.
  • WebChromeClient.onShowFileChooser è un metodo appartenente al android.webkit pacchetto, che fornisce strumenti di navigazione web. Questo metodo può essere utilizzato per consentire agli utenti di selezionare file all'interno di una WebView. Tuttavia, questa funzionalità può essere usata in modo improprio perché le visualizzazioni web non applicano restrizioni sul file selezionato.

Impatto

L'impatto dell'inclusione dei file può dipendere da quali WebSettings sono configurati in WebView. Autorizzazioni dei file eccessivamente ampie possono consentire agli utenti malintenzionati di accedere ai file locali e rubare dati sensibili, PII (Informazioni che consentono l'identificazione personale) o dati dell'app privati. L'attivazione dell'esecuzione di JavaScript può consentire agli utenti malintenzionati di eseguire JavaScript in un componente WebView o sul dispositivo di un utente. I file selezionati utilizzando il metodoonShowFileChooser potrebbero compromettere la sicurezza dell'utente, poiché non esiste un modo per il metodo o WebView di garantire che l'origine del file sia attendibile.

Rischio: accesso rischioso ai file tramite file://

L'attivazione di setAllowFileAccess, setAllowFileAccessFromFileURLs e setAllowUniversalAccessFromFileURLs può consentire a intent e richieste WebView dannosi con un contesto file:// di accedere a file locali arbitrari, inclusi i cookie di WebView e i dati privati dell'app. Inoltre, l'utilizzo del metodo onShowFileChooser può consentire agli utenti di selezionare e scaricare file da fonti non attendibili.

Tutti questi metodi possono portare all'esfiltrazione di PII, credenziali di accesso o altri dati sensibili, a seconda della configurazione dell'applicazione.

Mitigazioni

Convalida gli URL dei file

Se la tua app richiede l'accesso ai file tramite URL file://, è importante inserire nella lista consentita solo URL specifici noti per essere legittimi, evitando errori comuni.

Utilizzare WebViewAssetLoader

Utilizza WebViewAssetLoader anziché i metodi menzionati. Questo metodo utilizza lo schema http(s)//: anziché uno schema file:// per accedere agli asset del sistema di file locale e non è vulnerabile all'attacco descritto.

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");

Disattivare i metodi WebSettings pericolosi

Per impostazione predefinita, i valori dei metodi setAllowFileAccess(), setAllowFileAccessFromFileURLs() e setAllowUniversalAccessFromFileURLs() sono impostati su TRUE nel livello API 29 e versioni precedenti e su FALSE nel livello API 30 e versioni successive.

Se è necessario configurare altri WebSettings, è meglio disattivare esplicitamente questi metodi, in particolare per le app che hanno come target i livelli API inferiori o uguali a 29.


Rischio: XSS basato su file

L'impostazione del metodo setJavacriptEnabled su TRUE consente di eseguire JavaScript all'interno di un componente WebView e, in combinazione con l'accesso ai file abilitato come descritto in precedenza, è possibile eseguire attacchi XSS basati su file tramite l'esecuzione di codice all'interno di file arbitrari o siti web dannosi aperti all'interno del componente WebView.

Mitigazioni

Impedire ai componenti WebView di caricare file locali

Come per il rischio precedente, gli attacchi XSS basati su file possono essere evitati se setAllowFileAccess(), setAllowFileAccessFromFileURLs() e setAllowUniversalAccessFromFileURLs() sono impostati su FALSE.

Impedire ai componenti WebView di eseguire JavaScript

Imposta il metodo setJavascriptEnabled su FALSE in modo che JavaScript non possa essere eseguito all'interno di WebView.

Assicurati che i componenti WebView non carichino contenuti non attendibili

A volte è necessario attivare queste impostazioni all'interno di WebView. In questo caso, è importante assicurarsi che vengano caricati solo contenuti attendibili. Limitare l'esecuzione di JavaScript solo a quello che controlli e non consentire JavaScript arbitrario è un buon modo per garantire l'affidabilità dei contenuti. In caso contrario, l'impedimento del caricamento del traffico in chiaro garantisce che i componenti WebView con impostazioni pericolose non siano almeno in grado di caricare URL HTTP. Questo può essere fatto tramite il file manifest, impostando android:usesCleartextTraffic su False o impostando un valore Network Security Config che non consenta il traffico HTTP.


Risorse