设备指纹指南:上篇

  • A+
所属分类:逆向工程
设备指纹在安全上主要用来识别用户,增强认证能力。参考业界普遍实践和学术探索,我们对常见的29种方法进行了比较,本文对这些方法根据稳定性、可重复性、资源消耗、用户端被动、绕过难度和可区分性进行了比较,用以在实践中选择。

一、背景

网络认证机制当前主要仍然是密码方法,但问题大家也都知道,密码方法在可用性、安全性上都有缺陷。设备指纹作为一种增强技术,收集设备软硬件信息进行识别,例如浏览器可采集屏幕分辨率、本地时间、操作系统版本进行主机系统识别,同时也可通过浏览器行为采集信息,目前很多用户画像、广告推送都会采用设备指纹跟踪用户浏览的习惯。另外则是在风控领域有大规模使用,通过在认证过程中进行多维判断,在无需用户干预的情况下实现增强认证。
现实中对设备指纹的主要考虑是:能够提高安全性、对用户不可见、兼容,从而在可用性和可部署性上实现低成本。

二、学术界研究

学术界对设备指纹也早有研究,目前业界知名的研究我们也做了分析。
第一篇设备指纹研究论文是Eckersley在2010年发表的,详细讨论了基于浏览器的设备指纹的概念,表明可通过收集设备IP地址、时区、屏幕分辨率、支持字体和插件列表等基本信息来识别用户,并跟踪用户的浏览习惯,这个功能最初目的是为了优化各类设备浏览体验。
后来Mowery等人提出了两种更先进的指纹方法:第一种是测量浏览器JavaScript引擎的性能签名,第二种是在HTML5画布中渲染文本,来区分不同软硬件平台的字体渲染技术。
Nikiforakis等人继续扩展了一些对抗下的方法,例如不同浏览器JavaScript实现差异会暴露出使用的是哪个浏览器,哪怕是user-agent被伪造。用户如果使用代理,则可通过Flash或Java等外部插件来确认真实IP地址。用户如果改动设备指纹,则会导致一个罕见指纹,对识别用户反而更有用。
Bojinov开始对手机传感器进行指纹识别,利用了设备的加速度校准误差和扬声器麦克风系统的响应频率。
Nikiforakis等人开发了PriVaricator,通过随机化各种浏览器参数来降低指纹性。
Acar和Nikiforakis等人的实证研究发现,在用户清除浏览器cookie的情况下广告商普遍使用设备指纹作为后备机制跟踪用户,广告商还通过非传统的存储机制保存识别信息,例如Flash cookie,用户很难删除,如果用户清除浏览器cookie,这些信息还可用来重建浏览器cookie。
在安全上也有一些研究探索。Unger提出了,通过监控某些Web浏览器属性(例如user-agent、支持的CSS功能)来增强会话安全,帮助检测会话劫持。Preuveneers和Joosen则提出了一个协议,该协议在整个认证会话中监控各种参数,使用比较算法为每个属性分配一个权重来确定指纹变化。Van Goethem提出了一种基于加速度计的设备指纹机制,用于多因素认证。Freeman提出了一个统计框架,利用各种浏览器属性和其他参数(如访问时间)来检测可疑的登录尝试。
Spooren认为,与台式电脑相比,移动设备指纹相对缺乏多样性,在风险的认证中的可靠性较低,但这个研究并没包括一些先进的指纹技术。Laperdrix收集分析了119,000个指纹,发现虽然一些移动设备属性的多样性较低(例如浏览器插件支持有限),但其他属性(例如user-agent和画布指纹)的多样性要比台式机高得多。Eisen有两项设备指纹专利:第一项描述了通过记录服务器的本地时间和客户端时间差来检测欺诈(用户端时区、夏令时以及UTC漂移);第二项描述了一个通用的框架,在用户端向服务器请求的每个页面上获取指纹,并在指纹有足够变化时发出告警。
Varghese的专利描述了如何将设备指纹作为索引,从涉嫌欺诈的设备指纹数据库中匹配相关欺诈风险,并据此给账户访问分级。
Markus提出了隐式认证,根据用户行为如打字节奏、触摸屏输入、传感器输入(如陀螺仪、加速度计、附近蓝牙或WiFi)、使用模式(如访问时间、常用访问页面)等来加强或替代现有的认证机制。在更广泛的多维认证背景下,用户行为特征分析可与设备指纹一起使用,在不牺牲可用性的情况下实现更强认证。

三、设备指纹框架和威胁模型

