Monthly Archives: March 2013

Android中webview缓存密码带来的问题

乌云上发布了一个漏洞,称微信记录了用户微博账号的密码。地址是:

http://www.wooyun.org/bugs/wooyun-2013-020246

这个问题的产生原因并不复杂:微信使用webview加载微博的OAuth登录和认证页面,并采用了webview的默认设置。这种情况下,用户输入账户和密码登陆微博时,系统会弹出提示询问是否保存密码。如果用户选择了是,密码就会保存在这个应用私有目录的databases/webview.db中。

同样地问题还出现在许多流行的应用软件中。在我的手机里,至少小米、腾讯、百度等公司的产品都有发现。

危险性如何?由于密码保存在了/data/data/com.package.name/databases/webview.db中,至少这个软件是可以随便读取的。但我审计过上面这些软件的代码,没有发现实际读取和回传这一密码的情况。另一方面,其他应用需要root权限才能读取——至少在Google的安全模型假设里,系统是不应该被root的。不少恶意代码会利用漏洞提权,因此有获得这些密码的可能,但目前还没有这样的案例。

责任在谁?Google曾回信称,这是webview的一个特性,开发者应在具体使用时自己考虑安全性。在这个案例中,腾讯也把责任推给了webview。我的观点是,Android、软件开发商、用户三方都有责任。Android的错误在于,给webview的默认设置是提示用户是否保存密码,而不是默认不保存,以及对天下无root的假设也毫不实际;软件开发商的错误在于,没有更改这个默认设置,将选择权留给了用户,并事实上造成了第三方密码被明文存储(虽然并非主观故意);用户的不当在于选择了保存——但这其实真的不能怪用户,不能要求大家理解这样一个会话界面的背后带来的诸多影响:

webview让用户选择是否保存密码

怎么修复?很简单,开发者在初始化webview实例后,加上一行代码:

theWebView.getSettings().setSavePassword(false);

就将其设置为不保存密码了。用户没有选择,也就避免了后面的问题。