应用间脚本攻击

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 的输入验证文档以及此 Android 安全核对清单(适用于 WebView),获取宝贵的建议和示例。

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

确保文件无法访问可以阻止任意 JavaScript 在 WebView 中执行。保护文件访问时,应考虑以下 WebSettings

  • 停用文件访问。默认情况下,在 API level 29 及更低版本中,setAllowFileAccess 设置为 True,这将允许访问本地文件。在 API level 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" />

资源