认识指纹
什么是指纹
设备指纹、浏览器指纹也是同理根据软硬件信息,设备版本、设备操作系统等差异性从而生成唯一的设备指纹。
人的手有手指、手掌握纹,通过凹凸规则、分布状态的差异造就了相对其独一无二的特征。
指纹是怎么产生
手机的操作系统、浏览器厂商为了方便用户与开发者获取用户的设备信息预留了一些 API 供程序使用,用户和开发者可以通过这些 API 获取客户端相关的软硬件信息
这些信息因人而异通过部分信息来产生相对差异的信息来生成生成相对独立的设备 ID。
简单理解就是软件信息(部分或全部)、硬件信息(部分或全部)+ 指纹生成算法 = 生成指纹
辨识度的信息可以是系统信息、软件信息、地理位置、时区、语言等等,所给予的信息决定了浏览器指纹的准确性。
设备指纹究竟是如何区分的 “唯一”
在一般情况下单一维度的差异性并不能形成标识设备的稳定特性,但可以经过收集大量的隐形特征通过数据分析、建模等方式等组合使用,可以更加精准的区分唯一
例如:我们常见的双胞胎,它们长相相似、声音神似但根据以上两种特征无法有效的区分,但却可以根据更深层的习惯、喜好,甚至是某种条件反射的特殊因子,还是可以较为有效的降低 “指纹” 的碰撞率
什么信息是不能包含作为设备指纹?
根据国家法律要求,以下信息不能被作为指纹的因素
- 手机号
- 通话记录
- 短信
- 通讯录
- 身份证号
- 等
虽然这些信息有非常强的一致性,可以非常有效的提高设备指纹的准确性
但是涉猎个人隐私的数据都是不可触碰的信息。网上绝非法外之地
小结
设备指纹相同,很大概率上是同一设备或用户;但设备指纹不同时,不一定不是同一设备或用户
设备指纹实现原理与检测
采集设备指纹需要满足两大特征:较为稳定的环境、篡改监测
手机之 Android 设备指纹
设备的 Id 需要兼具稳定性、唯一性,但 Android 系统的开源和碎片化导致 API 函数实现不尽相同。下表是 Android 系统比较稳定的设备参数
采集项 | 中文含义 | 特征 |
---|---|---|
Android ID | 设备首次启动时自动随机生成的设备 ID | 1. 不需要授权,相同信号的手机小概率碰撞 2. 恢复出厂设置将被重置 |
IMEI/MEID | 设备码 移动、联通获取 IMEI 电信获取 MEID |
1. 唯一性质较好,还是存在小概率碰撞 2. 需要 READ_PHONE_STATE 权限 3. 未含有卡槽的设备无法获取 |
IMSI | 手机 SIM 卡识别 | 1. 需要 READ_PHONE_STATE 权限 2. 更换手机卡会改变 |
WI-FI MAC | 网卡 MAC 地址 | 1. 当未连接 WI-FI 时,有概率获取失败 2. 个别只读存储器恢复出厂设置会被重置 |
Bluetooth MAC | 蓝牙 MAC 地址 | 高版本 Android 系统无法获取(约 8.0 以上) |
Serial | 设备串号 | 同类型号的手机碰撞概率高 |
Fingerprint | 设备多个硬件编号统称 | 同类型号的手机碰撞概率高 |
Storage | 内存、磁盘空间 | 同类型号的手机碰撞概率高 |
Adverting ID | Google Play 广告 ID | 仅限于 Google 服务用户使用 |
Android 设备所有采集的项都是 Android 公开的 API,采集项被大面积篡改的情况下不能保持设备 ID 不变,通常有效的方式就是检测和监控运行环境,针对 Android 设备指纹检测可归纳为
- 通过安装安装包检测安装环境
- 通过特定的特征识别 root 环境
- 通过多种方案采集同一字段信息检测环境是否异常
- 通过通用的修改方式识别(例如中间人攻击、注入、Hook、重放攻击等),从而达到检测环境的效果
- 通过特定特征识别(例如 Xpose、Frida、模拟器等)检测
手机之 IOS 设备指纹
IOS 相对开源的 Android 系统权限更加严格,且手机型号、系统版本较与 Android 更单一。由于权限等影响 IOS 能够获取的设备参数较少。如下表列举了较稳定的 IOS 设备参数
采集项 | 中文含义 | 特征 |
---|---|---|
DeviceName | 设备名称 | 1. 用户可以自行修改,默认值存在很大的碰撞 2. 自定义值有较强的特征 |
WI-FI MAC | 网卡 MAC 地址 | 唯一性好,高版本手机不能稳定性采集 |
Boot time | 系统开机时间(μs 微秒) | 1. 存在少量碰撞,重启会发生改变 2. 采集多次可能会发生变化 |
Storage | 内存、磁盘空间 | 同类型号的手机碰撞概率高 |
IDFV | 厂商标识符 | 1. 不能跨合作方 2. 删除本合作方 APP 后重新安装发生改变 |
IDFA | 广告标识符 | 1. 需要广告权限 2。用户可以限制广告追踪 |
IOS 大部分篡改都是基于 Hook 进行改机,以及模拟器。
IOS 模拟器其本质为在 X86_64 架构上运行 iPhone 自带的模拟器,同时 APP 需要页数适配才能被安装
IOS 采集指纹检测可分为如下
- 通过通用的 Hook 原理进行识别
- 通过特定的工具特征识别
- 寻找特定空间存储设备标识进行识别
- 对抗备份、抹机,进行识别
Web 设备指纹
Web 设备指纹(浏览器指纹)是指用户硬件、软件信息综合计算产生标识
Web 指纹特点
通过 Javascript 采集信息生成对应设备 ID,与传统的 Cookie 技术相比较,Web 设备指纹更加稳定
稳定浏览器版本采集参数,如下表所示
采集项 | 中文含义 | 特征 |
---|---|---|
UserAgent | 浏览器客户端标识 | 可以任意伪装与修改 |
Gpu | 设备 GPU 特征 | 1. 碰撞率高 2. 可跨浏览器 |
Canvas | 2D 指纹 | 唯一性好(不同浏览器的指纹不同) |
Webgl | 3D 指纹 | 1. 碰撞率高 2. 可跨浏览器 |
Plugin List | 浏览器自带插件列表 | 当用户安装特殊插件,相同浏览器碰撞率高 |
FontList | 字体列表 | 当用户安装特殊字体,相同浏览器碰撞率高 |
IP | 内网 IP / 外网 IP | 1. 切换网络会改变 2. 内网采集局限性大 |
TCP | 网络协议 | 1. 不同操作系统协议差异大 2. 不易被修改 3. 用户无感知 4. 碰撞率极高 |
Navigator | 有关浏览器的信息 | 相同系统、相同版本碰撞率极大 |
Web 指纹采集检测可如下
- 识别浏览器异常环境
- 特征检测(原型链)检测 Hook
- 特定特征识别 JS 是否调试与检测(控制台、debugger 等)
- 特殊方式存储浏览器设备标识(如 localStorage)
Web 指纹采集检测原理可如下
无头浏览器识别
- UA 识别:检测 / Headless Chrome/.test (Navigator.userAgent)
- Webdriver 检测: Webdriver 是否在 navigator
- selenium 检测:检测
window.seleium
- PhantomJS\nightmare-JS 检测
- 等
隐身模式识别
Chrome:在隐身模式下,FileSystem API 禁止,使用报异常
Firefox:在隐身模式下,IndexedDB 执行 Open 报异常
Safari:在隐身模式下,localStorage 对象存在,但运行 setItem 方法报异常
控制台检测
设备 隐式调用元素 Id
隐式调用 Regexp 等 toString
Hook 检测
自定义 Hook 检测:在定义函数时将函数整体作为参数生成 Hash 值在执行该函数时校验 Hash 值
函数检测:采集调用 toString 方法对内容进行校验(伪造 toString 方法即可绕过)
对象检测:通过 Object.defineProperty
方法修改属性是不可更改的(可复写 debugger 即可)
其他检测:
SSL/TLS 检测(产品:akamai)
推荐阅读
浏览器指纹在线检测:http://f.vision/