在设备指纹中,服务器使用多种指纹向量验证设备的软硬件相关属性。“纯粹的”设备指纹是无状态的,对应则是有状态。而攻击者则会学习设备指纹的组成来对抗绕过。
有些向量要求浏览器执行操作,例如通过JavaScript,并将输出返回给服务器。如果一个向量响应是静态的,不管在什么情况下都不变,那么攻击者可以重放。如果服务器改变向量,或者使用单个向量,或其响应取决于条件或二次挑战,那就需要更高一级对抗,例如伪造地理位置等。
按照攻击能力,我们分为五类,用来分析设备指纹的防御能力。
设备指纹指南:上篇
M1:天真级。天真级就是传统密码猜测攻击,这是最容易防范的。攻击者试图猜测账户密码,但不对抗设备指纹,可根据历史数据确定暴力尝试来自来自新设备。
M2:密码和指纹猜测攻击。在多个账户中按流行程度暴力猜测密码,同时对设备指纹猜测迭代。攻击者可伪造设备匹配的指纹,这些指纹可能是为目标网站受众量身定做,例如针对特定国家用户的网站有特定时区访问者,特定厂商的技术支持网站则使用该厂商设备。然后,攻击者可以根据每个密码和设备指纹组合,在所有账户中递减顺序遍历密码-指纹。攻击者还可通过已泄漏密码库或设备指纹库(例如利用XSS获取大量数据伪造设备指纹)。
M3:目标密码和指纹猜测攻击。攻击者针对特定账户的密码猜测攻击,同时伪造指纹,这种攻击按照某种顺序对密码和指纹进行暴力迭代,通过已知信息(例如已知用户使用iphone7)或在特殊情况下可能拥有用户密码或用户设备指纹,从而将攻击降低为指纹猜测或密码猜测,大大减少搜索空间。
M4:指纹钓鱼和欺骗。钓鱼攻击可窃取密码和设备指纹。然后攻击者伪造指纹并使用密码访问,如果设备指纹不易伪造,这种攻击就比较困难。
M5:利用指纹欺骗进行会话劫持。攻击者目的是劫持会话,M1-M4攻击者是通过密码和指纹伪造来破解账户。M5攻击者则可窃取会话cookie,并利用诸如配置不当的HTTPS或XSS漏洞来执行用户端JavaScript。这样攻击者能够捕获设备指纹,从攻击者设备上恢复会话。因此,在M5下设备指纹必须很难伪造。
模型的总体分层结论如下:
M1:设备指纹可以防御,即使指纹可重放。
M2:设备指纹可显著降低攻击成功概率,即使指纹可重放,即使指纹的猜测空间足够大。
M3:这类攻击比较难以防御,因为攻击目标是特定用户,并拥有特定设备信息。
M4:最难防范,攻击者通过钓鱼获取密码和设备指纹,如果指纹可重放,就足以伪造。
M5:专门针对会话劫持,指纹不仅仅是在一个会话开始时,而是在整个会话过程中用来增强身份验证,后面我们会讨论。

四、设备指纹分类

