WebView - Inclusione di file non sicuri

Categoria OWASP: MASVS-STORAGE: Storage

Panoramica

Questo documento tratta diversi problemi relativi all'inclusione di file che condividono mitigazioni simili. Questi problemi riguardano vulnerabilità derivanti dall'accesso a file all'interno di WebView e vanno da WebSettings pericolosi che consentono l'accesso ai file o l'attivazione di JavaScript a un metodo WebKit che crea una richiesta di selezione dei file. Questo documento dovrebbe esserti utile se stai cercando indicazioni sulla correzione dei problemi all'interno di WebView derivanti dall'utilizzo dello schema file://, dell'accesso senza limitazioni ai file locali e del cross-site scripting.

Più concretamente, questo documento tratta i seguenti argomenti:

  • WebSettings è una classe contenente metodi che gestiscono gli stati delle impostazioni per le WebView. Questi metodi possono aprire WebView a diversi attacchi che verranno descritti in dettaglio in seguito. In questo documento esamineremo i metodi relativi alla modalità di accesso ai file e l'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 di file (file://). Tuttavia, possono essere sfruttati da script dannosi per accedere a file locali arbitrari a cui l'applicazione ha accesso, ad esempio la propria cartella /data/. Per questo motivo, questi metodi sono stati contrassegnati 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. In questo modo, le applicazioni sono vulnerabili all'XSS basato su file. Soprattutto se configurati per consentire il caricamento di file locali o contenuti web non attendibili che potrebbero contenere codice eseguibile, configurati per consentire l'accesso a file che possono essere creati o modificati da fonti esterne o che consentono a WebView di eseguire JavaScript, gli utenti e i loro dati sono a rischio.
  • WebChromeClient.onShowFileChooser è un metodo appartenente al pacchetto android.webkit, che fornisce strumenti di navigazione web. Questo metodo può essere utilizzato per consentire agli utenti di selezionare i file all'interno di una WebView. Tuttavia, questa funzionalità può essere utilizzata in modo improprio perché le WebView non impongono restrizioni sul file selezionato.

Impatto

L'impatto dell'inclusione di file può dipendere dalle impostazioni WebSettings configurate in WebView. Autorizzazioni di file eccessivamente ampie possono consentire agli autori di attacchi di accedere ai file locali e rubare dati sensibili, PII (Personally Identifiable Information) o dati di app privati. L'attivazione dell'esecuzione di JavaScript può consentire agli autori di attacchi di eseguire JavaScript all'interno di una WebView o sul dispositivo di un utente. I file selezionati utilizzando il metodo onShowFileChooser potrebbero compromettere la sicurezza dell'utente, poiché non esiste 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 dannosi e richieste WebView con un contesto file:// di accedere a file locali arbitrari, inclusi cookie WebView e dati privati dell'app. Inoltre, l'utilizzo del metodo onShowFileChooser può consentire agli utenti di selezionare e scaricare file da fonti non attendibili.

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

Mitigazioni

Convalidare 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.

Utilizza WebViewAssetLoader

Utilizza WebViewAssetLoader anziché i metodi menzionati. Questo metodo utilizza lo schema http(s)//: anziché uno schema file:// per accedere agli asset del file system 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 metodi WebSettings pericolosi

I valori dei metodi setAllowFileAccess(), setAllowFileAccessFromFileURLs() e setAllowUniversalAccessFromFileURLs() sono impostati per impostazione predefinita su TRUE nel livello API 29 e precedenti e su FALSE nel livello API 30 e successivi.

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


Rischio: XSS basata su file

Se imposti il metodo setJavacriptEnabled su TRUE, JavaScript può essere eseguito all'interno di un 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 di WebView.

Mitigazioni

Impedire ai componenti WebView di caricare file locali

Come per il rischio precedente, l'XSS basato su file può essere evitato se setAllowFileAccess(), setAllowFileAccessFromFileURLs() e setAllowUniversalAccessFromFileURLs() sono impostati su FALSE.

Impedire l'esecuzione di JavaScript nei componenti WebView

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 quelli che controlli e vietare JavaScript arbitrari è un buon modo per garantire l'affidabilità dei contenuti. In caso contrario, impedire il caricamento del traffico cleartext garantisce che i componenti WebView con impostazioni pericolose non siano almeno in grado di caricare URL HTTP. Questa operazione può essere eseguita tramite il manifest, impostando android:usesCleartextTraffic su False oppure impostando un Network Security Config che non consenta il traffico HTTP.


Risorse