注:仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。
声明:该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。 |
现在只对常读和星标的公众号才展示大图推送,建议大家把猫鼠信安“设为星标”,否则可能看不到了!
0x01 前言
前几天在团队群里看见现在可以通过AI使用一张照片制造视频来进行绕过人脸识别功能,于是开始进行思考与研究,这将是新一代的社会工程学攻击。
0x02 人脸识别
人脸识别(Face Recognition) 是一种基于人脸特征的生物识别技术,通过摄像头或图像获取人脸图像,提取其关键特征信息(如眼睛间距、鼻梁形状、脸型轮廓等),并与已知人脸数据库进行比对,实现“识别谁”或“确认是不是某人”。
人脸识别的核心流程
-
人脸检测:从图像或视频中定位出人脸区域。常用算法:Haar Cascade、MTCNN、RetinaFace、YOLO-face。 -
人脸对齐(人脸校正):对检测出的人脸进行旋转、缩放、剪裁,使人脸处于统一姿态。
-
特征提取:提取高维的人脸特征向量(比如128维或512维向量)。常用模型有 FaceNet、ArcFace、Dlib。
-
特征比对 / 分类识别:将提取的人脸特征与数据库中的已知人脸特征进行匹配,使用欧氏距离、余弦相似度等方法。
常用的人脸识别模型与算法
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0x03 人脸识别绕过
通过一张图片绕过人脸识别系统,是一种典型的 人脸识别攻击技术,被统称为 Presentation Attack(展示攻击) ,其中“照片攻击”是最基础的一类。
|
|
|
|
---|---|---|---|
静态照片攻击 |
|
|
|
屏幕回放攻击 |
|
|
|
3D头模攻击 |
|
|
|
眼镜纸片攻击 |
|
|
|
对抗样本攻击 |
|
|
|
这里我模拟一个人脸识别系统,基于静态照片识别,在 known_face 当中存在的朋友的自拍照片,而在 spoof_images 存放通过朋友自拍照的截图。使用 Python + OpenCV + face_recognition(基于 Dlib)编写的这个演示系统。
那么其实在现代当中人脸识别已经有了五大主流活体检测机制,分别是哪些?
|
|
---|---|
眨眼检测 |
|
头部动作检测 |
|
红外检测 |
|
3D结构光 |
|
深度学习活体检测 |
|
本篇文章主要也是讲解现代五大主流活体检测机制如何绕过。
1.眨眼/张嘴检测
最基础的一种方式,目的是防止使用一张照片或屏幕截图蒙混过关。
-
1.眨眼检测(Blink Detection)
-
当 EAR 降低到一定阈值 → 说明眼睛闭合 → 判定为眨眼。 -
检测眼睛在“睁开 → 闭合 → 睁开”的过程中,眼部特征的变化。 -
核心指标:EAR(Eye Aspect Ratio)眼部纵横比 -
2.张嘴检测(Mouth Open Detection)
-
检测嘴部高度变化(如上下唇之间距离)。 -
常用指标:MAR(Mouth Aspect Ratio)嘴部纵横比。
正常人会想到的是视频重放攻击,这个需要提前录制受害者的眨眼或者张嘴的视频,但是在技术迭代如此快的现在已经不需要如此通过欺骗的方式让受害者录制这些视频了。只需要一张照片即可成功生成受害者眨眼以及张嘴的视频了。
使用 First Order Motion Model(FOMM)项目:https://github.com/AliaksandrSiarohin/first-order-model/
将静态的照片以及自己录制的眨眼视频进行合成,FOMM 模型默认使用 256x256 分辨率,想要更真实可 fine-tune 到 512x512。
python demo.py --config config/vox-256.yaml --driving_video blink.mp4 --source_image victim.jpg --checkpoint checkpoints/vox-cpk.pth.tar --result_video result.mp4
最终的 result.mp4 则是victim.jpg的眨眼视频。
当然了我们也可以使用 Deepfake+眨眼控制 的攻击方式,进行高难度的攻击。
-
DeepFake 模型训练:使用 DeepFaceLab 或 FaceSwap 之类的开源项目,通过大量目标人脸视频和图片数据训练出目标人脸转换模型,从而将一个人的面部特征迁移到另一个人的视频上。 -
眨眼/张嘴动作生成:在训练过程中,利用原始视频中包含的自然眨眼和张嘴信息,模型可以学习到面部肌肉运动的规律;也可以借助附加的动作驱动器,利用其他视频(驱动视频)来控制输出视频中假人脸的眨眼或张嘴动作。
通过这样的组合,输出视频不仅能达到面部替换,还能自然地执行眨眼、张嘴等动作,进而迷惑使用静态检测技术的活体检测系统。
我们这里可以使用DeepFaceLab项目(https://github.com/iperov/DeepFaceLab)
针对受害者进行素材的收集以及数据的提取与对齐。启动训练脚本,模型会不断学习目标人脸的细节以及运动规律。若训练数据中包含足够眨眼和张嘴的样本,模型会自动捕捉到这些动作特征。
python DeepFaceLab/main.py train --training-data-src_dir data_src --training-data-dst_dir data_dst --model-dir model
当训练效果达到预期(模型收敛,输出换脸视频足够自然)后,使用转换脚本将目标视频中人脸替换为经过训练模型生成的假人脸。
python DeepFaceLab/main.py convert --input-video driving_video.mp4 --output-video result_deepfake.mp4 --model-dir model
此时输出视频 result_deepfake.mp4 就是目标人脸带有假转换后,并保留驱动视频中的眨眼、张嘴动作。可以通过视频编辑软件对生成视频做颜色校正、帧率调整等后处理,进一步提升自然性和细节效果。
2.头部动作检测
用于活体检测、防止照片/视频等静态攻击,确保操作为真实执行。
通过连续帧中关键点位置变化计算欧拉角(pitch/yaw/roll)来判断是否完成动作以及人脸关键点跟踪(如 Dlib、MediaPipe)、头部姿态估计(Head Pose Estimation)
这里我们需要用到 3D建模+骨骼动画 的攻击方法,使用 3D 建模软件(如 Blender、FaceGen、Maya)构建目标人物完整头部模型,再添加骨骼绑定(Rig)实现任意动作模拟,最终渲染或实时播放视频以绕过检测。
-
技术步骤: -
构建3D模型:使用 FaceGen 或 Blender 的 Photogrammetry 技术,将照片建成 3D 模型; -
绑定骨骼(Rig):添加头部、眼球、下巴等骨骼; -
制作动作动画:添加关键帧,如头部从正面到左转 30°; -
渲染视频或导入 Unity/Unreal 实时驱动; -
通过虚拟摄像头或投影进行攻击。
Blender 中的 3D Rig 控制面板,可实现精确控制如下动作:
|
|
---|---|
|
|
|
|
|
|
3.红外检测
识别“是否为真实人脸”,通过检测红外波段下的温度分布和材质特征,判断面前是否是活人。
可以使用IR LED 面具攻击技术进行绕过,这个攻击技术属于最实用的动态红外绕过方式。利用 不可见红外 LED 光源(850nm 或 940nm) 照射人脸特定区域,模拟“热发射效果”。
布置 IR LED,在这些区域均匀照射人脸或照片,模拟出“自然发热”的红外图像效果。
核心材料和组件
|
|
---|---|
红外LED |
|
电源 |
|
控制器 |
|
电阻 |
|
PWM 控制模块 |
|
眼镜/帽子外壳 |
|
散热片(可选) |
|
面部仿真热斑区域建议:鼻梁中线(2~3颗)、两眼下方(各2颗)、额头中部(2颗)、颧骨(各1颗)、下巴正中(1颗)
可加入 MOSFET(如IRF520) 做为控制开关,由 MCU 控制其 PWM,所有 LED 最好并联控制、个别限流。
上述代码模拟出“呼吸热动效”,让 IR 图像呈现出动态热流变化,可绕过部分“温度静态检测”。
4.3D结构光
判断被识别对象是否为真实三维人脸结构,防止照片、视频、平面屏幕等“2D”攻击。
这个活体检测进行绕过的话属于高难度操作,需要高仿硅胶面具(可穿戴 3D 突变仿生攻击)。使用硅胶面具模拟目标人脸的 3D 几何形状与肤质纹理,通过佩戴面具绕过结构光检测。
对于这个硅胶面具的要求:
-
几何形状精准 -
皮肤表面质感强,含毛孔、汗腺模拟 -
可选择内嵌五官“可动”版本(眼皮、嘴唇)
为了增加红外表现力,可以在面具内嵌红外反射层,或通过上色调整 IR 漫反射以及可在额头、鼻梁、颧骨加涂 IR 粉末/硅胶混合色剂,若系统无材质分析,易被识别为“真实人脸”。
5.深度学习活体检测
目前属于最前沿的活体检测方法,基于基于 CNN 或 Transformer 识别“照片攻击”、“视频播放攻击”等非活体人脸行为。
但是我们可以通过对抗样本攻击来进行对深度学习活体检测的绕过,通过在图像中注入微小扰动,欺骗模型输出错误结果,使其将攻击图像识别为“真人”。
在深度学习中,图像分类/识别模型本质是一个从像素空间 → 特征空间 → 分类标签的映射函数:
在不引人注意的前提下修改输入图像𝑥为x∗=x+δ,使模型𝑓输出错误类别或通过活体检测将攻击图像识别为指定人,让模型认为照片/屏幕是“真人”或“活人”。
这里我们可以使用PGD(Projected Gradient Descent),一种用于生成对抗样本的攻击方法,是对基本方法 FGSM(Fast Gradient Sign Method)的多步迭代扩展版本。
示例代码:
for i in range(num_steps): image.requires_grad = True output = model(image) loss = loss_fn(output, label) model.zero_grad() loss.backward() data_grad = image.grad.data adv_image = image + alpha * data_grad.sign()# 投影回合法定义的扰动范围 eta = torch.clamp(adv_image - original_image, min=-epsilon, max=epsilon) image = torch.clamp(original_image + eta, 0, 1).detach()
-
𝜖:最大扰动 -
𝛼:每步扰动强度;
该方法可以逐步“穿透”模型防御层,适合攻击鲁棒模型。
关键参数与调优技巧
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这里其实还有另外一种对抗方式,那就是 Adversarial Patch(对抗贴纸)。将一个具有欺骗力的局部图案贴到图像中任意位置,不依赖图像整体扰动,适合打印出来贴在脸上,通常使用 Expectation Over Transformation (EOT) 训练可迁移补丁。
点击下方名片进入公众号
点击下方名片进入公众号
原文始发于微信公众号(猫鼠信安):新一代社会工程学|人脸识别绕过攻击
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论