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
esetAllowUniversalAccessFromFileURLs
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, comeWebViewAssetLoader
. - 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 alandroid.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
- Pagina di riferimento dell'API setAllowUniversalAccessFromFileURLs
- Pagina di riferimento dell'API setAllowFileAccessFromFileURLs
- Pagina di riferimento dell'API WebViewAssetLoader
- Documentazione di CodeQL
- Blog su sicurezza eccessiva
- Pagina di riferimento di onShowFileChooser