OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi
Genel Bakış
JavaScript köprüsü olarak da bilinen yerel köprü,
Web Görünümü ile yerel Android kodu arasındaki iletişimi kolaylaştırır.
addJavascriptInterface
yöntemini kullanabilirsiniz. Bu sayede ekip üyeleri
Web Görünümü'nde çalışan JavaScript kodu ile Android arasındaki iletişim
uygulamanın Java kodu. addJavascriptInterface
yöntemi, bir Java nesnesini bir WebView'in tüm karelerine gösterir. Herhangi bir kare, nesne adına erişebilir ve nesnedeki yöntemleri çağırabilir. Ancak uygulamanın, WebView'de çağıran çerçevenin kaynağını doğrulaması için bir mekanizma yoktur. Bu da içeriğin güvenilirliğinin belirsiz kalması nedeniyle güvenlik endişeleri doğurur.
JavaScript Window.postMessage
ile iletişim kurmak için Android'in WebViewCompat.postWebMessage
veya WebMessagePort.postMessage
kullanılarak HTML mesaj kanallarıyla da doğal köprü uygulanabilir. WebViewCompat.postWebMessage
ve
WebMessagePort.postMessage
, üzerinden gönderilen JavaScript mesajlarını kabul edebilir
Window.postMessage
öğesini tıklayın.
Yerel köprülerle ilişkili birden fazla risk vardır:
- JavaScriptArayüz tabanlı köprüler:
addJavascriptInterface
yöntemi, iframe'ler dahil olmak üzere WebView'in her çerçevesine sağlanan bir Java nesnesi ekler. Bu, meşru bir web sitesine çerçeve enjekte eden kötü amaçlı üçüncü tarafların saldırısına açık olduğu anlamına gelir. API düzeyi 16 veya önceki sürümleri hedefleyen uygulamalar özellikle Bu yöntem, JavaScript'in ana makineyi kontrol etmesine izin vermek için kullanılabildiğinden bir uygulamadır.- Kullanıcı tarafından sağlanan güvenilir olmayan içeriği köprü özelliğinin etkin olduğu yerel Web Görünümleri'ne yansıtma siteler arası komut dosyası çalıştırma (XSS) saldırılarına izin verir.
- MessageChannel tabanlı köprüler:
- Mesaj kanalı uç noktalarında kaynak denetimlerinin olmaması, mesajların kötü amaçlı kod içerenler de dahil olmak üzere tüm gönderenlerden gelen çerezler kabul edilir.
- Java'yı yanlışlıkla rastgele JavaScript'e maruz bırakmak mümkündür.
Etki
addJavascriptInterface
, postWebMessage
ve postMessage
yöntemleri, kötü amaçlı aktörler tarafından bir WebView'e kontrol ettikleri koda erişmek, bu kodu değiştirmek veya WebView'e kod yerleştirmek için kullanılabilir. Bu durum, kullanıcıların kötü amaçlı sitelere yönlendirilmesine neden olabilir.
kötü amaçlı içerik yükleyen veya cihazlarında kötü amaçlı kodların çalıştırıldığı
sağlayabilir.
Risk: addJavascriptInterface riskleri
WebView, sayfa oluşturma, gezinme ve JavaScript yürütme gibi bir tarayıcının temel işlevlerini uygular. WebView, web içeriğini bir etkinlik düzeninin parçası olarak görüntülemek için uygulama içinde kullanılabilir. Yerel uygulama
Web Görünümü içindeki addJavascriptInterface
yöntemini kullanarak köprü
siteler arası komut dosyası çalıştırma (XSS) gibi güvenlik sorunları nedeniyle veya saldırganların
arayüz yerleştirme ve ana makineyi değiştirme yoluyla güvenilmeyen içerik
istenmeyen şekillerde kullanma, JavaScript kodunu
kullanır.
Çözümler
JavaScript'i devre dışı bırakma
WebView'un JavaScript gerektirmediği senaryolarda
WebSettings
içindeki setJavaScriptEnabled
(örneğin,
(Statik HTML içeriği gösteriliyor). JavaScript yürütme işlemi WebView'de varsayılan olarak devre dışıdır.
Güvenilir olmayan içerik yüklenirken JavaScript arayüzünü kaldırın
Şu komutu çağırarak JavaScript arayüzündeki nesnelerin kaldırıldığından emin olun:
removeJavascriptInterface
güvenilir olmayan içerik
Web Görünümü. Örneğin, bu işlem shouldInterceptRequest
çağrısında yapılabilir.
Kotlin
webView.removeJavascriptInterface("myObject")
Java
webView.removeJavascriptInterface("myObject");
Web içeriğini yalnızca HTTPS üzerinden yükleme
Güvenilir olmayan içerik yüklemeniz gerekiyorsa WebView'un şunun üzerinden web içeriği yüklediğinden emin olun:
şifrelenmiş bağlantı (ayrıca Cleartext ile ilgili yönergelerimize de bakın)
İletişim) tıklayın. İlk sayfa yüklemenin şurada gerçekleştirilmesini engelle:
şurada android:usesCleartextTraffic
politikasının false
olarak ayarlanmasıyla şifrelenmemiş bağlantılar:
AndroidManifest
dosyasını kaldırma veya ağ güvenliğinde HTTP trafiğine izin vermeme
config'den erişebilirsiniz. Daha fazla bilgi için usesCleartextTraffic
belgelerini inceleyin.
XML
<application
android:usesCleartextTraffic="false">
<!-- Other application elements -->
</application>
Şifrelenmemiş trafikte yönlendirmelerin ve daha fazla uygulama taramasının yapılmadığından emin olmak için loadUrl
veya shouldInterceptRequest
içinde HTTP şemasını kontrol edin:
Kotlin
fun loadSecureUrl(webView: WebView?, url: String?) {
webView?.let { wv -> // Ensure valid WebView and URL
url?.let {
try {
val uri = URI(url)
if (uri.scheme.equals("https", ignoreCase = true)) { // Enforce HTTPS scheme for security
wv.loadUrl(url)
} else {
// Log an error or handle the case where the URL is not secure
System.err.println("Attempted to load a non-HTTPS URL: $url")
}
} catch (e: Exception) {
// Handle exception for improper URL format
System.err.println("Invalid URL syntax: $url")
}
}
}
}
Java
public void loadSecureUrl(WebView webView, String url) {
if (webView != null && url != null) { // Ensure valid WebView and URL
try {
URI uri = new URI(url);
String scheme = uri.getScheme();
if ("https".equalsIgnoreCase(scheme)) { // Enforce HTTPS scheme for security
webView.loadUrl(url);
} else {
// Log an error or handle the case where the URL is not secure
System.err.println("Attempted to load a non-HTTPS URL: " + url);
}
} catch (URISyntaxException e) {
// Handle exception for improper URL format
System.err.println("Invalid URL syntax: " + url);
}
}
}
Güvenilir olmayan içeriği doğrulayın
Web Görünümü'nde harici bağlantı yüklenirse hem şemayı hem de ana makineyi doğrulayın (izin verilenler listesi alan adları). İzin verilenler listesinde olmayan tüm alanlar varsayılan tarayıcıyı kullanın.
Güvenilmeyen içerikleri yüklemeyin
Mümkünse Web Görünümü'ne yalnızca uygulama geliştiricisine ait olup kapsamı katı bir şekilde belirlenmiş olan URL ve içerikleri yükleyin.
Hassas verileri açığa çıkarmayın
Uygulamanız WebView ile hassas verilere erişiyorsa
clearCache
yöntemini kullanarak yerel olarak depolanan dosyaları,
JavaScript arayüzü. Bir uygulamanın belirli içerikleri önbelleğe almaması gerektiğini belirtmek için sunucu tarafı üstbilgilerini (ör. no-store) de kullanabilirsiniz.
Hassas işlevleri açığa çıkarmayın
Uygulamanız hassas izinler gerektiriyorsa veya hassas veriler topluyorsa bu izinlerin uygulama içindeki koddan çağrıldığından ve kullanıcılara belirgin bir açıklama sağlandığından emin olun. Hassas işlemler veya kullanıcı verileri için JavaScript arayüzleri kullanmaktan kaçının.
API düzeyi 21 veya üstünü hedefleyin
addJavascriptInterface
yöntemini kullanmanın güvenli bir yolu, API düzeyini hedeflemektir
yöntemin yalnızca API düzeyi 21'de çalıştırıldığında çağrılmasını sağlayarak 21 veya üzeri bir sürüm
veya daha yüksek olabilir. API 21'den önce JavaScript, herkese açık erişim için yansıma özelliğini kullanabiliyordu.
alanlarından biri.
Risk: MessageChannel riskleri
postWebMessage()
ve postMessage()
için kaynak denetimi eksikliği şunlara neden olabilir:
yerel işleyicilere mesaj gönderen veya saldırgan tarafından kullanılan yöntemlerdir.
Çözümler
postWebMessage()
veya postMessage()
ayarını yaparken hedef kaynak olarak * kullanmadan yalnızca güvenilir alanlardan gelen iletilere izin verin ve bunun yerine beklenen gönderen alanını açıkça belirtin.
Kaynaklar
- postMessage() en iyi uygulamaları
- addJavascriptInterface belgeleri
- postMessage() belgeleri
- WebMessagePort.postMessage() belgeleri
- WebViewClient.shouldInterceptRequest dokümanları
- addJavascriptInterface ile ilgili güvenlik önerileriyle ilgili dokümanlar
- clearCache belgeleri
- removeJavascript dokümanları
- Web Görünümlerinde JavaScript'i etkinleştirme