一、人脸识别简介与应用场景二、人脸识别框架分析三、人脸识别的攻击面四、攻击流程分析五、总结
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。
早在20世纪50年代,认知科学家就已着手对人脸识别展开研究。
20世纪60年代,人脸识别工程化应用研究正式开启。当时的方法主要利用了人脸的几何结构,通过分析人脸器官特征点及其之间的拓扑关系进行辨识。这种方法简单直观,但是一旦人脸姿态、表情发生变化,则精度严重下降。
1991年,著名的“特征脸”方法第一次将主成分分析和统计特征技术引入人脸识别,在实用效果上取得了长足的进步。这一思路也在后续研究中得到进一步发扬光大。
21世纪的前十年,随着机器学习理论的发展,学者们相继探索出了基于遗传算法、支持向量机(Support Vector Machine, SVM)、boosting、流形学习以及核方法等进行人脸识别。
2013年,MSRA的研究者首度尝试了10万规模的大训练数据,并基于高维LBP特征和Joint Bayesian方法在LFW上获得了95.17%的精度。这一结果表明:大训练数据集对于有效提升非受限环境下的人脸识别很重要。然而,以上所有这些经典方法,都难以处理大规模数据集的训练场景。
2014年前后,随着大数据和深度学习的发展,神经网络重受瞩目,并在图像分类、手写体识别、语音识别等应用中获得了远超经典方法的结果。香港中文大学的Sun Yi等人提出将卷积神经网络应用到人脸识别上,采用20万训练数据,在LFW上第一次得到超过人类水平的识别精度,这是人脸识别发展历史上的一座里程碑。
自此之后,研究者们不断改进网络结构,同时扩大训练样本规模,将LFW上的识别精度推到99.5%以上。不断在训练数据扩充、新模型设计及度量学习等方面投入更多的精力,如今大规模人脸识别己走入实用。
人脸验证产品我们应该都很熟悉了,不少人都在用人脸进行解锁手机或者刷脸支付、人脸注册登录等,不过这只是其中的一小部分,还有应用于金融、泛安防、零售等行业场景,满足身份核验、人脸考勤、闸机通行等业务需求,概括来说,人脸识别实现了一件事,确定实际人脸与目标人脸的相似度,粗略可分为:人脸1:1比对、人脸1:N检测,按照类型分类大致如图1-1所示:
图1-1
该产品主要功能包含人脸检测与属性分析、人脸对比、人脸搜索、活体检测等能力。灵活应用于金融、泛安防、零售等行业场景,满足身份核验、人脸考勤、闸机通行等业务需求。如图1-2所示:
图1-2
一般来说人脸识别分为三步,采集数据、人脸检测、结果验证,流程大致如图2-1所示:
图2-1
人脸识别是身份认证的第一步,因为首先我要确认这个人是真人,而不是视频、照片、面具等欺诈盗用行为,所以身份认证/安防的核心技术在于活体检测、人脸比对、人脸搜索;主要用于:线上远程认证场景(金融开户、刷脸注册、刷脸登录等)、线下无人值守场景(智慧交通、人脸门禁、刷脸取款、刷脸支付等)。
人脸识别主要分为人脸检测(face detecTIon)、特征提取(feature extracTIon)和人脸识别(face recogniTIon)三个过程。这期间随着硬件的升级发展,分为不同有类型,如图3-1所示:
图3-1
3D人脸模型比2D人脸模型有更强的描述能力,能更好的表达出真实人脸,所以基于3D数据的人脸识别不管识别准确率还是活体检测准确率都有很大的提高。
业务场景不同,攻击方式也不同,难易度也不同,本次攻击的目标是用于金融APP登录注册时用到的人脸识别。
目前大部分人脸识别产品防止照片攻击基本都有活体检测(点头、张嘴等动作)机制,但是这种用户体验不好,在些基础上又出现一种静默活体检测的方式,这种方式相对来说用户体验更佳。
目前常见的攻击方式如图3-2、3-3、3-4所示:
图3-2
图3-3
图3-4
第一次尝试是在手机中打开一张静态照片来模拟攻击,AI能识别出图片中的人脸,但是被检测出不是真人,“人脸验证失败”,结果如图4-1所示:
图4-1
第二次尝,通过第一次的尝试后我想应该是AI有检测人脸是否有动态的特征我再次将一个视频放在手机中播放来欺骗AI,但是最终还是没有成功。
经过两次尝试后,还是不能过掉AI活体检测,我最终决定分析APP识别人脸的整个过程和逻辑,是否能反向推导出识别模型,然后再构造出一张对抗性图像或视频数据来达到攻击模型的目的。攻击场景如图4-2所示
图4-2
对于离线模型其实还有一种方式是直接修改程序逻辑达到攻击的目的。
打开摄像头,画出人脸识别框
if(v4_5 != null) {
模型加载
public final int loadModel(AssetManager arg18) {
模型初始化
// 从模型加载可以看到最终会调用nativeLoadModel来初始化模型
以上是初始化过程,主要逻辑是读取模型解析出网络的layer层数及blob数,遍历所有的layer,解析每个layer层的类型(layer_type)、名称(layer_name)、输入数(bottom_count)和输出数(top_count),设置layer参数:layer的类型、名字、输入和输出。
获取人脸数据
@Override // f.l.j.a.a
数据处理
手机摄像头获取的数据是yuv420sp格式,AI模型要求图像输入格式BGR,所以需要做格式转换。
创建一个模型对象,设置输入;提取中间节点的运算结果
.text:0000BBB8 F0 B5 PUSH {R4-R7,LR}
通过调试分析找到两个关键点,Patch这两个点就能过掉检测:
人脸检测:
.text:CC0CC6C8 BF EE 00 CA VMOV.F32 S24, #-1.0
Patch检测是否为人脸,将其Patch永远为真
.text:0000C72C 9B ED 1E 0A VLDR S0, [R11,#0x78]
活体检测:
.text:CC20D9CA DA F8 30 00 LDR.W R0, [R10,#0x30]
Patch检测是否为活体,将其Patch永远为真的值
.text:0000DA40 09 99 LDR R1, [SP,#0x178+var_154]
patch完后我们再用手机中的同一张静态照来试试是否能验证成功?效果如图4-3所示:
图4-3
攻击成功,完美通过。
上面通过Patch的方式来过掉检测看起来是很好,但是、但是、但是,当相同的AI模型放在服务器端时,Patch这种方式就失效了,通过前面对模型进行逆向分析,获取模型内部的一些特征数据,所以需要根据分析出来的模型特征构造出一张对抗性图像或视频数据送给服务器端达到攻击模型的目的。
上面分析活体检测时得到的活体特征,再根据YUV420数据格式将其构造到数据体中,得到一张人眼无法观看只有机器能识别的图像数据,如图4-4、4-5所示:
图4-4
图4-5
通过hook摄像头读取方法可以直接将构造好的数据传送给服务器端模型,效果如图4-6所示:
图4-6
这种方式是不改变目标AI学习系统的情况下,通过构造特定输入样本以完成欺骗目标系统的攻击。我用一张A4纸打印了一张非真人脸图做测试,在没有真人脸的情况下成功通过验证。这其中的根本原因,在于模型没有学到完美的判别规则。虽然图片识别系统一直试图在计算机上模仿人类肉眼视觉功能,但由于人类肉眼视觉机理过于复杂,两个系统在判别物体时依赖的判断规则存在一定差异。因此人类肉眼的判别规则和模型实际学到的判别规则之间的差距,就给了攻击者逃脱模型检测提供可趁之机。
本文主要是最近自己学习人脸识别的一点总结,与小伙伴们分享,有不对的地方请指正。
主要分为攻击模型计算逻辑与攻击模型本身两种方式,不同的业务场景攻击方案与难易成度不同。
模型计算逻辑攻击:
这种攻击方式只适用于离线模型,分析模型计算逻辑进行关键点Patch达到强制绕过验证的目的。
攻击模型:
攻击模型和其他攻击不同,攻击模型主要发生在构造对抗性数据的时候,之后该对抗性数据就如正常数据一样输入机器学习模型并得到欺骗的识别结果。在构造对抗性数据的过程中,攻击者并不知道AI所使用的算法和参数,但攻击者仍能与AI系统有所交互,比如可以通过传入任意输入观察输出,判断输出。或者攻击者可以通过逆向分析推导掌握AI模型参数信息。