作为一个会每天访问Freebuf网站的人,或者说是一个对信息安全感兴趣的人,肯定会知道一位用户所有的网络账号不应该都使用相同的密码,这也是一个最基本的安全常识。可是那然后呢?
那么为了让每一个账号都能拥有一个健壮的密码,你可能就需要用到密码管理器了。也许当你第一次使用密码管理器的时候,你心里会有些忐忑不安,毕竟你将所有的密码都放在了这一个地方,而你又可以跨设备跨平台地通过云端来同步自己的密码,这种便捷性肯定会让每一个用户对密码管理器的安全产生质疑。
悲剧的是,你的质疑是对的。在这篇标题为《密码管理器:攻击与防御》【 点我下载 】的论文中,作者David Silver告诉了我们很多密码管理器中都存在严重的安全漏洞,而这些漏洞与密码自动填写有着密切的联系。虽然这是一篇发表于2014年的论文,其中描述的很多攻击向量可能已经失效了,但是本文是我研读完这篇论文之后所得到的启发,也许我的这些观点和看法可以给大家带来很多灵感,而且我认为这些攻击方法的变种版本目前仍然是有效的。
简而言之,请各位不要再使用表单自动填写功能了!了!了!重要的事情说三遍…
这种攻击者可以主动发动中间人攻击,即拦截并修改目标网络中通信双方的任意网络流量数据。但是在这种攻击场景中,用户并不需要明确地访问或登录任何一个页面,攻击者仍然可以窃取用户的登录凭证。
比如说,攻击者只需要在某家咖啡店建立一个伪造的WiFi热点,当你连接至该热点之后,你的密码就全部到攻击者的手中了。这种攻击方法非常简单,攻击者只需要一个临时的网络路由器就可以发动攻击,而且这种情况在现实场景中也会经常发生。在大多数情况下,用户根本无需与钓鱼网站进行任何交互,攻击者可以在用户毫不知情的情况下窃取所有的密码。
基本上,任何支持密码表单自动填写的密码管理器都无法抵御Sweep攻击。当目标用户连接到了一个由攻击者控制的流氓WiFi热点之后,攻击就悄悄发生了…
当用户启动浏览器之后,浏览器会被重定向至一个标准的热点登录页面,并询问用户是否同意WiFi使用条款。对于公共WiFi热点来说,这种情况很常见,而且绝大多数用户都会选择同意。但是用户可能压根就不知道这个页面中存在不可见的HTML元素,而这个隐藏元素已经完成了所有的攻击。
换句话说,当你正在阅读这个已经加载完成了的WiFi登录页面时,你绝大多数的登录凭证早就已经“不翼而飞”了。在测试环境下,我们每秒钟大约可以从目标设备中提取出十个密码。
1. 在页面中嵌入一个不可见的iFrame,然后再让这个iFrame指向任意站点的任意页面。当浏览器加载完所有的frame之后,攻击者就可以在每一个frame中注入一个登录表单和JavaScript脚本。此时,一个拥有密码表单自动填写功能的密码管理器就会毫不犹豫地将相应的密码填写进去。比如说,攻击者想要窃取目标用户的QQ号和微博账号,那么他就可以在这个隐藏的iFrame元素中嵌入两个frame,然后分别让每一个frame指向包含QQ登录表单和微博登录表单的页面,如果此时用户的密码管理器中保存了QQ密码和微博密码的话,攻击也就成功了。
2. 除了iFrame之外,攻击者还可以使用多重窗口来实现攻击。攻击者可以在用户获得WiFi网络使用权之前强制弹出一个窗口,然后提醒用户允许所有的弹窗。虽然相比iFrame来说,弹窗的形式可能比较容易吸引注意,但我们可以通过注入恶意JS代码或将窗口放置屏幕边缘来尽量增加它的隐蔽性。当攻击者成功获得密码之后,可以立刻关闭这些窗口。
3. 第三种方法就是使用一系列的重定向链接。当用户请求某个页面时,攻击者可以将用户请求重定向至另一个网站(例如攻击者希望窃取的密码所属站点),然后通过注入恶意JS代码向页面添加一个登录表单,并隐藏页面的其他内容。当密码管理器自动填写了密码之后,密码就会被自动提取出来,然后浏览器又会被重定向至下一个目标站点,然后以此类推,不断地往下,最后才会加载用户当初所要访问的那个页面。然而,这一切对于用户来说,他们只会感觉这个WiFi网络速度很慢…
在2014年的时候,也就是这篇论文发表的时候,研究人员对下图所示的密码管理器进行了测试,结果如下:
Sweep攻击要求攻击者具备发动中间人攻击和修改目标站点的能力,当用户访问的目标页面正好是登录页面的时候,攻击就会非常简单了。实际上,只要是目标页面与登录页面是同源的,就已经足够了,因为所有的密码管理器都会自动将保存的密码与域名进行绑定,并且会忽略掉登录页面的实际路径。
另外一种网站比较容易受攻击的情况就是,使用HTTP来加载登录表单,然后使用HTTPS来提交表单内容,这是一种非常不好的实践方式。根据2013年10月份的一项调查数据,AlexaTop 500的网站中有17%的网站其登录表单是存在这种问题的。虽然现在已经是2017年了,但我认为这种现象依旧存在。
任何一个HTTPS页面如果通过HTTP来获取动态内容的话,那么这个页面就是不安全的,而目前大多数浏览器都会屏蔽这些页面。在这种情况下,即便登录页面使用的是HTTPS,该网站任何页面中的XSS漏洞都将有可能被正常触发。实际上,攻击者只需要利用一个XSS漏洞就能完成攻击,而且完全不需要搭建流氓WiFi热点,攻击者只需要欺骗用户去访问他们所控制的恶意页面即可。
由错误的证书所导致的HTTPS通信异常也有可能允许攻击者利用一个修改后的登录页面(使用自签名证书)来发动攻击。浏览器会检测到这种异常,但用户往往会直接忽略警告。
当伪造页面中的JS脚本获取到了用户密码之后,提取密码的过程就非常简单了。一种方法是加载一个不可见的iFrame,然后将用户凭证通过参数来传递。另一种方法是修改登录表单的action参数,然后将用户凭证通过表单提交至攻击者控制的站点。
目前为止,本文所描述的全部攻击方法可以正常工作的前提就是:用户无需直接与登录表单进行交互,密码管理器的密码自动填写功能可以正常工作并自动填写密码。但是,论文中介绍的密码提取技术与登录表单是如何填写的没有多大关系。简而言之,只要表单中填写了密码,我们就可以获取到,无论这个密码是用户手动输入的还是系统自动填写的。
论文作者介绍的是一种点击劫持攻击,该技术在本文的这种攻击场景下能够正常工作,但唯一不足之处就是一次只能提取出一个账户密码。关于该技术的详细内容请参阅论文原文【 传送门 】。
最有效的防御措施就是采用Secure Filling(安全填写),如果你想体验Secure Filling,那么你将需要一个修改版的浏览器以及一个可以与之协同工作的修改版密码管理器。
如果登录页面是通过HTTP加载,并使用HTTPS提交,那么当这个登录表单填写完成之后,就没有任何一款浏览器或密码管理器能够保证用户密码的安全了。因为JavaScript脚本不仅可以直接从表单中读取出密码,还可以修改表单的action属性,并将密码发送给攻击者。Secure Filling技术的作用就在于,如果攻击者向登录页面注入了恶意JS代码的话,只要表单是通过HTTPS提交的,那么用户密码就是安全的。
1. 当密码管理器首次保存用户名和密码时,需要保存此时登录表单中的action参数值。
2. 当密码管理器自动填写完登录表单之后,禁止JS代码访问该表单(因此需要一个修改版的浏览器)。
3. 在密码自动填写的过程中,如果用户名或密码文本域被修改了,那么密码管理器会放弃填写,并清除已填写的内容。
4. 当填写完成的表单提交,并且该运行的JS代码全部运行完成之后,浏览器需要检测当前表单的action参数值是否与一开始保存的表单action相同,只有在参数值相同的时候浏览器才会真正提交表单数据。
这些问题已经上报给了相关的密码管理器服务商,并且厂商也修改了各自密码管理器的自动填写策略。由于本论文所发现的问题,LastPass将不再对iFrame中的密码文本域进行自动填写,1Password也不再自动填写HTTP页面中的密码表单了。
关于1Password和Sweep攻击的更多内容可以参阅这篇文章【 传送门 】。
* 参考来源: acolyer , FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM