如今越来越多的智能设备都采用了各种各样的生物特征识别技术,例如指纹、虹膜、人脸等。在大家心中,这些生物识别都是安全性极高,不会有风险的。但是我们深入研究后发现,其实这些生物特征识别技术都存在传感器容易被欺骗的安全问题。同时在今年的10月24日举行的Geekpwn破解大赛上,我也向大家展示了常见生物特征识别的破解show。由于现场电源干扰的原因导致指纹采集噪点过多,指纹破解show存在些小的问题没有成功展示。应安全界朋友邀请,特以本文对手机指纹的安全问题做深入剖析。
为了更清晰的给大家展示指纹识别使用过程中的安全风险,同时也是希望各个手机厂商增强对指纹识别传感器的安全性重视,百度安全实验室对常见手机型号进行了大量测试,编写并发布了这个智能设备指纹安全调研报告,包含指纹识别的原理、攻击方法、测试统计等。测试结果非常令人忧虑,所有测试品牌和指纹芯片都没有承受我们的5-5攻击(制作过程不超过5分钟,耗材不超过5角钱)。我们呼吁手机厂商以及指纹芯片厂商重视这个威胁,保持对持续对抗的技术投入,并且在重要场合使用复合认证技术,不要采用单一指纹认证做大额转账等高敏感操作授权。
同时我们也需要指出,实现手机上的假指纹攻击需要攻击者拿到对方手机这个前提,而对于大部分国内用户而言,这个风险并不大。指纹解锁和指纹支付目前已经十分流行,在网络环境下也比Pin Code/Password等传统手段更安全。我们不希望普通用户因为这个安全问题产生对指纹识别验证的恐慌。同时我们也提醒带有指纹识别功能的手机用户:请妥善保管自己的手机,防止他人轻易拿到。只要坏人拿不到手机,指纹复制攻击也是无法实施的;而手机一旦落到坏人手中,指纹复制攻击将可能是他们最好的突破口。
现阶段,任何一种生物特征识别,都是通过传感器把生物特征投影成像为数字信号,指纹也不例外。具体来说分为指纹图像提取、预处理、特征提取、比对等步骤。
图1指纹图像提取原理
根据指纹图像提取技术的不同,现阶段主要分为光学指纹识别模块、半导体(电容)指纹识别模块两大类。我们希望通过对这些指纹图像提取模块工作原理的介绍,让大家对硬件传感器层面有更直观更深入的了解,同时便于对后续攻击方法的整体理解。
因为这个技术应用的最早,现在依然有很多门禁、打卡机等等在使用这种技术。技术原理是利用光的折射和反射。优点是造价低、可靠性高。不过由于光学本身的特点,所以想要集成到小模块当中,应用到手机上是个难点。另外光学指纹识别之前有一个麻烦的地方,就是如果手上有油污或者汗水,识别效果就会大幅度降低。
当光源在全反射角以上,就是光源侧着照进去时,光线会侧着反射出去,在反射光的角度用镜头拍摄,就能拍到很亮的背景。如果指纹在棱镜表面光源照亮的区域接触,那么指纹凸出的部分(脊线)和棱镜接触,凹下的部分(谷线)不会接触,接触部分因为全反射效应会有一个受抑制的情形(光线从脊线接触的地方透射出去了),反射光的对应区域会变弱,这时候CMOS传感器会收到一个脊线暗、谷线亮的图像,原理图如图2所示:
图2光学指纹模块工作原理(全反射角以上)
而当光源在全反射角以下时,光线从正下方射入,这时候光线不会从棱镜上透射出去,但是手指与棱镜接触的区域,光线会发生所有角度的散射,这时候就会出现凸出的脊线部分为亮(看起来就像是接触到玻璃的脊线把光都导走了并且亮了),谷线为暗(没有接触的部分CMOS看到的是黑色底板反射的黑像),这样就可以形成指纹图像,例如我手中的光学指纹模块就是这种,工作时成像如图3所示。当没有手指放入的时候,由于CMOS只看到了反射的黑底板,会呈现全黑的图像,光路图如图4所示。
图 3 CMOS传感器看到的指纹成像 |
图4 光学指纹模块光路图部分(全反射角以下) |
图5 FPC 1042光学指纹模块整体结构图
图6左边是这款FPC 1042光学指纹识别模块采集到的图像,其他光学型号类似,特点是图像分辨率较低、间断点较多、受手湿等影响较大。例如图6右边是在手上有水的情况下的指纹成像。
图6 光学指纹模块采集到的图像以及手上有水时的成像
电容式指纹识别要比光学式的复杂许多,其原理是将压力感测、电容感测等感测器整合于一块芯片中,当指纹按压芯片表面时,会感应放出瞬间电压导向手指(我们会发现各种电容传感器周围都会有一圈金属圈,为的就是把电荷导向手指),这时硅传感器成为电容的一个极板,手指则是另一极板,每一个像素的电容感测器会根据指纹波峰与波谷距传感器距离的不同而产生相应的电荷差,最终所有像素的感测器形成8bit的灰度图像,原理图如图7所示。
图 7 电容指纹识别模块原理 |
图 8 FPC 1020电容指纹传感模块(传感器+主控) |
这里以国内常见的FPC1020电容指纹传感器为例,给大家介绍下结构。
我们可以发现,采集部分结构比较简单,由一个比5角硬币还小的传感器便完成了采集任务,相比于光学传感器体积小、集成度高。所以这种传感器广泛应用于手机、便携设备等地方。(例如早期指纹手机H厂商的M系列就是直接采用的这片FPC1020传感器,国内很多高级门锁、保险箱也是采用的这款)
图9是这款电容指纹识别模块采集到的图像:
图9 电容指纹传感器采集到的指纹图像
从图像中我们可以明显感觉到采集精度、抗干扰等相比光学指纹传感器都有了明显提高,同时采集速度也快了很多。
这些指纹模块一般都支持二次开发(传感器+主控芯片),具有指纹图像采集、指纹比对的功能,既可以使用内置算法对获取图像进行特征匹配给出结果,又可以支持图片下载到用户端进行其他算法的匹配、公民指纹图像采集等。我们主要是用了其中的图片下载功能对指纹进行复制、研究。而手机中、我们平常见到的指纹锁等,不会存储用户的指纹图像,仅会存储几组指纹的特征数。
最基础的指纹图像已经获取到,有的同学可能会认为指纹的匹配就是用传感器现在获取到的指纹图像与最初存储的图像做比对。实际上考虑传输&存储成本、效率等问题,指纹的识别匹配算法是通过对传感器获取到的指纹图像进行迅速提取特征,对特征进行比对实现的。
整体的特征提取需要如下步骤:图像预处理、指纹图像增强、二值化、细化、提取特征点等。其中指纹图像增强方面最为重要,众多学者做了大量研究工作。
图10 指纹识别匹配算法流程
由于网上关于指纹识别算法信息很少,没有较为完整的实现,部分实现方法也千奇百怪(甚至有通过图片相似度实现,效果大打折扣)。我们通过分析实际使用的指纹系统并查阅大量论文,给大家整理下一般的指纹识别算法流程,并通过代码实现,希望通过这些具体的步骤,让大家更直观的理解指纹识别软件层面的处理、识别方法。
我们以上面通过电容传感器得到的指纹为例,这张图片的主要问题有:
图11 电容传感器采集到的指纹图像以及存在的问题
首先进行图像预处理,主要是规格化和图像分割。规格化是把不同原图像的平均灰度和对比度调整到一个固定的级别,为后续处理提供一个较为统一的图像规格,以减少不同指纹图像之间的差异。图像分割是把指纹前景区与背景区分开。指纹图像的前景区是由脊线和谷线交替组成的,其灰度统计特性中局部灰度方差比较大,而指纹图像的背景区,这一值是很小的。基于这一特性,可以利用图像的局部方差对指纹图像进行分割,去除无用图像部分。
图12是通过局部方差获取到的图像分割边界,后续处理都是在这个边界里进行:
图 12 边界计算后的图像蒙版 |
图 13 指纹的方向场 |
这里首先介绍下指纹的图像增强处理。我们通过图6以及图9可以知道,通过传感器采集到的指纹纹理并不是十分清晰,而且经常会伴有中断、粗细不均等现象。为了“修复”这些瑕疵,让指纹特征更好的体现出来(例如让纹理看起来更平滑、统一),引入了这种处理方法,利用相关的算法完成修复增强效果。
首先我们来求一下方向场和频率。方向图是指纹图像中脊的走向所构成的点阵,是指纹图像的一种变换表示方法,它包含了指纹形状和特征点的重要信息。这些信息为后续的去除指纹干扰&噪点滤波,提供了每个块的重要的方向、频率信息,作为一个重要的参数传递给下一步的方向滤波。
Lin Hong等人提出了一种利用梯度算子求取方向图的方法。通过这种算法,得到上面指纹的方向场图像,同时存储方向场数组(大家仔细观察,每个块的方向跟对应位置的指纹纹理走向是一致的),如图13所示。
下面我们来引入对指纹纹路的滤波优化。一般一幅指纹图像是脊线和谷线组成的线条状图像 ,因此其灰度直方图应表现明显的双峰性质 , 但是由于指纹采集时受到各种噪声的影响(采集设备污染、手指干燥&脱皮等),使得实际得到的灰度直方图往往并不呈现双峰性质,并且伴有中断、纹路深浅、粗细不均等(可参见图6的情况)。因此一般的基于灰度像素处理的图像增强方法如色阶调整、直方图校正、对比度增强、锐化等很难取得明显的效果(大家可以把这些图像放到PS里各种处理,发现不管怎么处理,不均匀的粗细、中断等都无法解决)。
为了解决这些问题,我们尝试使用Gabor 滤波对指纹图像进行处理。对于指纹图像, 局部区域的纹线分布具有较稳定的方向和频率,根据这些方向和频率数值,如果尝试设计出相应的带通滤波器就能有效地在局部区域对指纹进行修正和滤波。由于Gabor滤波器可以同时在时域和频域上获得最佳的分辨率,具有良好的带通性和方向选择性,可以采用Gabor 滤波器来实现指纹图像的增强。经过滤波器的增强,指纹图像会变得粗细均匀、平滑、修补间断点等。
图15 Gabor滤波器的一般形式
图15即为Gabor滤波器的一般形式,其中Φ表示滤波器的方向,f 表示 脊线形成的正弦波频率,δx 和δy 为沿 X 轴和 Y 轴的空间常量,x、y为每个像素的位置。结合之前得到的每个块的方向场数组,同时这里设定频率为常数(很多研究表明,指纹频率在一定范围内不影响整体滤波效果),带入处理结果如下:
图 16 使用Gabor滤波器处理后的指纹 |
图 17 细化处理后的指纹图像 |
通过结果可以看到,指纹图像经过Gabor 滤波后变得十分平滑均匀,这为后续的特征点确定打下基础。
指纹图像二值化的目的是把灰度指纹图像变成 0、1 的二值图像 , 使指纹的纹线信息更加清晰简洁。二值化方法较为简单,主要是根据一个阈值进行像素去留判断,这里就省略。由于指纹图像二值化以后 , 纹线仍具有一定的宽度 , 为了进一步压缩数据 , 简化、统一特征提取的计算, 需对指纹图像进行细化处理。这里使用基于领域的判断算法,决定某个象素该移去还是保留。如图17既是细化后的指纹图像。
最后就是对细化后的指纹图像取特征点了。提取原则是根据细化后的图像,提取分叉、交汇、末端、单独点作为特征点,同时在一定距离范围内减少过多特征点、删去边界特征点。我们来看下最终提取结果:
图18 指纹图像的特征点提取结果
可见红框中既为指纹的特征点,其中标注出的关键点均是指纹纹路的末端、交汇等。最终把特征点存储在只有指纹模块才能访问的存储器中。当下一次指纹进行比对时,用同样方式提取特征点,并把特征点数组进行逐个对比。结合手指的一些蠕变变形误差、传感器误差等,当匹配误差小于一定阈值(例如使用排序算法,逐个匹配特征点,存在一个点与邻点的关系和原始特征相比,距离误差小于5%,位置角度误差小于10度),可认为是同一个手指,比对通过。
我们来总结下传统的指纹比对识别过程。指纹纹路对于每个人来说都是唯一不变的,利用这个特征我们可以用来进行身份验证。但是由于指纹图像受传感器污染、按压力度大小、脱皮、干燥等影响,初始图像并没有很直观、统一的特征,同时存在很多噪点、干扰,需要对其进行进一步归一化、滤波处理。处理后便可进行指纹特征的提取,以便特征存储或比对。
但是由于小型化、易用性的需求,现在的指纹识别传感器在手机上已经做的非常小了,需要在更小的空间上对指纹特征进行识别提取,相应的传感器单位面积分辨率也会大大提高,软件识别算法也有些变化。篇幅原因,这里不做展开。
通过上面对原理的介绍,我们可以了解到,手机等设备通过指纹特征进行特征提取、身份验证。这里面就会存在一个真假指纹的问题,而我们的攻击目标便是:如何制作出一个假指纹并像真指纹一样通过验证。
通过大量分析研究,我们提出了如下两个攻击思路:
通过指纹采集的方式获取原始指纹图像,进而制造一个假体指纹,可以通过认证
通过文件读取等获取到指纹特征文件,根据指纹特征制造一个假体指纹,可以通过认证
由于指纹特征一般情况下都采用了安全存储,平常较难获取到,我们这篇文章主要研究下思路1,具体概括如下:
我们首先通过指纹膜的制作,证明假指纹制作的可行性以及活体检测的普遍缺失。然后寻找出获取到一个人的指纹纹路图像的有效方法。最后通过指纹膜中一些原理的启发,结合刚刚得到的指纹纹路图像,制作出可以骗过传感器的假指纹。
我们希望通过这些探究和实际测试,可以给大家直观的展示指纹识别所存在的安全风险,展示一些简单又有效的指纹采集方式,让模块生产商、厂商、用户对这些攻击方法予以重视,并加以防范改进。
通过一些影视剧作品,我们可以发现假体指纹的制造在很多年以前就已经存在了(1971年的007电影首次出现指纹膜),现在主要在考勤机代打卡、驾校代签到等场景中有使用。通过万能的X宝(由老司机指点,较为隐蔽),我们购买到了指纹膜制作套件。套件根据卖家询问:按手指时机器是否发光,会推荐光学或者电容型。我们两种都购买了,来研究其制作过程。
制作说明(参见图19):
滴几滴蜡烛到纸上,没干透的时候把指纹印按上;
另取1毫升胶,3滴左右固化剂,搅拌均匀,将搅拌好的胶转移到刚才印的指纹印中间,该上个塑料袋,从中间往两边抹平;
等一个小时候,揭下指纹印,大功告成。
图19 电容版指纹膜制作套件及说明
图20 手指和指纹膜都具有导电性
跟着步骤做了个模型,兴冲冲的测试了多个手机(包括几款最新型号)、模块(包括光学模块),发现均可以顺利解锁。同时经过仪器测试,材料中包含导电硅粉,具有导电性(参见图20),结合之前的成像原理,我们可以总结出如下结论:
不论是光学或者电容传感器,根据前面提到的成像原理,成像都需要制造出指纹的凹凸
各个系统所谓的活体识别(稍后介绍各产品在这方面的描述)貌似并没有奏效的,所测试十余款设备均可解锁
如果可以做出具有凹凸、任意成型纹路的假指纹,便可直接骗过光学传感器
如果在这个基础上再实现导电特性,便会直接骗过电容传感器
总结一下就是:通过测试发现,现阶段设备对假指纹的鉴别非常有限,只要复制出指纹的纹路并且具有导电特性即可。
同时,通过制作自己的假指纹我们已经成功实现了解锁手机等通过验证。但是这种制作实际上是没有安全风险/攻击场景的!我们在制作的过程中,需要把手指放到蜡烛等上面去定型制作指纹模具,然后再用其他成型材料去倒模,最终得到指纹假体。试想:谁会让你去拿着你的手指去按压、定型呢?这只能是一种自己制作自己假指纹的行为,以此来指纹打卡签到等。
所以,我们把攻击目标确定为:获取并仿制出别人的指纹纹路,以此来骗过传感器通过验证。不过首先需要解决第一个问题:如何获取到别人的指纹纹路信息?
经大量测试,有以下几种有效途径均可顺利取到有效指纹(这些方法都可以通过简单的手机相机实现,不需要电影里那些玄乎的技术):
直接获取:
带有指纹的高清晰照片(例如领导人挥手示意时)
合同、按手印活动等上面的指纹图像
通过模具成型获取到的指纹(例如明星在星光大道留下的掌印,有时精度较低)
间接获取:
获取手机、玻璃杯、指纹模块等上面留下的指纹痕迹
用电容指纹传感器经过伪装成按钮、特制的门把手等得到的指纹
下面举例说明。
合同中指纹获取:
使用手机拍带有指纹印的合同等,即可提取可用的指纹纹路信息,便于后续假指纹制作等。
图21 手机拍下的某份带有指纹印章的合同
如下是用手机拍摄的这枚指纹进行预处理、图像增强、细化后的结果:
图22 对指纹印章进行预处理、图像增强、细化后的结果
总之,只要是提取到了指纹纹路图像,就可以对图像进行进一步优化处理了。由于后续步骤一样,以下只展示提取原始指纹灰度图像部分。
2.相机拍摄的图片中指纹获取:
图 23 普通相机拍下的带有手指的照片 |
图 24 对手指进行二值化获取到的指纹纹路
|
3.手机后壳上的指纹获取(可以清晰的看到,换一种角度/一种光照,这些指纹就可以变得很明显了)
图 25 用手机拍摄的某手机背面,在灯光斜射下指纹清晰展现 |
图 26 手机背面指纹二值化后的图像
|
顺便说一句,其实指纹图像获取会有很多方法、扩展。例如我也是个摄影爱好者,曾经成功的用佳能70-200镜头获取到了10米外的笔记本电脑屏幕上的指纹,也算是一种远程打击了吧。
同时,这里必须指出,指纹图像的获取是在破解指纹验证中至关重要的一环,可以说只要获取到了指纹图像,就成功了一大半了。因为图像里面已经包含了指纹的全部原始信息,后面要做的无非就是拿着图像或者图像对应的特征,让传感器正常感应/感光,同时绕过各种活体检测拦路虎,完成对传感器的欺骗。
我们已经成功获取到目标的指纹图像了,那如何重制出高精度的假指纹呢?我们测试了包括高精度3D打印、针式打印机成型、导电墨水打印机多层打印、激光雕刻等多种技术方案,这些方案有个共同的特点:由机械进行传动成像成型。由于机械部件之间往复运动会存在一定的旷量,位置传感器、电机通常也有一定的误差,最终导致分辨率有限,现有这些设备均无法满足指纹细小纹路的精度要求,成型模型细看上去会呈一定程度的非线性(当然,我们猜测几十万+的工业级设备例如超高精度3D打印可以完成这个工作,但是成本太大)。
既然这些激光头、打印头无法满足精度需求,我们又把目光放到了腐蚀成像这种不依靠机械,而是依靠光学or化学进行成型的方案,例如光敏成型、化学腐蚀成型。这种方案的特点是:只要原像清晰,由于是对原像进行投影成像,最终成像会无限接近原像,肉眼一般无法分辨。考虑到精度、成本、速度等因素,最终选用了一种光敏成型方案,灵感来自于光敏刻章方法,下面简单介绍下这种技术。
光敏印章是上个世纪九十年代初由日本发明的,它使用了一种超微泡材料完成成型,其表面的微孔孔径非常小。这种材料在受到强光照射的时候,见光部分会瞬间吸收大量的光能,温度迅速上升并达到熔点,使材料表面发生光氧化及热交联作用,最终效果是迅速收缩塌陷,而不受光射部分保持之前的状态。
根据光敏材料的这种特性,人们在材料表面覆盖了一张用黑白激光打印机打印出的印章图像(最好使用硫酸纸这种透明纸),在受到强光照射时,白色透光部分就会收缩塌陷,而黑色部分保持原平面高度,最终形成一个具有凹凸不平表面的印章图像,速度和精度比原始的刻章快了好多。
图 27 指纹印章制作过程
受到光敏印章的启发和指纹识别的成像原理(光学和电容指纹,都需要有凹凸不平的表面),我们想到如果把打印的印章图像换成指纹纹路图像,是不是也可以成型出凹凸不平的指纹纹路呢?经过大量测试发现,只要调整指纹纹路的粗细和强光的功率,完全可以满足假指纹制作的精度要求。
我们以图21中的指纹图像作为样本,尝试制作指纹印章。具体的细节出于安全目的本文就不详述了。我们可以看到,使用这种方法生成的指纹印章如果再沾上些印泥,印出来的指纹图像可以和实际用手指印生成的指纹图像相比十分相似,甚至很难做区分,存在很高的合同欺诈等风险。如图28所示(如果不告诉大家,大家会发现左边的那个指纹是用印章印出来的吗?)
图 28 用指纹印章伪造真实指纹图像
指纹印章的测试证明了光敏方法可以生成精度较好的指纹模型,可以得到了和原指纹纹理一样的具有凹凸不平的假指纹模型。
这种方案的优点如下:
成型快,瞬间成型(小于一秒),优于紫外线腐蚀照射等长时间等待
精度高,完全满足指纹识别需求
成本低(耗材一次成本不超过5角,辅助设备生活中常见:激光打印机、普通闪光灯、透明纸、玻璃板)
经测试,制作出来的假指纹可以顺利解锁智能门锁、考勤、门禁等光学指纹模块,但对电容指纹模块似乎没有效果。回想之前我们通过滴蜡模具做的假指纹,是可以通过电容模块的,同时具备导电的特性。所以我们光敏成型的假指纹如果需要通过电容模块,必须具备导电性,也就是需要在凹凸不平的整个表面覆盖一层导电材料,同时不影响本身纹理。这种材料可能是一种粉末、或是液体状的。
我们首先想到的是铅笔粉,容易获取到同时具有导电特性。经测试,如我们所料,在抹上一层均匀的铅笔粉末后,假指纹模型可以顺利的通过验证。但是这种方法的成功率较低(与无法均匀覆盖有关),同时发现测试两次以后,由于粉末掉落,导致失去导电性。但是这种方式证明了我们的方向是正确的,后续又测试了几种材料,最终发现一种导电液体可以很好的在表层形成均匀的导电膜,而且晾干后会一直覆盖在表面不易脱落。其成本也很低廉。
至此,我们完成了在已有目标指纹图像的前提下,顺利的解锁了目标设备(包括光学、电容传感器)。为了证明指纹生物特征安全风险的严重性、广泛性,我们做了一系列测试和统计,统计结果显示市面主流的指纹识别方案均受假指纹问题的影响。我们希望通过对主流手机假指纹风险进行测试,并基于这些较为全面的测试结果,让传感器生产商、手机厂商直观的看到这种安全风险广泛的受影响面,以及当前每种识别方案存在的具体问题。
如下是统计详情:
我们对常见的手机指纹识别方案进行了调研,发现市面上主要有:
AuthenTec方案(苹果已经收购该公司,主要提供给I系列手机使用)
FPC方案(主流方案,早期Android手机大量采用,当前出货量级依然top2)
汇顶方案(汇顶科技是近来新起之秀,国内多款畅销、旗舰手机均有使用)
表格 2手机常见指纹识别方案
我们针对每一种方案,均挑选了几款代表机型进行测试验证。得益于兄弟团队移动安全部门的设备支持,所测试手机基本覆盖了国内能买到的各家旗舰/最新款。
统计目标:测试统计各手机厂商旗舰型号、广泛使用型号手机,使用假指纹能通过指纹验证的情况。
步骤:
首先制备出目标手指(假定右手食指)的假指纹模型(这里我们直接选取传感器间接获取指纹图像的方法),同时进行导电处理,待用
取各厂家型号手机,分别仅注册录入一枚固定手指作为屏幕解锁认证。确认真实手指可以顺利解锁
分别测试在锁屏状态下,使用假指纹模型解锁的情况
表格3 受影响品牌统计结果
手机品牌 |
是否可以通过解锁 |
指纹识别方案 |
手机厂商1 |
顺利通过 |
FPC 1025 |
手机厂商2 |
顺利通过 |
FPC 1245 |
手机厂商3 |
顺利通过 |
FPC 1155 |
手机厂商4 |
顺利通过 |
FPC定制方案 |
手机厂商5 |
顺利通过(精度要求高) |
汇顶 |
手机厂商6 |
顺利通过(精度要求高) |
汇顶 |
手机厂商7 |
顺利通过 |
意法半导体fingertip |
手机厂商8 |
顺利通过 |
AuthenTec |
注:FPC是著名指纹设备和解决方案提供商FingerPrint Cards 公司的系列产品名称,广泛嵌入在各家Android手机的指纹解锁模块中。
演示视频:
通过上面的测试统计结果,我们可以清晰的看到:市面上三个主流方案均受假指纹的影响,可以顺利解锁,而各家所谓的生物识别、活体识别等似乎都没有奏效。
这里需要指出的是,虽然三个主流方案都受到影响,但是表现出的攻击难易度、特点各不相同,其中我们花费了很多时间在汇顶的方案上,经过多次反复优化、测试才得以通过,安全性在三者中相对最高。详情如下:
FPC方案:对指纹大小比例较不敏感,对导电特性的要求不敏感,接受优化过的指纹图像
AuthenTec方案:对指纹大小比例很不敏感,对导电特性的要求敏感,接受优化过的指纹图像
汇顶方案:似乎对我们的指纹优化不买账,需要十分精确的对指纹纹路进行克隆,比例和导电性要求都很敏感,是我们测试的所有方案中攻破难度最大的一家。
概念解读
先来看一下活体检测的官方解释。2014年6月,国家知识产权局专利局王馨宁审查员发表了《生物特征识别中的“活体检测”概念及分析》,作为专利审查工作中遵循的科技名词定义规范。其中活体检测概念定义为:“为了防止恶意者将伪造的他人生物特征用于身份认证,在生物特征识别过程中,针对待认证样本的是否具有生命特征进行检测的技术,称为活体检测。活体检测是将具有生命特征的人的样本,与仿制的人造样本进行区分的过程,是欺骗检测中的一种”。
实际情况
了解官方解释和测试标准后,我们来看下当前指纹识别的活体检测防范攻击情况和我们的待测假体的攻击级别。
首先介绍下指纹识别中各家常用的活体识别方案:
对于光学传感器,一般都没有任何活体检测方案。少数会声称有如下方法:玻璃使用导电材料,主控检测是否带电(例如走廊的触控感应电灯);检测玻璃温度。这里有个很奇怪的现象,主控检测是否带电主要是为了感应手指接触,接触时打开led光源,同时通知传感器采集指纹。而这样一种本身的功能需求实现竟然变成了一个活体检测的方法。
同样的现象也存在电容传感器中。很多厂家会声称自家的模块带有手指导电性检测,以此来判断是否是真手指。但是根据前面的成像原理我们可以知道,电容传感器电荷感应是建立在手指导电的基础上的,是本身识别实现的要求,并不是一个加持检测方法。
下面我们分别对手机上的这三种指纹方案活体检测能力做下分析:
首先看下Apple的情况。网上关于IPhone 6系列手机的指纹模块安全性资料显示,touch ID很可能采用了更加先进的活体识别方式(有大量关于射频真皮识别的新闻)。查阅相关专利,确实发现苹果在这方面有所研究,例如苹果公司的US 8180120 B2专利,使用固定角度的偏振光对手指进行照射,根据获取到的手指中的氧合血红蛋白和脱氧血红蛋白、β-胡萝卜素等等光谱情况来判断真假手指。但是这种技术是否在TouchID中有使用呢?答案当然是没有,否则我们的假指纹攻击也不会通过。查阅了苹果官网对TouchID的安全性介绍,我们可以发现,Touch ID仍然还是传统单一的电容检测技术,只是苹果强调了它的精度是很高的。
图29 苹果官网对TouchID的安全性介绍
再来看看指纹识别处于领军地位的Fingerprints,以手机厂商1最新M系列上的FPC 1025为例,通过查阅Fingerprints公司对FPC 1025介绍,并没有发现提及活体检测方面的安全内容。
最后看下近来势头很猛的汇顶科技。其官网介绍文中有提到具有通过血液、心率信号检测来识别假指纹的技术。但是在我们测试的使用汇顶方案手机厂商5的X系列和手机厂商6的M系列产品中,依然可以通过我们制作的假指纹通过验证。可能这些手机并没有采用带这些高级活体检测的传感器,我们不得而知。
图30 汇顶科技官网上对其方案中活体检测技术的介绍
通过上面的分析,我们可以得出一个结论:现阶段拥有指纹识别模块的产品中,基本上没有使用有效的活体检测的技术去对抗攻击。
我们一直认为,一切不切合实际的、超高成本的攻击方法,都是耍流氓。举个例子,最近IPhoneX很火,大家都在致力于破解FaceID。不少研究机构使用了高精度3D打印、高精度脸膜制作等方法,即使证明了可以破解,也很难在现实场景中产生危害。在一个安全漏洞的安全等级确定中,攻击成本占很大一部分分值。只有当这个安全问题的攻击成本很小,但是可以产生很大的危害时,才有可能影响到大部分人的利益,大家才会受到重视并且想办法去解决。
我们顺便再看下待测假体的攻击级别定义。在由多家单位、企业共同起草的行业标准《安防生物特征活体检测技术要求》的征求意见稿中,对待测假体类型划分了轻度、中度和重度三个级别:
轻度攻击性假体指以简单的技术手段为工艺获得的、具有低攻击能力的假体
中度攻击性假体是指以复杂的技术手段为工艺获得的、具有一定攻击能力的假体
重度攻击性假体是指以非常复杂的技术手段为工艺手段制造的、具有极高攻击能力、十分逼真的假体
根据这个级别划分定义,结合我们之前假指纹制作中所使用方法,以及攻击成本和达到的效果,我们的攻击方式可以划分到一个新级别:
以简单的技术手段为工艺获得的、具有很高攻击能力的假体。
回到我们探讨的指纹安全问题上,我们在前面的测试中已经实现了低成本的指纹图像获取和假指纹的制作,最终结果是可以顺利通过各种指纹验证。现在我们来总结下成本究竟有多低。
攻击阶段 |
攻击成本 |
指纹图像获取 |
手机or相机 |
假指纹模型制作 |
打印机、光敏材料、导电硅胶(可用铅笔粉代替) |
可见,最低成本只需要一部能拍照的手机、一个能用的打印机、一块几毛钱的光敏材料和一根铅笔就够了,一次性耗材不超过5角钱,制作时间不超过5分钟,我们称之为5-5攻击。
指纹、虹膜、人脸、静脉这些生物特征,是人生下来就有的,并且具有不重复唯一性,可以用来很精准的对一个人进行识别判断。在大家意识中,生物特征识别的安全性要高于传统密码的,同时生物特征又有验证便捷的特点(相对于密码输入)。但是大家可能忽略了一点:这些生物特征数量少而且无法更改,一旦泄露就会存在安全风险,除非是剁手指、整容&毁容、扣眼珠,开个玩笑。而密码,如果用了一个弱口令被猜出来了,你还可以换一个更复杂的。拿指纹举例来说,一个人的指纹只有十枚,泄露了就再也无法挽回。更重要的一点,我们经常使用的手指,只有一或两枚,我们做了一个20个人的小样本统计,统计结果如下:
(由于手机指纹识别有正面和背面两种,分别对应拇指和食指,这里我们统一为拇指)
录入情况 |
人数 |
仅录入右手拇指 |
8 |
仅录入左手+右手拇指 |
17 |
录入包含右手拇指在内的3枚手指或以上 |
3 |
录入包含右手拇指的 |
20 |
统计结果显示:
没有人用单一偏门手指进行解锁的(例如无名指)
所有人都录入了一枚右手拇指
通过数据来看,似乎只需要得到一枚被攻击者的右拇指指纹,便可以进行假指纹制作完成解锁手机,而不是之前的十个手指。也就是说,泄露机会从10次变成了一次,只要泄露一根拇指,指纹这个生物特征识别就和你拜拜了。而这个泄露,通常来说非常简单,招一招手,或者拿一下杯子、手机,指纹已经泄露了。
综合前文分析,我们可以得出:
由于大部分指纹模块都缺少对活体的识别,这给假指纹攻击带来了极大的便利,无需进行各种防御手段绕过,降低了攻击成本,同时提高了成功率
由于指纹识别的原理(指纹采集、验证),我们找到了一套低成本的假指纹制作方案5-5攻击,表明假指纹攻击的威胁远比大家普遍认识的更加严重
由于大部分用户只使用少数的固定手指进行验证,增大了指纹信息泄露的风险,即只需要少数手指的泄露,便可造成被攻击者指纹验证系统被破解。
通过上面的介绍,我们可以看出,看似便捷又安全的指纹识别验证,其实很容易被仿制攻破。既然存在了安全风险,就需要解决方案。通常对于软件层面的一些安全问题,都可以通过系统升级解决,对出问题的代码进行打补丁,一定时间的收敛后,威胁会大大降低。而我们今天所展示的是硬件指纹识别模块层面的安全问题,很多是由于硬件层面对安全考虑的不充分导致的,例如模块本身并没有设计足够抵抗假指纹的活体检测功能,也没有相应的传感器(例如真皮检测传感器)。这种硬件功能设计上的缺失,很难通过软件更新去解决。
在此,我们呼吁指纹方案厂商、手机厂商增强指纹防攻击方面的能力,让每一个人可以安全、便捷的使用指纹识别。包括:指纹模块制造商需要增强指纹模块的活体检测能力,例如对手指真皮进行检测、对脉搏进行检测,同时手机厂商应该优先采购这些安全性高的模块;高安全需求的场合,采用多因素复合认证,同时建议多采用基于用户行为习惯的识别、基于行为风控的判断。