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