OWASP kategorisi: MASVS-STORAGE: Depolama
Genel Bakış
Bu belgede, benzer çözümler içeren dosya eklemeyle ilgili çeşitli sorunlar ele alınmaktadır. Bu sorunlar, WebView'lardaki dosyalara erişimden kaynaklanan güvenlik açıklarına odaklanmaktadır ve dosya erişimine izin veren veya JavaScript'i etkinleştiren tehlikeli WebSettings
'den dosya seçme isteği oluşturan bir WebKit yöntemine kadar çeşitlilik gösterir. Bu belge, file://
şemasının kullanımı, yerel dosyalara sınırsız erişim ve siteler arası komut dosyası çalıştırmadan kaynaklanan WebView'daki sorunların düzeltilmesi konusunda rehberlik arıyorsanız faydalı olabilir.
Bu dokümanda aşağıdaki konular ele alınmaktadır:
WebSettings
, WebView'ların ayar durumlarını yöneten yöntemleri içeren bir sınıftır. Bu yöntemler, WebView'ları daha sonra açıklanacak farklı saldırılara açık hâle getirebilir. Bu belgede, dosyalara erişim yöntemlerini ve JavaScript'in yürütülmesine izin veren ayarı inceleyeceğiz:setAllowFileAccess
,setAllowFileAccessFromFileURLs
vesetAllowUniversalAccessFromFileURLs
yöntemleri, dosya şeması URL'si (file://
) kullanılarak yerel dosyalara erişim izni vermek için kullanılabilir. Ancak bu yöntemler, kötü amaçlı komut dosyaları tarafından uygulamaların erişebildiği rastgele yerel dosyalara (ör. kendi/data/
klasörleri) erişmek için kullanılabilir. Bu nedenle, bu yöntemler güvenli olmadığı için işaretlendi ve API 30'daWebViewAssetLoader
gibi daha güvenli alternatifler lehine kullanımdan kaldırıldı.setJavascriptEnabled
yöntemi, WebView'larda JavaScript'in yürütülmesini etkinleştirmek için kullanılabilir. Bu durum, uygulamaları dosya tabanlı XSS'ye karşı savunmasız bırakır. Özellikle yerel dosyaların veya yürütülebilir kod içerebilecek güvenilmeyen web içeriklerinin yüklenmesine izin verecek şekilde yapılandırıldığında, harici kaynaklar tarafından oluşturulabilen veya değiştirilebilen dosyalara erişime izin verecek şekilde yapılandırıldığında ya da WebView'ların JavaScript'i yürütmesine izin verildiğinde kullanıcılar ve verileri risk altına girer.WebChromeClient.onShowFileChooser
, web'de gezinme araçları sağlayanandroid.webkit
paketine ait bir yöntemdir. Bu yöntem, kullanıcıların bir WebView'da dosya seçmesine izin vermek için kullanılabilir. Ancak, WebView'lar hangi dosyanın seçileceği konusunda kısıtlamalar uygulamadığından bu özellik kötüye kullanılabilir.
Etki
Dosya dahil etmenin etkisi, WebView'da hangi WebSettings'in yapılandırıldığına bağlı olabilir. Aşırı geniş dosya izinleri, saldırganların yerel dosyalara erişmesine ve hassas verileri, kimliği tanımlayabilecek bilgileri (PII) veya özel uygulama verilerini çalmasına olanak tanıyabilir. JavaScript yürütmenin etkinleştirilmesi, saldırganların bir WebView'da veya kullanıcının cihazında JavaScript çalıştırmasına olanak tanıyabilir. onShowFileChooser
yöntemi kullanılarak seçilen dosyalar, dosya kaynağının güvenilir olduğunu yöntem veya WebView'in doğrulayabileceği bir yol olmadığından kullanıcı güvenliğini tehlikeye atabilir.
Risk: file:// aracılığıyla dosyalara riskli erişim
setAllowFileAccess
, setAllowFileAccessFromFileURLs
ve setAllowUniversalAccessFromFileURLs
'nin etkinleştirilmesi, kötü amaçlı işlemlerin ve file://
bağlamına sahip WebView isteklerinin, WebView çerezleri ve uygulamaya özel veriler de dahil olmak üzere rastgele yerel dosyalara erişmesine izin verebilir. Ayrıca, onShowFileChooser
yöntemini kullanarak kullanıcıların güvenilmeyen kaynaklardan dosya seçip indirmesine izin verebilirsiniz.
Bu yöntemlerin tümü, uygulama yapılandırmasına bağlı olarak kimliği tanımlayabilecek bilgilerin, giriş kimlik bilgilerinin veya diğer hassas verilerin sızdırılmasına yol açabilir.
Risk azaltma önlemleri
Dosya URL'lerini doğrulama
Uygulamanızın dosyalara file://
URL'leri üzerinden erişmesi gerekiyorsa yalnızca meşru olduğu bilinen belirli URL'leri izin verilenler listesine eklemeniz ve yaygın hatalardan kaçınmanız önemlidir.
WebViewAssetLoader'ı kullanma
Belirtilen yöntemler yerine WebViewAssetLoader
yöntemini kullanın. Bu yöntem, yerel dosya sistemi öğelerine erişmek için file://
şeması yerine http(s)//:
şemasını kullanır ve açıklanan saldırıya karşı savunmasız değildir.
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");
Tehlikeli WebSettings yöntemlerini devre dışı bırakma
setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
ve setAllowUniversalAccessFromFileURLs()
yöntemlerinin değerleri, API düzeyi 29 ve önceki sürümlerde varsayılan olarak TRUE
, API düzeyi 30 ve sonraki sürümlerde ise FALSE
olarak ayarlanır.
Diğer WebSettings
yapılandırmanız gerekiyorsa özellikle API düzeyi 29 veya daha düşük olan uygulamalarda bu yöntemleri açıkça devre dışı bırakmanız en iyisidir.
Risk: File-Based XSS
setJavacriptEnabled
yönteminin TRUE
olarak ayarlanması, JavaScript'in WebView içinde yürütülmesine olanak tanır. Daha önce belirtildiği gibi dosya erişimi etkinleştirildiğinde, rastgele dosyalar içindeki kodun yürütülmesi veya WebView'da açılan kötü amaçlı web siteleri aracılığıyla dosya tabanlı XSS mümkün olur.
Risk azaltma önlemleri
WebView'ların yerel dosyaları yüklemesini engelleme
Önceki riskte olduğu gibi, setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
ve setAllowUniversalAccessFromFileURLs()
FALSE
olarak ayarlanırsa dosya tabanlı XSS önlenebilir.
WebView'ların JavaScript yürütmesini engelleme
JavaScript'in Web Görünümleri'nde yürütülememesi için yöntemi setJavascriptEnabled
olarak FALSE
ayarlayın.
WebView'ların güvenilir olmayan içerik yüklemediğinden emin olun
Bazen bu ayarların WebView'larda etkinleştirilmesi gerekir. Bu durumda, yalnızca güvenilir içeriğin yüklendiğinden emin olmak önemlidir. JavaScript'in yalnızca kontrol ettiğiniz kısımlarda çalışmasına izin vermek ve rastgele JavaScript'e izin vermemek, içeriğin güvenilir olmasını sağlamanın iyi bir yoludur. Aksi takdirde, düz metin trafiğinin yüklenmesini önlemek, tehlikeli ayarları olan WebView'ların en azından HTTP URL'lerini yükleyememesini sağlar. Bu, manifest aracılığıyla, android:usesCleartextTraffic
ayarını False
olarak belirleyerek veya HTTP trafiğine izin vermeyen bir Network Security Config
ayarı belirleyerek yapılabilir.
Kaynaklar
- setAllowUniversalAccessFromFileURLs API referans sayfası
- setAllowFileAccessFromFileURLs API referans sayfası
- WebViewAssetLoader API referans sayfası
- CodeQL belgeleri
- Oversecured blogu
- onShowFileChooser referans sayfası