MASTG-TEST-0037: 测试 WebView 清理
此测试即将更新
此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。
请通过提交 PR 来帮助我们:MASTG v1->v2 MASTG-TEST-0037:测试 WebViews 清理 (android)
概述¶
要测试 WebViews 清理,你应该检查所有与 WebView 数据删除相关的 API,并尝试完全跟踪数据删除过程。
静态分析¶
首先识别以下 WebView API 的使用情况,并仔细验证所提及的最佳实践。
-
初始化:应用可能会以某种方式初始化 WebView,通过使用
android.webkit.WebSettings
中的setDomStorageEnabled
、setAppCacheEnabled
或setDatabaseEnabled
来避免存储某些信息。默认情况下,DOM 存储(用于使用 HTML5 本地存储)、应用程序缓存和数据库存储 API 是禁用的,但应用可能会显式地将这些设置设置为“true”。 -
缓存:Android 的 WebView 类提供了
clearCache
方法,该方法可用于清除应用使用的所有 WebViews 的缓存。它接收一个布尔输入参数 (includeDiskFiles
),该参数将擦除所有存储的资源,包括 RAM 缓存。但是,如果将其设置为 false,则只会清除 RAM 缓存。检查应用是否使用了clearCache
方法,并验证其输入参数。此外,你还可以检查应用是否覆盖了onRenderProcessUnresponsive
,以处理 WebView 可能无响应的情况,因为clearCache
方法也可能从那里调用。 -
WebStorage APIs:
WebStorage.deleteAllData
也可以用于清除 JavaScript 存储 API 当前使用的所有存储,包括 Web SQL 数据库和 HTML5 Web 存储 API。某些应用需要启用 DOM 存储才能显示某些使用本地存储的 HTML5 网站。这应仔细调查,因为它可能包含敏感数据。
-
Cookies:可以使用 CookieManager.removeAllCookies 删除任何现有 cookie。
-
文件 APIs:某些目录中的正确数据删除可能并不那么简单,某些应用使用一种务实的解决方案,即手动删除已知保存用户数据的选定目录。这可以使用
java.io.File
API 完成,例如java.io.File.deleteRecursively
。
示例
来自 开源 Firefox Focus 应用中的 Kotlin 示例显示了不同的清理步骤
override fun cleanup() {
clearFormData() // Removes the autocomplete popup from the currently focused form field, if present. Note this only affects the display of the autocomplete popup, it does not remove any saved form data from this WebView's store. To do that, use WebViewDatabase#clearFormData.
clearHistory()
clearMatches()
clearSslPreferences()
clearCache(true)
CookieManager.getInstance().removeAllCookies(null)
WebStorage.getInstance().deleteAllData() // Clears all storage currently being used by the JavaScript storage APIs. This includes the Application Cache, Web SQL Database and the HTML5 Web Storage APIs.
val webViewDatabase = WebViewDatabase.getInstance(context)
// It isn't entirely clear how this differs from WebView.clearFormData()
@Suppress("DEPRECATION")
webViewDatabase.clearFormData() // Clears any saved data for web forms.
webViewDatabase.clearHttpAuthUsernamePassword()
deleteContentFromKnownLocations(context) // calls FileUtils.deleteWebViewDirectory(context) which deletes all content in "app_webview".
}
该函数以 deleteContentFromKnownLocations
中的一些额外的手动文件删除结束,该函数调用来自 FileUtils
的函数。这些函数使用 java.io.File.deleteRecursively
方法从指定目录递归删除文件。
private fun deleteContent(directory: File, doNotEraseWhitelist: Set<String> = emptySet()): Boolean {
val filesToDelete = directory.listFiles()?.filter { !doNotEraseWhitelist.contains(it.name) } ?: return false
return filesToDelete.all { it.deleteRecursively() }
}
动态分析¶
打开一个访问敏感数据的 WebView,然后注销应用程序。访问应用程序的存储容器,并确保删除了所有与 WebView 相关的文件。以下文件和文件夹通常与 WebViews 相关
- app_webview
- Cookies
- pref_store
- blob_storage
- Session Storage
- Web Data
- Service Worker