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" />