深度剖析:手机指纹的马奇诺防线
如今越来越多的智能设备都采用了各种各样的生物特征识别技术,例如指纹、虹膜、人脸等。在大家心中,这些生物识别都是安全性极高,不会有风险的。但是我们深入研究后发现,其实这些生物特征识别技术都存在传感器容易被欺骗的安全问题。同时在今年的10月24日举行的Geekpwn破解大赛上,我们也向大家展示了常见生物特征识别的破解show。由于现场电源干扰的原因导致指纹采集噪点过多,指纹破解show存在些小的问题没有成功展示。应安全界朋友邀请,特以本文对手机指纹的安全问题做深入剖析。
为了更清晰的给大家展示指纹识别使用过程中的安全风险,同时也是希望各个手机厂商增强对指纹识别传感器的安全性重视,百度安全实验室对常见手机型号进行了大量测试,编写并发布了这个智能设备指纹安全调研报告,包含指纹识别的原理、攻击方法、测试统计等。测试结果非常令人忧虑,所有测试品牌和指纹芯片都没有承受我们的5-5攻击(制作过程不超过5分钟,耗材不超过5角钱)。我们呼吁手机厂商以及指纹芯片厂商重视这个威胁,保持对持续对抗的技术投入,并且在重要场合使用复合认证技术,不要采用单一指纹认证做大额转账等高敏感操作授权。
同时我们也需要指出,实现手机上的假指纹攻击需要攻击者拿到对方手机这个前提,而对于大部分国内用户而言,这个风险并不大。指纹解锁和指纹支付目前已经十分流行,在网络环境下也比Pin Code/Password等传统手段更安全。我们不希望普通用户因为这个安全问题产生对指纹识别验证的恐慌。同时我们也提醒带有指纹识别功能的手机用户:请妥善保管自己的手机,防止他人轻易拿到。只要坏人拿不到手机,指纹复制攻击也是无法实施的;而手机一旦落到坏人手中,指纹复制攻击将可能是他们最好的突破口。
1、指纹图像提取原理
现阶段,任何一种生物特征识别,都是通过传感器把生物特征投影成像为数字信号,指纹也不例外。具体来说分为指纹图像提取、预处理、特征提取、比对等步骤。
图1 指纹图像提取原理
根据指纹图像提取技术的不同,现阶段主要分为光学指纹识别模块、半导体(电容)指纹识别模块两大类。我们希望通过对这些指纹图像提取模块工作原理的介绍,让大家对硬件传感器层面有更直观更深入的了解,同时便于对后续攻击方法的整体理解。
1.1光学指纹识别
因为这个技术应用的最早,现在依然有很多门禁、打卡机等等在使用这种技术。技术原理是利用光的折射和反射。优点是造价低、可靠性高。不过由于光学本身的特点,所以想要集成到小模块当中,应用到手机上是个难点。另外光学指纹识别之前有一个麻烦的地方,就是如果手上有油污或者汗水,识别效果就会大幅度降低。
当光源在全反射角以上,就是光源侧着照进去时,光线会侧着反射出去,在反射光的角度用镜头拍摄,就能拍到很亮的背景。如果指纹在棱镜表面光源照亮的区域接触,那么指纹凸出的部分(脊线)和棱镜接触,凹下的部分(谷线)不会接触,接触部分因为全反射效应会有一个受抑制的情形(光线从脊线接触的地方透射出去了),反射光的对应区域会变弱,这时候CMOS 传感器会收到一个脊线暗、谷线亮的图像,原理图如图2所示:
图2 光学指纹模块工作原理(全反射角以上)
而当光源在全反射角以下时,光线从正下方射入,这时候光线不会从棱镜上透射出去,但是手指与棱镜接触的区域,光线会发生所有角度的散射,这时候就会出现凸出的脊线部分为亮(看起来就像是接触到玻璃的脊线把光都导走了并且亮了),谷线为暗(没有接触的部分CMOS看到的是黑色底板反射的黑像),这样就可以形成指纹图像,例如我手中的光学指纹模块就是这种,工作时成像如图3所示。当没有手指放入的时候,由于CMOS只看到了反射的黑底板,会呈现全黑的图像,光路图如图4所示。
图 3 CMOS传感器看到的指纹成像
图 4 光学指纹模块光路图部分(全反射角以下)
图5 FPC 1042光学指纹模块整体结构图
图6左边是这款FPC 1042光学指纹识别模块采集到的图像,其他光学型号类似,特点是图像分辨率较低、间断点较多、受手湿等影响较大。例如图6右边是在手上有水的情况下的指纹成像。
图6 光学指纹模块采集到的图像以及手上有水时的成像
1.2电容指纹识别
电容式指纹识别要比光学式的复杂许多,其原理是将压力感测、电容感测等感测器整合于一块芯片中,当指纹按压芯片表面时,会感应放出瞬间电压导向手指(我们会发现各种电容传感器周围都会有一圈金属圈,为的就是把电荷导向手指),这时硅传感器成为电容的一个极板,手指则是另一极板,每一个像素的电容感测器会根据指纹波峰与波谷距传感器距离的不同而产生相应的电荷差,最终所有像素的感测器形成8bit 的灰度图像,原理图如图7所示。
图 7 电容指纹识别模块原理
图 8 FPC 1020电容指纹传感模块(传感器+主控)
这里以国内常见的FPC1020电容指纹传感器为例,给大家介绍下结构。
我们可以发现,采集部分结构比较简单,由一个比5角硬币还小的传感器便完成了采集任务,相比于光学传感器体积小、集成度高。所以这种传感器广泛应用于手机、便携设备等地方。(例如早期指纹手机 H厂商的M系列就是直接采用的这片FPC1020传感器,国内很多高级门锁、保险箱也是采用的这款)
图9是这款电容指纹识别模块采集到的图像:
图9 电容指纹传感器采集到的指纹图像
从图像中我们可以明显感觉到采集精度、抗干扰等相比光学指纹传感器都有了明显提高,同时采集速度也快了很多。
这些指纹模块一般都支持二次开发(传感器+主控芯片),具有指纹图像采集、指纹比对的功能,既可以使用内置算法对获取图像进行特征匹配给出结果,又可以支持图片下载到用户端进行其他算法的匹配、公民指纹图像采集等。我们主要是用了其中的图片下载功能对指纹进行复制、研究。而手机中、我们平常见到的指纹锁等,不会存储用户的指纹图像,仅会存储几组指纹的特征数。
2、指纹识别匹配算法
最基础的指纹图像已经获取到,有的同学可能会认为指纹的匹配就是用传感器现在获取到的指纹图像与最初存储的图像做比对。实际上考虑传输&存储成本、效率等问题,指纹的识别匹配算法是通过对传感器获取到的指纹图像进行迅速提取特征,对特征进行比对实现的。
整体的特征提取需要如下步骤:图像预处理、指纹图像增强、二值化、细化、提取特征点等。其中指纹图像增强方面最为重要,众多学者做了大量研究工作。
图10 指纹识别匹配算法流程
由于网上关于指纹识别算法信息很少,没有较为完整的实现,部分实现方法也千奇百怪(甚至有通过图片相似度实现,效果大打折扣)。我们通过分析实际使用的指纹系统并查阅大量论文,给大家整理下一般的指纹识别算法流程,并通过代码实现,希望通过这些具体的步骤,让大家更直观的理解指纹识别软件层面的处理、识别方法。
2.1预处理
我们以上面通过电容传感器得到的指纹为例,这张图片的主要问题有:
图11 电容传感器采集到的指纹图像以及存在的问题
首先进行图像预处理,主要是规格化和图像分割。规格化是把不同原图像的平均灰度和对比度调整到一个固定的级别,为后续处理提供一个较为统一的图像规格,以减少不同指纹图像之间的差异。图像分割是把指纹前景区与背景区分开。指纹图像的前景区是由脊线和谷线交替组成的,其灰度统计特性中局部灰度方差比较大,而指纹图像的背景区,这一值是很小的。基于这一特性,可以利用图像的局部方差对指纹图像进行分割,去除无用图像部分。
图12是通过局部方差获取到的图像分割边界,后续处理都是在这个边界里进行:
图 12 边界计算后的图像蒙版
图 13 指纹的方向场
2.2图像增强
这里首先介绍下指纹的图像增强处理。我们通过图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 滤波后变得十分平滑均匀,这为后续的特征点确定打下基础。
2.3 二值化及细化
指纹图像二值化的目的是把灰度指纹图像变成 0、1 的二值图像 , 使指纹的纹线信息更加清晰简洁。二值化方法较为简单,主要是根据一个阈值进行像素去留判断,这里就省略。由于指纹图像二值化以后 , 纹线仍具有一定的宽度 , 为了进一步压缩数据 ,简化、统一特征提取的计算, 需对指纹图像进行细化处理。这里使用基于领域的判断算法,决定某个象素该移去还是保留。如图17既是细化后的指纹图像。
2.4 特征点提取
最后就是对细化后的指纹图像取特征点了。提取原则是根据细化后的图像,提取分叉、交汇、末端、单独点作为特征点,同时在一定距离范围内减少过多特征点、删去边界特征点。我们来看下最终提取结果:
图18 指纹图像的特征点提取结果
可见红框中既为指纹的特征点,其中标注出的关键点均是指纹纹路的末端、交汇等。最终把特征点存储在只有指纹模块才能访问的存储器中。当下一次指纹进行比对时,用同样方式提取特征点,并把特征点数组进行逐个对比。结合手指的一些蠕变变形误差、传感器误差等,当匹配误差小于一定阈值(例如使用排序算法,逐个匹配特征点,存在一个点与邻点的关系和原始特征相比,距离误差小于5%,位置角度误差小于10度),可认为是同一个手指,比对通过。
我们来总结下传统的指纹比对识别过程。指纹纹路对于每个人来说都是唯一不变的,利用这个特征我们可以用来进行身份验证。但是由于指纹图像受传感器污染、按压力度大小、脱皮、干燥等影响,初始图像并没有很直观、统一的特征,同时存在很多噪点、干扰,需要对其进行进一步归一化、滤波处理。处理后便可进行指纹特征的提取,以便特征存储或比对。
但是由于小型化、易用性的需求,现在的指纹识别传感器在手机上已经做的非常小了,需要在更小的空间上对指纹特征进行识别提取,相应的传感器单位面积分辨率也会大大提高,软件识别算法也有些变化。篇幅原因,这里不做展开。
3、假指纹的攻击实现
通过上面对原理的介绍,我们可以了解到,手机等设备通过指纹特征进行特征提取、身份验证。这里面就会存在一个真假指纹的问题,而我们的攻击目标便是:如何制作出一个假指纹并像真指纹一样通过验证。
通过大量分析研究,我们提出了如下两个攻击思路:
- 通过指纹采集的方式获取原始指纹图像,进而制造一个假体指纹,可以通过认证
- 通过文件读取等获取到指纹特征文件,根据指纹特征制造一个假体指纹,可以通过认证
由于指纹特征一般情况下都采用了安全存储,平常较难获取到,我们这篇文章主要研究下思路1,具体概括如下:
我们首先通过指纹膜的制作,证明假指纹制作的可行性以及活体检测的普遍缺失。然后寻找出获取到一个人的指纹纹路图像的有效方法。最后通过指纹膜中一些原理的启发,结合刚刚得到的指纹纹路图像,制作出可以骗过传感器的假指纹。
我们希望通过这些探究和实际测试,可以给大家直观的展示指纹识别所存在的安全风险,展示一些简单又有效的指纹采集方式,让模块生产商、厂商、用户对这些攻击方法予以重视,并加以防范改进。
3.1 重现007中的指纹膜
通过一些影视剧作品,我们可以发现假体指纹的制造在很多年以前就已经存在了(1971年的007电影首次出现指纹膜),现在主要在考勤机代打卡、驾校代签到等场景中有使用。通过万能的X宝(由老司机指点,较为隐蔽),我们购买到了指纹膜制作套件。套件根据卖家询问:按手指时机器是否发光,会推荐光学或者电容型。我们两种都购买了,来研究其制作过程。
制作说明(参见图19):
- 滴几滴蜡烛到纸上,没干透的时候把指纹印按上;
- 另取1毫升胶,3滴左右固化剂,搅拌均匀,将搅拌好的胶转移到刚才印的指纹印中间,该上个塑料袋,从中间往两边抹平;
- 等一个小时候,揭下指纹印,大功告成。
图19 电容版指纹膜制作套件及说明
图20 手指和指纹膜都具有导电性
跟着步骤做了个模型,兴冲冲的测试了多个手机(包括几款最新型号)、模块(包括光学模块),发现均可以顺利解锁。同时经过仪器测试,材料中包含导电硅粉,具有导电性(参见图20),结合之前的成像原理,我们可以总结出如下结论:
- 不论是光学或者电容传感器,根据前面提到的成像原理,成像都需要制造出指纹的凹凸
- 各个系统所谓的活体识别(稍后介绍各产品在这方面的描述)貌似并没有奏效的,所测试十余款设备均可解锁
- 如果可以做出具有凹凸、任意成型纹路的假指纹,便可直接骗过光学传感器
- 如果在这个基础上再实现导电特%e