我们查了各类研究文献、专利,以及网上技术文章、开源指纹库、营销广告和反欺诈服务,把所有的到的类型进行了总结分类,分类主要根据获取方法。
第一类:浏览器提供的信息。浏览器明确提供(例如JavaScript)多种系统信息,这些信息已知向量如下:
( a ) 主要软硬件细节。navigator和浏览器对象模型(BOM)公开了浏览器/操作系统厂商和版本、系统语言、平台、user-agent (有时还包括设备型号之类)、已安装插件、浏览器支持的存储机制(如本地存储(localStorage)、索引数据库(indexedDB)、会话存储(sessionStorage)、通过openDatabase的WebSQL)、屏幕分辨率、颜色深度和像素等属性。
( b ) WebGL信息。WebGL是用来在浏览器内渲染图形的JavaScript API,公开了底层浏览器和硬件各种属性(如GL版本、最大纹理大小、渲染缓冲区大小、支持的WebGL扩展、供应商/渲染器字符串)。
( c ) 系统时间和时钟漂移。设备的系统时间可通过JavaScript访问,并用于推断设备的时区、是否遵守夏令时以及UTC时钟漂移。
( d ) 电池信息。当提供足够精确的读数时,HTML5电池状态API适用于指纹识别。电池电量可用于在不同网站上对用户端进行短期跟踪,电池容量随着电池老化缓慢下降,但在相对较短的时间内,例如一天内变化不大,可通过监测约30秒的放电速率来估计,并用于辅助识别。
( e ) 永续cookie。Evercookie通过使用HTML5本地存储、HTTP ETags或Flash Cookie等多种技术,将用户端标识符存储在设备上,从而允许网站重建用户删除的cookie。
( f ) WebRTC。WebRTC是一套W3C标准,支持原生(无插件)浏览器应用,如语音和视频聊天。设备可通过枚举支持的WebRTC功能和媒体设备(如麦克风和网络摄像头)来进行指纹识别。对于哪些类型的设备可以在未经用户许可的情况下进行枚举,各浏览器的做法不同。WebRTC还公开了分配给设备上所有网络接口的IP地址,包括由用户分配的私有IP地址、NAT路由器或VPN。
( g ) 密码自动填充。JavaScript可以用来检测密码是用户输入,还是被浏览器或密码管理器自动填充。使用事件监听器来检测用户是否在密码字段中输入字符,为keydown和keypress分配一个事件监听器,由于事件是由物理按键触发的,缺失则表明密码是通过自动填充输入。
第二类:基于设备行为推断。不仅可以通过浏览器提供信息,还可在浏览器上执行特定JavaScript代码观察效果,如测量执行时间或分析输出来收集设备的信息,包括:
( a ) HTML5画布指纹。通过JavaScript在用户端执行HTML5画布渲染各种文本和图形,并向服务器发送位图图像的哈希。不同软/硬件设备生成的图像有细微不同,例如字体和抗锯齿会随操作系统和显卡驱动变化,表情符号随操作系统和手机厂商变化。使用预定义字体列表渲染文本,可以进行字体检测。使用WebGL渲染复杂的图形,可进一步提供指纹多样性。
( b ) 系统性能。在一系列计算密集型操作上运行JavaScript引擎基准,对运行时间进行测量,可推断设备性能特点;
( c ) 硬件传感器。移动设备传感器可以根据制造和工厂校准变化进行指纹识别,例如,测量手机加速度计的校准误差(通过JavaScript访问)或扬声器-麦克风系统的频率响应;
( d ) 滚轮指纹。监听WheelEvent事件,可通过JavaScript推断用户设备,当用户使用鼠标滚轮或触摸板滚动时,就会触发该事件。鼠标滚轮在触发时以固定增量滚动页面,触摸板则以不同增量滚动。测量文档的滚动速度可以显示用户滚动行为的信息和操作系统的滚动速度值。
( e ) CSS特征检测。浏览器厂商和版本可通过检测CSS特征来推断,因为各浏览器不统一。在目标元素上设置所需的CSS属性,然后查询该元素判断是否应用更改。这个向量可从user-agent获取。如果设备指纹已经通过另一个向量提取了user-agent,那么这里也用来测试信息是否被篡改。
( f ) JavaScript标准的一致性。浏览器对JavaScript标准的符合性不同,各种JavaScript一致性测试要数千个测试用例,加起来可能需要30多分钟。Mulazzani等人开发了一种技术,方法是使用决策树来选择一个非常小的子集,这些子集的运行时间可以忽略不计,可用来验证user-agent中报告的浏览器供应商和版本。
( g ) URL scheme handler。有些浏览器在访问本地资源时使用了非标准方案。例如,res://在Microsoft IE中是存储在Windows系统目录下DLL文件,Firefox中的moz-icon://、jar:resource://和resource://公开了内置浏览器和操作系统资源。因此网站可以创建HTML图片标签,将源地址设置为本地资源,并使用onerror事件处理来检测图片是否加载。通过迭代不同浏览器或操作系统版本预加载资源列表,向量可以列举。这算是一个替代方案,因为很多新版本浏览器出于隐私考虑,不再支持。
( h ) 显卡RAM检测。GPU可用RAM(VRAM)数量,虽然不能通过WebGL API明确获得,但可以通过反复分配纹理来推断,直到VRAM满了,之后纹理开始被交换到系统主内存。通过每次纹理分配的时间长度,并记录观察到的较大峰值,可推断GPU VRAM已达到充分利用的状态。在这之后,浏览器可以继续分配纹理,直到出现OUT OF MEMORY错误。
( i ) 字体检测。虽然不能通过JavaScript枚举已安装的字体,但可以用预定义列表中的字体来格式化文本,产生的文本尺寸可以区分不同的字体渲染设置,因此推断每种字体的存在。
( j ) 音频处理。HTML5 AudioContext API通过提供音频播放的实时频域和时域分析接口,允许创建音频可视化。和HTML5画布指纹一样,音频处理因浏览器和软/硬件不同而不同。
第三类:浏览器扩展插件。包括:
( a ) 浏览器插件指纹。浏览器插件,如Java、Flash和Silverlight,可以被查询(通过嵌入网页插件对象),以采集系统信息,而且比JavaScript提供的信息更详细。例如,Flash提供了完整的操作系统内核版本,Flash和Java插件都允许枚举所有系统字体,甚至系统字体的列举顺序在不同的系统中也会有所不同,增加了指纹的可区分性。
( b ) 浏览器扩展指纹。如果安装了NoScript扩展(默认情况下,除了用户白名单上外,所有网站都禁用JavaScript),网站可以尝试从一大批网站(如Alexa Top 1000)加载脚本,检测哪些网站在用户白名单上。同样,广告拦截器也可以通过嵌入一个虚假广告来检测,比如一个隐藏的图片或iframe,其源URL中包含广告拦截器常用的黑名单词(比如 “广告”),然后JavaScript可以检测假广告是否被加载,并将结果返回服务器。其他扩展也有不同方法进行指纹识别,比如一些浏览器扩展会添加自定义HTTP headers。
( c ) 系统指纹插件。网站可能会安装专门的插件,例如早年的网上银行,这样可提供更强大指纹信息,包括硬件标识符、操作系统安装日期和已安装驱动程序版本,不过这种插件现在一般会被杀毒软件报出。
第四类:网络和协议级技术。前面几类涉及在客户端上访问API,而网络和协议层面的技术也可给设备打指纹,包括:
( a ) IP地址。众所周知IP可用来做判断,也可查询WHOIS获得更多信息,比如所在自治系统和注册组织名称。虽然IP地址比AS号更精确,但AS更稳定,在校验用户位置时可以作为交叉检查。
( b ) Geolocation。地理位置可以通过几种机制来确定,浏览器通常会暴露API(例如通过navigator BOM对象),通过这些API,可以请求用户允许获取当前位置(GPS硬件、蜂窝三角、WiFi信息或用户提供的信息)。基于网络的机制也包括基于IP地址的WHOIS查询、基于路由数据的推理以及基于地理定位。
( c ) 主动式TCP/IP协议栈指纹。由于网络和操作系统TCP/IP实现之间的差异,可以通过向设备发送针对性探针并分析响应包头字段(如RTT、TCP初始窗口大小)或链路特征(如MTU、延迟)来确定指纹。这种方法与浏览器无关,可以在任何互联网主机使用。可以理解为Nmap之类的扫描,具有主机发现、端口扫描和操作系统检测能力,可以发送各种探测数据包,通过内置数据库中的启发式方法来区分成千上万的系统。这种向用户端发送特殊的探测数据包,称之为主动指纹,但可能会触发防火墙、IDS警报。
( d ) 被动TCP/IP协议栈指纹。被动指纹是侵入性较低的方法,但效果也较弱,通过嗅探网络通信,但使用主动指纹的启发式方法来识别主机,例如p0f这种工具。被动方法是比较合适的指纹向量,因为对现有header分析不需要制造新数据包,不具有侵入性。
( e ) 协议指纹。协议指纹用于更高级别的协议,用来区分浏览器软件、版本、配置,例如HTTP header、user-agent、支持语言、字符编码列表以及DoNotTrack参数。此外,浏览器的TLS库可以用ClientHello数据包从协商参数的握手序列中获得指纹,相关信息包括用户端TLS版本、支持的密码套件、它们的顺序、压缩选项和扩展列表(相关参数如椭圆曲线参数)。
( f ) DNS解析。很多用户默认DNS解析器是运营商配置的,但少数用户可能会设置其他DNS,如阿里云或OpenDNS。于是就产生了一种比较骚的方法,服务器向浏览器发送一份文件,文件包含一份随机生成子域名,但该域名的权威DNS服务器由网站所有者控制。当用户端试图解析时,网站的DNS服务器会收到来自用户端DNS解析请求,然后将随机生成子域与最初为用户生成的进行关联。
( g ) 时钟偏移。可以被动分析TCP时间戳,来测量用户时钟偏移—用户时钟和真实时间的偏离率。
( h ) 计算NAT后面的主机。Bellovin最早提出来计算NAT后面的主机数量,通过被动分析IPv4 ID字段(用于片段重构)来计算NAT后面的主机数量。Kohno则又提出使用时钟偏移来区分NAT后面的主机。这些技术可以通过上层信息来增强,例如在指纹中加入从同一IP地址访问的其他用户账户。
( i ) 广告拦截器检测。虽然广告拦截器检测可以用JavaScript在用户端进行,但也可以在服务器监控用户端是否请求了虚假广告。


原文来源:安全客

设备指纹指南:上篇

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: