WebView – Yerel köprüler

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