跨应用脚本

OWASP 类别: MASVS-CODE:代码质量

概述

WebView 是 Android 应用中嵌入式浏览器组件,用于在应用中显示网络内容。它在应用的用户界面中呈现 HTML、CSS 和 JavaScript。

跨应用脚本通常与在受害者应用的上下文中执行恶意代码相关。出于本文件的目的,主题将专门限制为将恶意 JavaScript 代码注入易受攻击的 WebView。

当应用在没有足够的验证或清理的情况下接受恶意 JavaScript 到 WebView 时,该应用容易受到跨应用脚本攻击。

影响

当攻击者控制的 JavaScript 内容在未经验证或清理的情况下传递到受害者应用的 WebView 时,可以利用跨应用脚本漏洞。结果,攻击者提供的 JavaScript 代码将在受害者应用的 WebView 上下文中执行。然后,恶意 JavaScript 代码可以使用与受害者应用相同的权限,这可能会导致敏感用户数据被盗和帐户被劫持。

缓解措施

停用 JavaScript

如果您的应用不需要 JavaScript,则停用它可以确保它不会构成威胁。

Kotlin

// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings

// Disable JavaScript
webSettings.javaScriptEnabled = false

Java

// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();

// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);

如果您的应用确实需要 JavaScript,请确保您拥有或控制传递给 WebView 的任何 JavaScript。避免允许 WebView 执行任意 JavaScript,请参阅下一节中的指导。

确保仅将预期内容加载到 WebView 中

使用诸如 shouldOverrideUrlLoading()loadUrl()evaluateJavascript() 方法时,请确保检查传递给它们的所有 URL。如前所述,传递给 WebView 的任何 JavaScript 只能来自预期的域,因此验证正在加载的内容非常重要。

查阅OWASP的输入验证文档以及这份关于WebView的Android安全清单,获取良好的建议和示例。

设置WebView的安全文件访问设置

确保文件不可访问可以防止在WebView中执行任意JavaScript代码。在保护文件访问时,应考虑以下WebSettings

  • 禁用文件访问。默认情况下,在API级别29及以下版本中,setAllowFileAccess设置为True,这将允许访问本地文件。在API级别30及以上版本中,默认值为False。为确保不允许文件访问,请显式将setAllowFileAccess设置为False
  • 禁用内容访问。 setAllowContentAccess的默认设置为True。内容URL访问允许WebView加载系统中安装的内容提供程序中的内容。如果您的应用不需要内容访问,请将setAllowContentAccess设置为False,以防止在发生跨应用脚本攻击时出现潜在的滥用。

  • Kotlin 代码 kotlin webView.settings.javaScriptEnabled = false webView.settings.domStorageEnabled = true webView.settings.allowFileAccess = false webView.settings.allowContentAccess = false

  • Java 代码 java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);

启用安全浏览

AndroidManifest.xml中启用安全浏览,以扫描传递给WebView的URL是否存在网络钓鱼或恶意域名。

<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
   android:value="true" />

资源