CVE-2020-6506: uXSS in Android WebView

About

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ Π²Π΅Π½Π΄ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Android WebView с настройкой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Ρ‡ΡŒΠΈ прилоТСния Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² систСмах с вСрсиСй Android WebView Π΄ΠΎ 83.0.4103.106.

Π’ инстансС Android WebView с WebSettings.setSupportMultipleWindows() = false (ΠΈΠ»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), позволяСт Π² iframe ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ origin ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ same-origin policy ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ JS ΠΊΠΎΠ΄ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅.

Если Π½Π΅ ΠΏΠΎΠ΄Π΄Ρ€Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² WebView нСсколько ΠΎΠΊΠΎΠ½, Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° с javascript:URL ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊΠΊ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° с https://.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π°Ρ‚Π°ΠΊΡƒ, iframe ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ window.open() с url-адрСсом javascript: URL. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ открытия Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ссылка с target="_blank" ΠΈΠ»ΠΈ href="javascript:..." Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ΠžΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ взаимодСйствиС - ΠΊΠ»ΠΈΠΊ ΠΈΠ»ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ webview Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ взаимодСйствия, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ.

Π’ Ρ€Π΅Π΄ΠΊΠΈΡ… случаях взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π΅ трСбуСтся (drive-by attack). Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π° с использованиСм схСмы file://, Π° WebView Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для WebSettings.setJavaScriptCanOpenWindowsAutomatically() ΠΈ WebSettings.setAllowUniversalAccessFromFileURLs() значСния Π² true.

Как ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ уязвимо?

Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ страницы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ WebViews ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Β«Π² Π½ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅Β» Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΠΊΠ½Π΅ / Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ (Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΊΠΎΠ½ установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false), ΠΎΠ½ΠΎ, вСроятно, уязвимо. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΠΊΠ»Π°Π΄ΠΎΠΊ, ΡΡ‚Ρ€Π°Π΄Π°ΡŽΡ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ часто ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· свой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс (Π° Π½Π΅ ΠΏΠΎ страницам Π² WebView), поэтому ΠΎΠ½ΠΈ ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΊΠΎΠ½ Android WebView Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false.

Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ уязвимо, Ссли ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ WebView ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

class VulnerableActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // ...other setup code...
        
        // Get WebView from layout
        val myWebView: WebView = findViewById(R.id.webview)
        // Enable JavaScript (only configuration required)
        myWebView.settings.javaScriptEnabled = true
        // Load parent page
        myWebView.loadUrl("https://PARENT_ORIGIN/parent.html")
    }
}

Если Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ этим ссылкам Π² созданной WebView:

ОТидаСмоС повСдСниС:

Π‘ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ PoC ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ JavaScript Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² источникС Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°. Π’ случаС уязвимости наблюдаСмоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ - это элСмСнт, добавляСмый Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (Ρ†Π΅Π»ΡŒ). Π’ зависимости ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ WebView уязвимоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² Π²ΠΈΠ΄Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° alert () с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ†Π΅Π»Π΅Π²ΠΎΠΌ происхоТдСнии. (Π‘ΠΌ. ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ Π½ΠΈΠΆΠ΅.)

ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ

Depending on their configuration, WebViews may not show alert() dialog boxes. Therefore, using a payload such as javascript:alert(document.domain) is not recommended as it may yield a false-negative. Instead, use a payload which first writes to the top-level document and then tries an alert(), such as javascript:var elem = document.createElement("p"); elem.innerHTML = "<b>Executed JS in parent origin: "+window.location.origin+"</b>"; document.body.append(elem); alert(document.domain).

Mitigation

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½ΠΈΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ReactNative, Cordova ΠΈ Ionic Π½Π΅ пофиксили эту ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρƒ сСбя.

uXSS (CVE-2020-6506) - Details https://alesandroortiz.com/articles/uxss-android-webview-cve-2020-6506/ PoC: https://alesandroortiz.com/security/chromiumwebview/cve-2020-6506.html

Last updated

Was this helpful?