资讯动态

人脸考勤系统安全自查:一张打印照片背后的配置盲区与加固方案

发布时间:2026/10/17 2:18:00 来源:尧图企业网站定制
周六下午HR负责人突然发来一条消息你们那套人脸考勤系统是不是坏了我打开后台一看考勤报表里赫然躺着一条记录——某位同事当天早上9点01分打卡成功而这位同事上周已经请了年假根本没来公司。更离谱的是终端抓拍照片里显示的并不是他本人而是一张放在工位上的打印照片。我们几个人对了一下眼神同时冒出同一个念头人脸识别系统真的这么好骗那段时间网上到处都在讨论“人脸识别克星”“让考勤系统永远判我在场”这类说法我原本以为是段子没想到在自己公司就遇上了。折腾了半个多月之后我总算把整套逻辑搞明白了所谓克星往往不是多高明的技术而是系统里几个默认配置盲区叠加出来的结果。这篇就把这次安全自查的完整过程、测试数据和加固方案分享出来给同样在用这类设备的团队做个参考。先说清楚一个边界这篇文章不是教你怎么绕过考勤打卡而是站在企业信息安全和设备管理员的视角把漏洞完整还原一遍然后告诉你怎么堵。过程中涉及的所有测试都经过了行政和IT部门审批使用的是独立测试底库和备用终端没有在真实员工数据库上操作也没有影响任何正常考勤记录。1. 一张“A4纸员工”引发的考勤事故1.1 事故还原周末在场记录是怎么来的事情没那么复杂。这位请年假的同事工位靠窗桌面上放了一张A4纸大小的证件照打印件应该是之前办活动剩下的物料。不知道是哪位同事路过时拿起来对着考勤机晃了一下系统就直接判定打卡成功。后台日志显示抓拍照片里确实只有那张纸但设备给出的相似度分数高达0.87超过系统默认阈值0.5于是匹配到了底库里的真实人脸生成了一条合法的考勤记录。我拿到这条日志的时候第一反应是难以置信。0.87的相似度意味着什么几乎等于系统认为照片和真人“高度一致”。一个平面纸片没有皮肤纹理没有立体轮廓没有眨眼动作居然能骗过一套标着“人脸识别”四个字的设备。这说明问题根本不是偶然失误而是系统在默认状态下存在明显的识别盲区。查了一圈之后发现当天不止一个人尝试过这种操作。有几个同事在茶水间聊天时听说这事好奇心上来轮流拿照片去试居然大部分都成功了。HR那边哭笑不得行政那边则有点后怕如果这种操作可以被轻松复现那以后谁想帮别人代打卡或者恶意伪造出勤记录岂不是零成本事情从这里开始从一次恶作剧升级成了一个需要认真对待的安全事件。1.2 我们的人脸考勤方案到底是什么架构很多人一听到“人脸识别考勤”会觉得里面肯定是深度学习模型、活体检测、双目摄像头这些高大上的东西。但拆开我们公司这套用了两年的设备看实际架构比想象中朴素得多。我们用的是一种很常见的本地1:N识别方案。整个流程大概是这样的考勤终端上的普通2D摄像头抓拍人脸区域提取特征向量这个特征向量会和设备本地存储的底库特征做比对算出一个相似度分数分数最高的那个ID如果超过管理员设定的阈值就判定为匹配成功打卡通过。这里有两个先天弱点。第一普通2D摄像头采集的图像本身没有深度信息它看到的只是平面的红绿蓝像素。第二活体检测模块在这类设备上往往是“选配”而不是“标配”出厂时默认关闭而且藏在很深的设置页面里很多管理员根本不知道有这个开关。也就是说设备识别的是“看起来像人”的东西而不是“真的是人”的东西。对比一下就能理解如果系统只看二维纹理一张清晰的照片和一张真实人脸在特征提取层面差距确实不大。照片唯一缺的是立体信息和动态信息而这些信息恰恰需要活体检测模块来补齐。默认不开活体检测等于把门锁上了但钥匙就插在锁孔里谁路过都能拧一下。1.3 测试定调这不是比谁更会骗而是安全自查事件发生后的第二天IT、行政和HR开了一个小会讨论怎么处理。有人提出直接换最新款带3D结构光的设备一了百了也有人觉得成本太高想先看看能不能通过配置修复。我把两种方案都摆到桌上提出了一个折中的建议先做一次受控的安全测试搞清楚几个核心问题——到底哪几类常见物品能骗过系统活体检测开关打开之后效果如何阈值调到多少最合适如果软件配置能解决大部分问题就没必要花大价钱换硬件。这里必须强调测试纪律。我们定了三条铁律第一使用独立的测试底库里面只放5个虚拟测试人脸不碰真实员工库第二全程使用备用考勤终端断网测试不接入生产环境第三每次测试保留日志和截图测完立即恢复现场。这三条不是为了走形式而是为了避免安全测试本身变成安全事故。测试结束之后所有数据汇总成一份文档作为后续配置调整和采购决策的依据。2. 受控测试照片、视频回放、面具三类异常样本的表现2.1 测试环境与样本准备测试用的设备是出事那台机器的同型号备用终端固件版本一致底库是新建的独立测试库。我把测试样本分成四组前三种是模拟“克星”场景的异常样本最后一种是真实用户对照组。异常样本A是A4纸打印的正面照片。异常样本B是手机屏幕播放的一段短视频内容是某个测试人脸注视着镜头时长大约5秒。异常样本C是一个低成本的硅胶面具细节其实相当粗糙五官比例也一般我们买它主要是想让测试维度更完整。正常对照组则找了30名真实员工在同样光线条件下现场打卡。每组样本的测试方法是连续尝试10次记录通过次数和系统给出的相似度分数。为了保证数据统计意义所有测试放在同样的室内光照环境下终端距离被测物大约40到60厘米模拟正常的打卡距离。整个测试过程大概花了一个下午每一组数据都有对应的抓拍截图。2.2 第一轮默认配置下三类异常样本的结果默认配置下的结果让我有点后背发凉。数据如下测试样本尝试次数通过次数最高相似度平均相似度打印照片1080.910.84手机屏幕视频回放1090.890.85硅胶面具1010.720.63真人对照组30290.960.88打印照片10次里过了8次平均相似度0.84。手机屏幕回放更夸张10次里过了9次最高0.89。硅胶面具因为细节太差只有1次侥幸通过但这一条本身就说明默认阈值定得太低——0.72这种不达标的面具都能有一次匹配成功那换成稍微精良一点的头模呢为什么打印照片和屏幕回放能通过原因回到技术上普通2D摄像头只能获取平面纹理信息系统提取特征时看的是五官位置、轮廓比例、光影分布这些二维特征照片和视频在二维层面和真人几乎没有差别。活体检测没有开启设备便完全不会判断“面前的东西是不是立体的”“有没有皮肤反光”“会不会眨眼”。对照组的数据同样值得注意30个真人里有1个失败了原因是眼镜镜片反光导致特征提取不完整。这说明默认配置只是在“防真人”上做得还行同时又在“防照片”上完全失守属于典型的偏科。2.3 第二轮开启活体检测后的结果第一轮测完我直接把设备后台的活体检测开关打开了分别启用“静默活体”和“动作活体”两种模式然后把相同的测试流程又跑了一遍。先解释一下这两种模式的区别。静默活体不需要用户配合做动作算法通过分析皮肤纹理、光影反射、微弱表情变化和立体轮廓来判断面前是不是真人体验最好但对算力和算法要求更高。动作活体则要求用户按指令完成随机动作比如眨眨眼、张开嘴、左右转头原理是验证“三维物体能按指令产生对应形变”。第二轮结果非常明显测试样本尝试次数通过次数最高相似度平均相似度打印照片100未触发匹配未触发匹配手机屏幕视频回放100未触发匹配未触发匹配硅胶面具1000.58被活体拦截0.55真人对照组30270.970.86开启活体检测后三类异常样本全军覆没。打印照片和屏幕回放甚至根本走不到相似度比对那一步在活体判定环节就被拦下。硅胶面具的情况有点特殊相似度分数能算出来但活体检测判断它是非活体直接拒绝。这个结果让我松了口气但也发现了新问题真人对照组从29/30降到了27/30。两个人被误拒一个是因为逆光环境下静默活体判定不稳定另一个是因为动作活体指令“张嘴”的幅度不够连续两次没检测到。这说明活体检测不是免费的午餐它会在挡住攻击样本的同时牺牲一部分真实用户的体验。2.4 一个关键发现阈值才是隐藏变量第三组测试给了我一个之前没预料到的关键发现。我对比了所有通过样本和失败样本的相似度分数把数据摊开看真人的相似度分布非常宽最低的只有0.58最高的0.97。打印照片的相似度主要集中在0.83到0.91之间。也就是说如果光看分数一部分真人0.58那类甚至不如一张照片0.83更接近底库。这意味着什么如果把相似度阈值从默认的0.5往上调确实能挡掉一部分照片攻击但会更早地误杀掉那些因为光线、角度、表情而不够“标准”的真人。反过来阈值定得太低虽然真人通过率高但攻击样本也能轻松溜进来。阈值和活体检测其实是两套独立防线前者负责“像不像”后者负责“是不是活的”只有两个一起调才能既挡攻击又不误伤。后面我做了第三轮交叉测试开启活体检测同时把阈值设成0.62。结果异常样本依然全部被挡真人通过率从27/30回升到了28/30。这才让我们确定了大方向组合策略比单靠任何一项都更稳。这组数据直接写进了给管理层的汇报里成为后续正式配置调整的依据。3. 为什么默认配置会这么脆弱三个配置盲区3.1 活体检测默认关闭的真正原因测试完了之后我一直在想一个问题既然活体检测这么重要厂家为什么不默认打开带着这个疑问翻了设备说明书又给厂商客服打了一圈电话最后拼凑出几个真实原因。最核心的原因是兼容性压力。很多考勤终端用的是两三年前的芯片方案算力有限。跑活体检测需要额外的图像处理流水线实时运行时会让设备发热增加、识别响应变慢在一些低端型号上甚至会出现明显卡顿。厂商为了确保设备“首次开机就有流畅体验”宁可把安全功能藏起来也不敢默认开启。第二个原因是误拒率考核。考勤设备在投标和验收时甲方往往只关心“识别准不准”也就是正常员工的通过率。活体检测在暗光、逆光、强眼镜反光、特殊妆容这些场景下会拉低通过率一旦默认开启客户的售后投诉会大幅增加。厂商权衡之后默认关闭反而是对销售最友好的做法。第三个原因比较隐蔽活体检测的开关位置设计得很深。在我们用的那台设备上它藏在“高级设置→识别参数→安全等级”三层菜单里默认值是“标准”而非“高”。很多公司的考勤管理员连后台都没怎么进过更不可能知道这个开关的存在。我们的设备装了两年期间没有人动过这个页面直到出事了才被翻出来。3.2 相似度阈值不是“越大越好”第二个配置盲区是阈值。人脸识别的相似度分数通常落在0到1之间也可以理解为0到100的映射值不同厂商实现不同。管理员设置的这个阈值决定了一个人需要“多像”底库照片才会被接受。默认0.5意味着什么大概就是“只要有三四成像就算同一个人”。这个值作为出厂默认本质上是为了照顾各种光线环境下的通过率让验收测试好看。但它同时把攻击者的门槛也压到了极低。一次相似度0.72的硅胶面具都能匹配成功就是因为这个值太宽容。但直接把阈值拉到0.8行不行也不行。我在测试中发现真实员工的相似度分布跨度很大最低能到0.58。这种人往往是因为底库照片太旧、或者打卡时角度太偏导致特征提取不完整。阈值调到0.8确实能挡住所有照片但可能每10个正常打卡里就有2到3个人被拒现场能排起长队。专业一点的调法要看等错误率曲线随阈值变化误接受率和误拒率会往相反方向移动两条曲线的交叉点就是等错误率。实际配置时不会选这个理论交叉点而要根据公司对“攻击风险”和“用户体验”的容忍度取一个偏向安全一侧的合理值。我们在测试中用0.62作为候选阈值是因为它在异常样本全拒的同时真人通过率只掉了不到2个百分点这个平衡点是实测出来的不是拍脑袋定的。3.3 单帧抓拍与连续帧校验的差别第三个盲区更隐蔽很多人测完活体检测就觉得万事大吉忽略了设备的抓拍策略。我们这台设备的默认抓拍逻辑是单帧校验摄像头拍到一帧合格的人脸图像直接提特征、做比对、给结果。整个过程在一两秒内完成。这意味着攻击者只要在一瞬间把照片对准镜头就可以触发一次完整的比对流程。照片在那个瞬间呈现出来的特征和真人站在镜头前几乎没有区别。连续帧校验做得更稳的设备会要求在一定时间窗口内连续抓拍多帧比如3秒内抓5帧其中至少4帧都匹配同一个ID才判定打卡成功。这个机制对照片攻击的杀伤力极大用手拿着一张纸难免有轻微抖动、角度偏转、边缘反光变化这些都会导致某些帧比对失败连续5帧里很难保持足够稳定的匹配分数。而且屏幕回放视频虽然画面在动但整体的二维平面属性不变活体检测已经能拦下一大半再加上连续帧校验作为第二道网攻击成功率几乎降为零。但遗憾的是连续帧配置在很多考勤设备上根本没有暴露给管理员甚至说明书里都不提。我们后来是通过联系厂商技术支持在SDK参数层面才把这个值从1改成3。如果你们用的设备后台找不到这个选项建议直接问厂商要这是重要但不紧急的健壮性配置值得花时间搞定。4. 加固落地算法参数、设备与管理侧的完整调整4.1 活体检测开启后的校准过程测试确认方案有效之后我们开始在生产环境正式调整。第一步当然是打开活体检测但打开之后的前两周麻烦立刻就来了真实员工通过率从97%左右掉到了93%。原因有几个。首先是光线问题考勤机放在进门大厅靠窗位置下午逆光严重静默活体在这种光照条件下经常判定不稳定。其次是底库照片太旧很多员工用的是两年前入职时拍的照片发型、体重、胡子都变了本来就勉强匹配再加一道活体检测失败率就直线上升。这两周的调整过程很琐碎但方向很明确。我们在考勤终端侧加了一个补光灯用柔光LED灯带贴在终端上方把逆光造成的脸部阴影打掉一部分。然后组织全员重新录入底库照片录入时明确要求摘口罩、额头露出来、正对镜头、室内光线均匀。旧底库照片清空失效的重新录。重新录入之后静默活体的判断明显稳定了因为算法有了更接近当前的参考基准。这中间还踩了个小坑。有个女同事反映连续三天打卡失败查日志发现是静默活体判定“非活体”。后来才发现问题是美瞳加镜框反光导致算法在眼部区域提取不到足够有效的皮肤纹理特征。我们的处理方式是让她把底库照片换成了摘下眼镜拍摄的正脸照之后打卡时再戴上眼镜反而正常了。这类边界情况很难在测试阶段全部发现只有在真实运行中遇到一个、解决一个。4.2 阈值的调优从0.5到0.62的实战数据阈值调整我们用了整整一周的打卡数据来做验证。先导出一周内所有成功和失败的打卡记录按相似度分数做了分布统计。结果是绝大多数员工集中在0.75到0.95区间这部分人无论阈值怎么调都稳稳通过。真正需要担心的是分数落在0.62到0.7的那群人占比大约7%他们往往有光线不好、角度偏、底库照片过时等问题。把阈值从0.5提到0.62之后这批人里面有大约3%会开始出现偶发失败另外4%依然能过。为了找到可接受的平衡点我参照测试阶段的组合策略保留了活体检测并把阈值设为0.62然后跑了三天小规模验证。结果异常样本依然全部被拒真实打卡通过率稳定在96.8%左右比测试阶段的98%略低但考虑到真实环境的复杂性这个数是可以接受的。过了差不多一个月随着补光灯和重录底库的效果释放通过率回升到了97.3%。我没有继续调高阈值因为频繁调整会让数据基线失去意义。如果你也在做类似的调优记住一个原则每一次调整都要记录日期、原因和前后数据否则三个月后回头看你会完全不知道自己为什么改了这版配置。4.3 设备层的取舍软件修复还是升级硬件软件加固方案跑通之后我们面临最后一个决策要不要换硬件当时IT部门内部意见并不统一一部分人认为既然照片和视频都能被拦住软件方案够了另一部分人觉得只能防“打印照片”这种低端攻击不够放心万一有人用更精细的头模呢我把两种方案的账算了一下。软件加固方案改动成本几乎为零只需要在已有设备上打开活体检测、调整阈值、开启连续帧校验缺点是在暗光和特殊角度下真人误拒率依然偏高。硬件升级方案是把部分点位换成带双目红外摄像头或3D结构光的设备这类设备通过红外光反射和深度信息来判定活体对照片、视频和低质头模的攻击基本免疫误判率可以控制在0.1%以下但单台成本贵30%到40%。最终我们采用的是混合方案。两个旧的室内考勤点通过软件加固继续使用因为倒班员工已经习惯了设备位置固定且光线可控。前台新增的考勤点也是外人进出最频繁的地方直接部署一台双目红外终端用于应对最不确定的现场环境。这种组合既控制了成本又能在最需要安全性的位置获得硬件级保障。4.4 管理端兜底配置异常报表与重试限制最后一道防线放在了后台管理端。我检查了一圈发现这台设备的“抓拍照片留存”功能竟然也是关闭状态。考勤记录里只有时间和结果没有过程图像这意味着即使有人用照片打卡成功管理员事后也完全看不出端倪。第一件事就是把抓拍留存打开确保每一次考勤动作都留下终端拍摄的原始图像。第二件事是配置异常考勤提醒。我们设了两条规则同一员工一天内打卡次数超过6次自动告警打卡时间出现在凌晨0点到5点自动告警。这两类场景在正常考勤里几乎不会出现一旦出现大概率是有人拿别人的卡或者照片在试验。告警推送到HR群里管理员看一眼抓拍图就能判断是不是异常不用再翻几天的日志。第三件事是限制单次识别重试次数。默认设置为无限重试语音提示“请重试”之后员工可以一直把脸凑上去反复刷。我们在后台把单次重试次数改成3次超过3次之后设备锁定30秒并记录一次告警。这个配置主要防的是蓄意反复尝试行为正常员工偶尔没刷上等30秒再刷一次也完全可以接受。三道兜底配置加完之后我心里那块石头才算真正落地。5. 半年运行效果与给同类团队的测试建议5.1 上线后的真实数据对比整个加固方案从测试到全量落地大概用了两个月到现在已经稳定运行了半年左右。我把几个关键指标拉出来对比了一下指标加固前加固后软件加固点加固后新设备点真实员工日均通过率98.7%97.3%99.1%异常样本通过率最高90%照片0%0%管理员处理异常考勤时间每周约1小时每周约10分钟每周约10分钟月度误拒投诉量2-3条2条0条真实员工通过率虽然降了一个多点但员工几乎感知不到因为失败的人只需要重新调整角度就能通过不需要找行政申诉。管理员的时间省了一大截这才是我们最直接感受到的收益。从安全角度看照片、视频回放这类最廉价的攻击路径被彻底切断剩下的风险门槛已经高到不值得有人去尝试。这个结果说明一件事很多公司的人脸考勤设备问题不在品牌也不在算法而在默认配置长期不被使用。算力足够的前提下软件的开关往往就能解决八成问题硬件升级只是最后那个锦上添花的选项。5.2 给准备做安全自查的团队五点建议如果你看完这篇也想在自己公司做一次类似的测试结合我们这次踩过的坑我整理了几条操作建议先审批再动手。安全测试必须先立项把目的、范围、时间窗口、涉及设备写清楚让行政、HR、IT三方确认避免被不知情的同事误认为恶意行为。我们的测试因为前期沟通充分全程没有任何误会。用独立底库别碰真实员工数据。备用终端上建一个临时测试底库插入几个虚拟测试人脸测完立刻删除。一旦涉及真实人脸数据整个测试的性质就变了合规风险会成倍上升。样本种类不必一开始就求全。第一轮先做打印照片和手机屏幕回放两类低频高威胁样本摸清设备的底线。如果这两类都防不住那后面测什么都不着急先把活体检测打开再说。数据要文档化。每轮测试记录设备型号、固件版本、后台配置参数、样本类型、测试时间、通过次数和分数分布。这些数据表面上是给测试报告用的实际上是你后续调参、和厂商沟通、申请预算采购的唯一有力凭证。必须做回归验证。加固配置上线后至少连续观察两周真实打卡数据不要只测一上午就宣布成功。活体检测的误拒、阈值的影响、连续帧校验的副作用都只有在长期运行中才会完全暴露。5.3 我个人踩过的三个坑最后聊几个只有实际操作过才会注意到的细节这些在文档里基本找不到。第一个坑是活体检测和补光灯的联动问题。刚开始我们只开了活体检测没有加补光灯暗光场景下员工通过率掉了四个点我当时差点想回滚配置。后来才发现问题出在光照环境加了柔光补光之后通过率立刻回升。如果你也遇到开启活体后识别率骤降先查光照再查底库照片不要一开始就怀疑配置方案本身。第二个坑是动作活体的“动作幅度”参数。我们一开始把动作活体的灵敏度调到最高结果好几个人因为“转头幅度不够”被反复拒识。后来把灵敏度调回标准档配合随机动作指令体验立刻恢复了。动作活体本质上是让用户配合算法而不是算法适应用户灵敏度太高反而容易误伤。第三个坑是底库照片的“新鲜度”。重新录入照片后的第一个月通过率确实上升了但三个月之后又有下降趋势因为部分员工换了发型、留了胡子或者增重了。现在我们已经把底库照片更新时间定为每半年一次行政会在年度体检时顺便安排全员重录一轮。这个维护性工作不算复杂但需要有人专门记得盯。回看这次半个多月的测试过程我最深的感触是所谓“人脸识别克星”大多数时候不是什么黑客技术而是运维管理上的疏忽。活体检测开关、相似度阈值、连续帧校验、抓拍留存、重试限制这几个配置项只要你认真过一遍系统安全性就会上一个台阶。如果你也正在用类似的考勤设备别急着换最贵的硬件先翻一翻后台有没有这些开关把软件配置用好你会发现很多钱本来是不用花的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