概述
在这篇文章中,我们将会给大家介绍一种从浏览器中提取敏感信息的方法,而我们所要用到的工具就是你的智能手机或笔记本电脑中的环境光传感器。文章结构如下:
1. 首先,我们会介绍与光传感器有关的内容。
2. 接下来,我们会描述用户设备的屏幕颜色将会对光传感器的数据产生怎样的影响。我们的主要目标是跨域提取浏览器的数据和历史记录,而攻击者将可以从中提取出敏感文档和图片(例如用于账号恢复的二维码图片)。
3. 最后,我们会介绍浏览器厂商所能采取的应对策略,并帮助大家缓解这种风险。
注:当前版本的Firefox和Chrome浏览器都无法抵御这种攻击,包括带有光传感器的Android以及桌面设备(例如MacBookPro)。
背景知识:智能手机中的光传感器
现在,几乎所有型号的智能手机和绝大多数的笔记本电脑都配备有环境光传感器。这种传感器一般会被安装在设备的顶部,也就是在靠近前置摄像头的地方。智能手机不仅可以利用环境光传感器来检测用户距离,而且还可以感应外部环境,并通过调整屏幕亮度来达到省电的目的。除此之外,光环境信息也可以用来调整智能手机的响应方式,或者对硬件进行配置。因此,光传感器的数据是十分敏感的。
环境光传感器返回的数据其精确度是非常高的,在国际标准单位中,衡量光强度所用的单位是勒克斯(lux),输出数据范围在0(黑暗)到上万lux不等。而且光传感器输出数据的频率也是非常高的,读取间隔大约为100-200毫秒。
为了与原生App竞争并给用户提供更好的用户体验,越来越多的网站开始有访问环境光传感器数据的需求了。但是,W3C设备与传感器工作组织目前还在讨论是否要允许网站在没有得到用户许可的情况下访问光传感器数据。但是,当前版本的Chrome和Firefox都已经实现了相应的API。
传感器隐私
W3C组织近期正在讨论有关通用传感器API的内容,其中一个主要的话题就是第三方服务在访问特定传感器数据时是否需要征得用户的许可。因此,我们此次研究的目的就是要研究环境光传感器(ALS)目前所面临的安全威胁。在此之前,我曾从安全和隐私这两个方面对ALS进行过全面的分析,通过研究发现,攻击者不仅可以通过传感器泄漏数据来检测房间内是否有人,而且还可以找出目标用户的银行密码。
在这篇文章中,我们的重点是传感器数据将如何帮助攻击者从目标用户的浏览器中提取出隐私数据。接下来,我们会讨论实际的攻击场景。
利用光传感器提取数据
那么我们到底如何才能通过环境光传感器来提取出用户的隐私数据呢?首先,我们要注意以下两点:
1. 用户屏幕的颜色携带着大量的有用信息,但是出于安全方面的考虑,网站是禁止直接读取这方面信息的。
2. 攻击者可以通过光传感器的读数来区分不同的屏幕颜色
我们待会儿再详细描述第二点,但简而言之,屏幕所发出的光不仅会对光传感器的读数产生影响,而且还会允许网站判断设备屏幕的颜色。
而第一点肯定会让你感到惊讶吧?毕竟网站可以控制它们在用户屏幕上所显示的内容,所以它们为什么还会对这些数据感兴趣呢?但你要知道,下面这两种颜色状态是网站无法直接获取的:
1. 已访问过的链接颜色:出于隐私原因,浏览器不会向开发者透露页面所显示的链接颜色,否则恶意开发者就可以利用“:visited”这种页面style来检测用户所访问过的网站了。
2. 跨域资源:同源策略可以防止恶意网站跨域访问受害网站的合法资源。虽然网站不能跨域检查其他网站的框架和图片,但他们可以根据自己的需要来显示这些内容,例如缩放大小和改变颜色。
接下来,我们将介绍攻击的实现方法。
检测已访问过的链接
虽然网站可以采用不同的style来显示已访问过的和未访问过的链接颜色,但是它们不能检测链接是如何显示给用户的。不过,我们可以通过传感器来识别链接的真实颜色。大致步骤如下:
1. 设置链接的style:已访问过的(白色)、未访问过的(黑色)。
2. 校准:显示一个白色背景然后再显示黑色背景,以此来识别用户环境的光等级。不过需要注意的是,传感器读数波动较大将会增加我们的攻击难度。
3. 遍历链接列表:一个接一个地读取列表中的地址,然后显示在屏幕中。已访问过的链接将以白色显示,未访问过的链接则是黑色。
4. 记录下每一条链接的光等级,识别它们的颜色。由于我们已经在第二步中对屏幕进行了校准,所以我们现在就能知道光传感器的每一个读数所代表的颜色了。
最后,攻击者将获取到所有白色的链接,这样他们就能知道用户之前访问过哪些页面了。
演示视频如下:
视频地址:https://youtu.be/Rg0LQ3npkP0
在演示视频中,我们实验环境的光条件在数据提取阶段是不会发生变化的,但是去除这个限制条件也并非难事。
窃取跨域资源
在我们的实验过程中,我们的重点将放在窃取图片上,因为图片资源比较好提取。在下面的演示视频中,网站允许用户通过扫描二维码(https://victim.com/account-code.png)来紧急访问或恢复账号,而攻击者就可以利用这个二维码来劫持用户账户了。
视频地址:https://youtu.be/LF8Wi1UVj7U
攻击机制大致如下:
1. 从受攻击的域名嵌入一张图片。一般情况下,这张图片对于不同身份的用户是不一样的,例如用户头像或安全码。
2. 使用SVG过滤器来创建黑白形式的图片。
3. 缩放图片,让图片充满整个屏幕。
4. 遍历图片中的所有像素,并在用户屏幕上显示每一个像素,然后记录下光传感器对每一个像素的读数。
5. 将所有像素组合成结果图像。
检测速度
由于我们一次只能提取一位数据,所以检测速度就成为了这种攻击技术的主要瓶颈。虽然浏览器传感器的读取速率只有60Hz,但这并不意味着我们每秒能提取出60位数据,而最终的检测速度也会受到传感器检测屏幕亮度的频率所限制。
不同情况所对应的检测时间如下:
-8个字符所组成的明文字符串:24秒
-16个字符所组成的明文字符串:48秒
-20x20的二维码图片:3分20秒
-扫描浏览历史中1000个访问频率最高的URL:8分20秒
-64x64的像素图片:34分08秒
下面这个视频演示了窃取图片的完整过程:
视频地址:https://youtu.be/SI8Uf-VCixs
应对方法
目前比较有效的应对方法主要有以下两种:
1. 限制传感器的读取速率(低于60Hz)
2. 限制传感器的输出精度
不过对于光传感器而言,限制频率也无法阻止我们的攻击,就算频率降低至1Hz我们也同样能够进行攻击,但限制频率可以显著增加攻击的时间成本。相比而言,限制传感器的输出精度也许是更加好的解决方案。但很明显,最佳的解决方案应该是限制网站访问传感器数据,至少也要在它们访问这些数据之前得到用户的权限许可。
总结
我们此次演示的攻击技术不仅暴露了目前光传感器所存在的安全隐患,而且也证明了恶意网站能够利用光传感器数据来绕过网站的同源策略并跨域窃取用户的敏感信息。其实除了光传感器之外,像温度感应器、GPS和陀螺仪等传感器或多或少都存在着各种安全问题,而以安全和隐私为主要考量因素来设计这些设备的行业标准其实也并非易事。因此,我们希望厂商能够更加关注传感器的安全问题,并且能够在将来为这些设备增加更多的安全保护功能。
|