目录
- 认识指纹
- 什么是指纹
- 指纹是怎么产生
- 设备指纹究竟是如何区分的“唯一”
- 什么信息是不能包含作为设备指纹?
- 小结
- 设备指纹实现原理与检测
- 手机之Android设备指纹
- 手机之IOS设备指纹
- Web设备指纹
- Web指纹有何作用?
- Web指纹常见采集点
- 推荐阅读
认识指纹
什么是指纹
设备指纹、浏览器指纹也是同理根据软硬件信息,设备版本、设备操作系统等差异性从而生成唯一的设备指纹。
人的手有手指、手掌握纹,通过凹凸规则、分布状态的差异造就了相对其独一无二的特征。
指纹是怎么产生
手机的操作系统、浏览器厂商为了方便用户与开发者获取用户的设备信息预留了一些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
- PhantomJSnightmare-JS 检测
- 等
隐身模式识别
Chrome:在隐身模式下,FileSystem API禁止,使用报异常
Firefox:在隐身模式下,IndexedDB执行Open报异常
Safari:在隐身模式下,localStorage对象存在,但运行setItem方法报异常
控制台检测
隐式调用元素Id
隐式调用Regexp等toString
Hook检测
自定义Hook检测:在定义函数时将函数整体作为参数生成Hash值在执行该函数时校验Hash值
函数检测:采集调用toString方法对内容进行校验(伪造toString方法即可绕过)
对象检测:通过Object.defineProperty
方法修改属性是不可更改的(可复写debugger即可)
其他检测:
SSL/TLS检测
Web指纹有何作用?
Web指纹的作用有很多,例如区分环境、区分机器人与真实用户,保障正常运行,只要是web浏览器的特征均可以作为web指纹
Web指纹常见采集点
web指纹常见采集点如下
全局:window、document
环境:navigator、screen、history
请求:XMLHttpRequest、fetch、worker、.$ajax
(jquery)、SSL/TSL
Dom:canvas、dom的操作
存储:storage IndexedDB cookie
其他:Cache、WebGL、AndioContext、WebRTC
NodeJS常见采集点如下
全局变量:global
导包:require
可被重写的全局
绝大多数的Web API
全部的DOM节点
无论做何操作均可视为区分正常用户与机器人,如果被检测出来,最简单的自然是拿不到数据,BT一点的关机、蜜罐、甚至强制删除电脑内文件。
很危险很刺激