首页
社区
课程
招聘
[原创] 人脸视频流注入攻防全史:AI时代人脸对抗,我们如何应对?
发表于: 18小时前 1356

[原创] 人脸视频流注入攻防全史:AI时代人脸对抗,我们如何应对?

18小时前
1356

人脸视频流注入攻防全史:AI时代人脸对抗,我们如何应对?

在AI时代,黑产攻防的边界正在被“生成式技术”彻底重构。 过去,我们对抗的是粗糙的视频重放和系统篡改;现在,随着 LivePortrait、SadTalker 等 AIGC 技术的开源,黑产已能通过单张照片实时生成配合指令的“活体视频”。当“眼见不再为实”,当注入攻击结合了 AI 的即时生成能力,传统的特征防御防线正面临降维打击。这篇文章,不仅是对过去攻防技术的复盘,更是为了在 AIGC 洪流中,构建一套基于“行为逻辑”与“物理约束”的全新防御体系。

背景:

随着人脸场景的摄像头视频流注入的对抗升级,早期我们还可以从“攻防视角”入手:看进程里有没有可疑 so、有没有 hook 点、有没有异常权限、有没有典型注入链路等。一直升级到现阶段:攻击不发生在 App 进程内,甚至会配合 BL 解锁绕过Root 隐藏环境伪装 等手段,把传统的检测点绕开。这样一来,单纯依赖进程/系统属性/运行环境去判断“有没有注入”,会越来越不稳、成本越来越高、误报也越来越多。于是引发了一个思考:

为什么要从“攻防识别”转向“行为检测”?

本文将深度复盘人脸视频流注入攻防的完整演进史——从早期的 App 进程内 Hook,演进至如今隐蔽性极高的系统级(CameraServer/定制 ROM)注入。面对传统“特征检测”手段的失效,文章重点阐述了人脸对抗的“下半场”策略:构建基于“多维行为一致性”的防御体系。我们将详细拆解如何利用传感器(IMU)协同、光学主动干扰(白平衡/曝光)、时空动态挑战(随机相框)以及时序特征(循环/拼接检测)来逼迫伪造流露出破绽,旨在为“系统级注入时代”提供一套可落地、可运营的系统化解决方案。

摄像头视频流基础流程

摄像头数据流程整体链路概要,便于理解后面的注入点和检测点:

Camera1(旧 API):

  • App 调用 Camera.open → 设置 setPreviewCallback && setPreviewDisplay(Surface)startPreview
  • 预览帧通过 PreviewCallback#onPreviewFrame 回调到应用(常见格式 NV21/YUV)
  • 画面同时渲染到 Surface(SurfaceView/TextureView)

Camera2(新 API):

  • App 调用 CameraManager#openCameraCameraDevice 回调 onOpened
  • 构建 CaptureRequest,通过 createCaptureSession 绑定输出 Surface
  • 输出通常走两条路:ImageReader(常见格式 NV21/YUV)和 Surface(直接预览渲染)

对应关键链路(Android 13):

  • ICameraDevice.open(callback):打开设备,返回 ICameraDeviceSession
  • ICameraDeviceSession.configureStreams():配置预览/拍照输出流
  • ICameraDeviceSession.processCaptureRequest():提交请求
  • ICameraDeviceCallback.processCaptureResult():回传预览帧与 metadata(核心回调,驱动 Camera2 的 CameraCaptureSession/ImageReader;Camera1 场景下间接转成 onPreviewFrame

摄像头视频流基础流程补充

上述流程是通用的链路说明。下面开始分析这条链路在过去几年是如何被逐步注入的。

1. 摄像头视频流注入攻防史回顾

整体可以分为四个阶段:

  • 第一阶段:分析app侧逻辑,替换相机返回后的数据
  • 第二阶段:App进程内Hook预览回调(2019年)
  • 第三阶段:基于自定义ROM的源码级修改实现(2022年)
  • 第四阶段:系统进程注入(cameraserver/processCaptureResult)(2024年)

1.1 第一阶段:分析app侧逻辑,替换相机返回后的数据

最早一批手法比较直接:直接分析app的代码逻辑,在找到人脸的关键函数以后,替换入参或者返回值,修改相机返回的数据。
这类方案特征:

  • 注入点在 app收到人脸数据后,无需深入了解摄像头视频流过程,直接hook关键函数就行;
  • 攻击门槛稍高,需要绕过加固,混淆等对抗工具,而且通用性低,每个app都不一样。

对应的防守思路

  • 增加水印在收到相机回调的数据后,第一时间增加水印,服务端对客户端上传的数据流作验证,水印技术展开见基础检测章节
  • app检测自己人脸对比整个链路的函数是被hook,检测方式参考下一章节的展开

1.2 第二阶段:App进程内Hook摄像头回调链路(PreviewCallback / onPreviewFrame)

注入目标:CameraService → App回调(PreviewCallback或ImageReader)这段链路。

在第一阶段以后,黑产进化为在应用进程里对 PreviewCallback#onPreviewFrame 的回调做 Hook,把原本来自摄像头(经过系统服务转发)的帧数据替换为伪造/重放的内容。

这类方案的特征是:

  • 注入点在 Java 层/应用进程内,链路相对"短";
  • 直接替换了 App 收到的 NV21/YUV 数据;
  • 攻击门相对高、需要了解视频流回调链路,hook surface渲染数据流,桢数据(nv21)回调数据流,需要实现mp4转nv21(ffmpeg),但通用性强。

对应的防守思路
只要把本进程的摄像头调用链路梳理清楚,对关键方法与关键路径做完整性校验,就能覆盖大多数场景。

尤其是 Java 方法的 Hook,本质上绕不开“入口被改写/调用被劫持”的痕迹:

  • 不管是偏运行时的 inline 思路,
  • 还是偏框架层的入口指针/方法替换思路,

只要做了足够的进程内链路校验,通常都能发现异常。

注入参考实现:android_virtual_cam

原理概述:

  • 运行在目标 App 进程内,通过 Xposed 拦截 Camera1/Camera2 的预览与回调链路。
  • Camera1:替换 setPreviewTexture/setPreviewDisplay 的目标 Surface,startPreview 时用 MediaPlayer 播放 virtual.mp4;同时 hook PreviewCallback#onPreviewFrame,把解码出的 NV21 数据写回回调 buffer。
  • Camera2:创建虚拟 Surface(c2_virtual_surface),将 CaptureRequest 的目标改写为该 Surface;保留原 preview/ImageReader Surface,并用 MediaPlayer/VideoToFrames 把 virtual.mp4 推送到对应 Surface。
  • 拍照回调:拦截 onPictureTaken,把 YUV/JPEG 数据替换为本地 1000.bmp 转换结果,确保“拍照”也被伪造。

关键 hook 方法:

  • Camera1 预览:android.hardware.Camera#setPreviewTexturesetPreviewDisplaystartPreview
  • Camera1 帧回调:android.hardware.Camera#setPreviewCallbackWithBuffersetPreviewCallbacksetOneShotPreviewCallbackaddCallbackBufferandroid.hardware.Camera.PreviewCallback#onPreviewFrame
  • 拍照回调:android.hardware.Camera#takePictureandroid.hardware.Camera.PictureCallback#onPictureTaken
  • Camera2 入口/会话:android.hardware.camera2.CameraManager#openCamera(两种重载)、android.hardware.camera2.CameraDevice.StateCallback#onOpenedandroid.hardware.camera2.CameraDevice#createCaptureSession*
  • Camera2 目标与输出:android.hardware.camera2.CaptureRequest.Builder#addTarget/removeTarget/buildandroid.media.ImageReader#newInstanceandroid.hardware.camera2.CameraCaptureSession.StateCallback#onConfigured/onConfigureFailed/onClosed

对抗思路

核心思路就是检测app进程内的方法是否被hook,具体展开见基础检测章节

1.3 第三阶段:通过定制ROM,重编译HAL层代码或系统服务层(CameraService),实现摄像头数据流替换

由于摄像头链路很长,除驱动层代码闭源无法修改外,其余层级的定制 ROM 都可以改,所以检测思路从 App 进程内注入转向自定义 ROM 识别:系统识别到风险 ROM 后,直接阻断人脸识别等高风险业务,达到拦截目的。

自定义 ROM 常见两类:

  • 基于 AOSP 编译后刷入真实手机的定制 ROM。
  • 基于 ARM 服务器的云手机(运行在虚拟化环境中的 ROM)。

常见的自定义 ROM 检测思路:

  • 系统环境一致性:厂商特有服务(安全管家/钱包/系统守护/等其他大量包含品牌字符串的服务)、系统库与框架能力是否齐全且匹配机型。
  • 基础属性一致性:prop/Build 全量数据、CPU/GPU/传感器等多渠道交叉采集并对照。例如 CPU 同时读取 /proc/cpuinfo/sys/devices/system/cpu,核数/频率等应一致。

自定义 ROM 的识别强依赖端云协同:端上只做基础数据采集,服务端做归一化与模型学习,沉淀机型环境指纹,多特征不匹配直接拉黑。本节不展开实现细节,重点是服务端的数据验证能力,客户端做到在隐私合规的情况下应采尽采即可精准识别定制ROM。

1.4 第四阶段:系统进程注入(cameraserver / processCaptureResult附近),让app进程毫无问题

随着对抗升级,自定义ROM的漏洞太多,magisk及zygisk的root解决方案让系统进程注入更加方便,所以注入点开始从 App 进程下沉到 cameraserver / CameraService 的结果回传链路。典型思路是围绕 processCaptureResult 及其前后接口做注入,直接在系统进程替换视频流。
再配合环境伪装手段(例如 Root/BL 相关模块隐藏),系统进程的注入app无法检测,手机root被隐藏也无法检测。

但这种方案往往适配android10-13版本。
因为在Android 14,cameraserver的构建形态发生变化,绝大多数逻辑都inline到了cameraserver本身,不再动态加载so,导致这种方案大部分只适配10-13。

核心原理:
基于 frida 注入 cameraserver,在 libcameraservice.so 和回调链路里做关键拦截与 buffer 改写,核心实现要点如下:

  • 符号定位:枚举 libcameraservice.so 导出符号,定位 processCaptureResult(不同版本符号名可能带版本后缀)。
  • 主链路 Hook:Interceptor.attach(processCaptureResult),解析 CaptureResultframe_number/metadata/output_buffers,对输出 buffer改写,实现画面替换/重放。

核心流程:找到 processCaptureResult → 解析 camera3_capture_result_t → 遍历 output_buffers 找到 buffer_handlelockYCbCr 改写buffer(mp4到nv21数据用ffmpg库即可,此处不展开) → unlock

函数与符号对应关系(GBM 相关):

  • GraphicBufferMapper::getInstance_ZN7android9SingletonINS_19GraphicBufferMapperEE11getInstanceEv
  • GraphicBufferMapper::lockYCbCr_ZN7android19GraphicBufferMapper9lockYCbCrEPK13native_handlejRKNS_4RectEP13android_ycbcr
  • GraphicBufferMapper::unlock_ZN7android19GraphicBufferMapper6unlockEPK13native_handle

核心代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 1) hook processCaptureResult,读取输出 buffer 列表
const SYM = "_ZN7android7camera320processCaptureResultERNS0_19CaptureOutputStatesEPK22camera3_capture_result";
const addr = Module.findGlobalExportByName(SYM);
 
// OFF: camera3_capture_result_t 的字段偏移(按 32/64 位区分)从源码找
// frame = frame_number, num = num_output_buffers, out = output_buffers
const OFF = (Process.pointerSize === 8)
    ? { frame: 0x0, num: 0x10, out: 0x18 }
    : { frame: 0x0, num: 0x08, out: 0x0c };
// SB: camera3_stream_buffer_t 的字段偏移与结构体大小从源码找
// stream = camera3_stream_t*, buffer = buffer_handle_t*
const SB = (Process.pointerSize === 8)
    ? { size: 0x30, stream: 0x00, buffer: 0x08 }
    : { size: 0x1c, stream: 0x00, buffer: 0x04 };
 
Interceptor.attach(addr, {
    onEnter: function (args) {
        const res = args[1];
        const frame = res.add(OFF.frame).readU32();
        const num = res.add(OFF.num).readU32();
        const out = res.add(OFF.out).readPointer();
        for (let i = 0; i < num; i++) {
            const sb = out.add(i * SB.size);
            const stream = sb.add(SB.stream).readPointer();
            const handle = sb.add(SB.buffer).readPointer();
            if (stream.isNull() || handle.isNull()) continue;
            const w = stream.add(0x4).readU32();
            const h = stream.add(0x8).readU32();
lockAndModifyYCbCr(handle, w, h);
        }
    }
});
1
2
3
4
5
6
7
8
// 2) lockAndModifyYCbCr 通过 GraphicBufferMapper::lockYCbCr 改写 Y plane
// gbmLockYCbCrFn/gbmUnlockFn 来自 libui.so 的符号解析
const ycbcr = Memory.alloc(0x40);
if (gbmLockYCbCrFn(gGbm, handlePtr, usage, rect, ycbcr) === 0) {
    const yPtr = ycbcr.readPointer();
    Memory.writeU8(yPtr.add(0), 0x80); // 示例:改写一个像素
    gbmUnlockFn(gGbm, handlePtr);
}

对应的防守思路:
当端侧无注入暴露的时候,机器和人终究不同,所以行为检测显得尤为重要,具体思路见后续的行为检测章节

注入参考实现,虚拟相机(闭源的商业化产品)

如何检测虚拟相机:
1.0版本会暴露出一个特殊的系统服务,扫描即可。
2.0版本,系统服务做了随机化,也能识别,但这种方式终究是有局限性的,开发者完全可以做到全隐藏。

2. 基础检测方式介绍及其对抗演进

在转向"行为检测"之前,业界普遍采用的是"基础检测"方案,这些方案看似简单直接,但在黑产对抗下逐渐失效。本节深入分析这些基础防护的原理、局限与对抗。

2.1 第一阶段防护:视频水印(对应第1.1阶段的注入)

这是对分析app侧逻辑,替换相机返回后的数据的直接防守。核心思想是:对"摄像头数据→人脸识别服务器"这个链路加入完整性标记。

实现思路
App 每次收到每一桢回调时:

  1. 图像上增加水印,例如:在关键帧使用低透明度重复铺“斜向纹理/时间戳/buffer增加扰动等”
  2. 对系统返回的nv21数据整体签名
    服务端收到后判断关键帧图像签名是否完整,水印是否正常,从而判断是否被替换

但这种方式对后面阶段的手法都无法生效,后面阶段进阶为在app收到帧数据之前替换

2.2 Java hook检测(对应第1.1、1.2阶段的防护)

目前java层注入主要分为frida派和xposed派,核心流程如下:

  1. 替换 ArtMethod 入口点(Entry Point),针对xposed为代表的技术路线检测
    核心思路:Hook 通过修改 ArtMethod 的入口指针,把方法跳转到 trampoline/stub,再转去自定义逻辑。
    检测方向:
  • 读取目标方法的入口地址,结合 /proc/self/maps 判断是否落在可信代码段(如oat/odexlibart)。
  • 若入口点落在匿名可执行内存、可疑 so,就认为有注入
  1. Inline 注入(入口指令被改写),针对frida为代表的技术路线检测
    核心思路:直接在方法入口打补丁,把前几条指令改为跳转(B/BL/BR 等)到自定义代码。
    检测方向:
  • 读取方法入口的前几个字节/指令,检查是否出现异常的跳转指令(例如ARM64经典的58000050)。

如何获取ArtMethod入口点,参考实现:LSPlant

思路分析:

  • Throwable 两个构造方法的地址差推算 ArtMethod 大小,进而推断 entry_point_offset/data_offset(Android M+)。
  • Android L 系列直接从 ArtField 反射读出 entryPointFromQuickCompiledCode/entryPointFromInterpreter/entryPointFromJni 的精确偏移。
  • 最终在 SetEntryPoint/GetEntryPoint 里按偏移读写入口点指针。

核心代码源码:

1
2
3
4
5
6
7
8
9
// 反射拿 ArtMethod* 指针
static art::ArtMethod *FromReflectedMethod(JNIEnv *env, jobject method) {
    if (art_method_field) [[likely]] {
        return reinterpret_cast<art::ArtMethod *>(
            JNI_GetLongField(env, method, art_method_field));
    } else {
        return reinterpret_cast<art::ArtMethod *>(env->FromReflectedMethod(method));
    }
}
1
2
3
4
5
6
7
8
9
// 用两个构造方法地址差推算 ArtMethod 大小(M+)
auto first_ctor = constructors[0];
auto second_ctor = constructors[1];
auto *first = FromReflectedMethod(env, first_ctor.get());
auto *second = FromReflectedMethod(env, second_ctor.get());
art_method_size = reinterpret_cast<uintptr_t>(second) - reinterpret_cast<uintptr_t>(first);
 
entry_point_offset = art_method_size - kPointerSize;
data_offset = entry_point_offset - kPointerSize;
1
2
3
4
5
6
7
8
// L 系列:通过 ArtField 反射直接拿偏移
if (sdk_int == __ANDROID_API_L__) {
    entry_point_offset =
        get_offset_from_art_method("entryPointFromQuickCompiledCode", "J");
    interpreter_entry_point_offset =
        get_offset_from_art_method("entryPointFromInterpreter", "J");
    data_offset = get_offset_from_art_method("entryPointFromJni", "J");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 入口点读写
void SetEntryPoint(void *entry_point) {
    *reinterpret_cast<void **>(reinterpret_cast<uintptr_t>(this) + entry_point_offset) =
        entry_point;
    if (interpreter_entry_point_offset) [[unlikely]] {
        *reinterpret_cast<void **>(reinterpret_cast<uintptr_t>(this) +
                                   interpreter_entry_point_offset) =
            reinterpret_cast<void *>(&art_interpreter_to_compiled_code_bridge_);
    }
}
 
void *GetEntryPoint() {
    return *reinterpret_cast<void **>(reinterpret_cast<uintptr_t>(this) + entry_point_offset);
}

2.3 炫彩检测(主动光/三色光检测)

原理

端侧以 RGB 不同颜色按既定(随机)时序进行主动补光并同步采集多帧图像,算法在对应帧中提取人脸区域的颜色/光谱响应特征及其时域一致性(如通道比例变化、局部反射分布、阴影与高光随光序列的同步变化等)。服务端依据光序列标识与帧时间对齐进行校验,从而判别是否为真实人脸对主动光挑战的响应。

实现思路

  1. 在预览界面上盖一层全屏 View,动态切换背景色(RGB),亮度拉满,持续几十毫秒到几百毫秒。
  2. 在上报人脸数据的同时上报对应桢时间戳对应的背景色

黑产对抗

  • 黑产通过录屏的手段,动态捕获当前主动补光的rgb值,然后动态往自己的修改桢里面“补光”,从而绕过

如何再对抗

  • 人脸识别阶段开启禁止录屏的flag:android.view.WindowManager.LayoutParams.FLAG_SECURE,防止录屏(但黑产仍能注入系统,关闭此flag进行录屏)

2.4 交互式活体检测

原理

交互式活体属于典型的挑战应答(Challenge-Response):系统在识别过程中随机下发动作指令(如眨眼、张嘴、点头/摇头、看向指定方向等),端侧在限定时间窗内采集连续帧并检测动作是否发生、是否按指令顺序完成、时序是否匹配、运动模式是否符合真实人脸。服务端(或端侧)基于“指令序列标识 + 帧时间戳对齐 + 动作检测结果”进行一致性校验,从而对抗静态照片/静态帧注入与部分重放攻击。

核心思路

  1. 注入的视频都是预制品,所以动态的动作无法精准预判

实现思路

  1. 下发随机指令序列:从动作集合中随机抽取(可随机顺序/随机次数/随机时间窗),例如“眨眼 → 张嘴 → 点头”。

  2. 端侧引导与采集:在 UI 上提示用户执行动作,同时采集连续帧并记录关键时间点(指令开始/结束、每帧时间戳)。

  3. 动作检测与打分:对每个动作提取特征(如眼部 EAR 变化检测眨眼、嘴部开合比例检测张嘴、头姿 yaw/pitch 变化检测转头/点头),并输出动作完成度与时序一致性分数。

  4. 结果上报:上报指令序列 ID、每步动作检测结果、关键帧/摘要特征及时间戳,用于服务端按序列校验(或端侧本地判定后仅上报结论)。

黑产对抗:

-黑产提前准备点头,眨眼等动作,在界面弹出动作指令时,切换对应视频,从而进行绕过。

2.5 基础防护为什么普遍失效:核心根本

防护方式 特点 主要弱点
链路标记校验 在 NV21 buffer 加标记,检查是否被篡改 只防 App 进程内注入;标记可复用;无法证明来源
炫彩 依赖光学特性位移 可被人工合成;无机型源头校验
Hook 检测 检测内存中是否存在 Xposed/Frida 等注入框架的痕迹 无法应对系统进程的注入

根本原因:上述防护都是"本地生成、本地验证"的模式,攻击者只要能:

  1. 拦截到防护逻辑(如 hook App 的检测函数)
  2. 或获知防护特征(如自适应app侧三色光)
  3. 就能在虚拟视频上"事先恶补"对应的特征

换句话说,黑产通常比防守更早知道防守的底线是什么


2.6 为什么要转向"行为检测"

基础防护的共同缺陷:可预测、可重放、无源头校验

而"行为检测"的优势:

  1. 动态挑战:每次检测的挑战都不同,黑产无法提前准备
  2. 实时响应:要求注入流实时跟随用户动作做出自然反应(这在技术上难度极高)
  3. 多维交叉:将视觉、IMU、时序特征等多个维度交叉验证,单点突破难度大幅上升
  4. 源头校验:通过与真实物理世界的互动(光线、运动、传感器)建立关联,难以完全伪造

因此,接下来的第 3 章将详细展开"行为检测"的实现思路,这是当前对抗注入流最有效的方案。


3. 既然注入对抗艰难,那我们不妨转换思路,基于行为,识别注入视频流:行为挑战 + 多维一致性

本文方案从以下维度判断“视频是否像真实摄像头那样响应世界变化”:

  1. 左右翻动手机挑战:用户主动翻动手机,真实画面中人脸会明显变化(位置、角度、大小),同时传感器会记录运动;注入流往往无法同时在视觉和传感器维度保持一致
  2. 白平衡主动干扰:系统主动修改摄像头白平衡参数,真实摄像头会立即捕捉到颜色变化;伪造视频无法及时感知系统指令进行同步修改
  3. 随机相框跟踪:屏幕上生成随机移动的框,用户会自然跟随框移动头部,真实画面的人脸运动应该符合生理延迟和运动学特征;注入视频往往无法做出自然的实时响应
  4. 帧周期/循环检测:重放视频常出现可检测的周期性重复(多个维度特征相似度高);真实视频中帧的特征应该平稳、连续变化
  5. 帧连续性检测:检测视频是否被切换或拼接,通过人脸生物指纹(皮肤纹理、特征区域)和摄像头 metadata 的一致性来判断

最终建议采用 多因子打分,减少误报。误报是每个产品的痛点——每天前台就追着问"为什么有误报",因为误报直接吃投诉。通过多个维度的联合判断,既能提高检测精准度,又能控制误报率。

4. 实现细节

4.1 左右翻动手机:主动制造数据帧差异与传感器一致性验证

核心思路:通过动作下发引导用户手机左右反转,同时采集两份数据流:

  1. 视觉数据:摄像头预览帧中人脸的位置、姿态、大小的变化
  2. 传感器数据:加速度计、陀螺仪、重力方向等真实物理数据

原理

  • 真实摄像头拍摄用户翻动动作时,画面中的人脸会产生明显的几何变化(左右位移、旋转、远近变化)
  • 同时陀螺仪‌也会记录相同的加速度和角速度变化
  • 注入视频(录制视频或伪造视频)通常是固定的静态画面,无法对用户的实时动作做出响应
  • 即使攻击者想同步伪造视觉+传感器数据,也需要:
    • 实时捕捉陀螺仪‌变化
    • 实时计算并生成对应的人脸变换
    • 生成的变换必须在视觉和物理上都符合现实

实现细节

整个过程分为三个阶段:

(1) 动作挑战下发

  • 下发随机化的翻动指令:左右翻动(指定角度范围,如45°以上)、时长限制(如2秒内完成)
  • 确保每次挑战都不同,防止攻击者提前录制

(2) 多源数据采集

  • 并行采集两路数据流:
    • 视觉流:摄像头帧序列,提取人脸位置(x,y)、旋转角度(yaw/pitch/roll)、缩放比例(scale)
    • 传感器流:陀螺仪‌原始数据,包括加速度三轴、角速度三轴、时间戳

(3) 多维度一致性验证

  • 角速度与人脸旋转对齐:计算陀螺仪‌角速度与人脸yaw角度的时间相关性(应 > 0.7)
  • 时间延迟检查:两条数据流的变化峰值应同步(允许延迟 ±50ms,代表生理反应时间)
  • 运动量匹配:陀螺仪‌积分后的总旋转角度与人脸旋转角度应接近(误差 < 5°)
  • 加速度响应:头部加速度的突变应该与人脸运动的加速阶段对应

(4) 异常判定规则

  • 陀螺仪‌变化显著但人脸几乎不变 → 伪造视频或屏幕录制
  • 人脸变化但陀螺仪‌无响应 → 注入视频,没有真实设备运动
  • 两者都变化但时间错位超过100ms → 视频和传感器不同步,可疑
  • 变化趋势相反(陀螺仪‌向左但人脸向右) → 明显的注入特征

防护优势

  • 多源数据交叉验证:攻击者很难同时伪造图像和传感器
  • 难以规避的物理约束:头部旋转会改变人脸几何特征,这是客观物理规律
  • 难以离线预处理:无法提前知道用户会做什么动作(随机化)

4.2 白平衡与曝光主动干扰:实时响应检测

核心思路:系统主动修改摄像头的白平衡(改变色温)和曝光补偿(改变亮度),观察捕捉到的画面是否实时发生了对应的颜色和亮度变化。真实摄像头会立即反映这些参数的变化,伪造视频则无法做出这种实时响应。

原理

  • 真实摄像头的响应机制

    • 系统修改白平衡参数(AWB模式或colorTemperature),摄像头ISP立即应用,改变RGB增益 → 画面偏红/偏蓝
    • 系统修改曝光补偿(exposure compensation),摄像头自动调节ISO或快门 → 画面整体变亮/变暗
    • 两个变化都是硬件级别的、实时的、可预测的
  • 伪造视频的致命弱点

    • 预录视频:无论修改什么参数,画面都不会变化(色彩和亮度都固定)
    • 屏幕投影或注入视频:虽然是动态的,但无法感知系统指令进行同步修改
    • AI实时生成:需要感知指令、重新生成并编码,延迟极高(无法在33ms内完成)

实现细节

(1) 参数修改

  • 白平衡修改(Camera1):params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_DAYLIGHT) 偏蓝 / WHITE_BALANCE_INCANDESCENT 偏红
  • 曝光补偿修改(Camera1):params.setExposureCompensation(value) value可以通过getMaxExposureCompensation()获取,让画面全白,再人脸识别结束设置,不影响用户体验
  • 修改应快速执行(在一帧之内,约33ms)

(2) 画面变化捕捉

  • 白平衡变化:对比修改前后RGB通道的值
    • 偏蓝时,B通道应明显增加
    • 偏红时,R通道应明显增加
  • 曝光变化:对比修改前后的亮度(Y通道平均值)
    • 增加曝光,Y值应明显增加
    • 降低曝光,Y值应明显降低

(3) 真实性验证

  • 变化幅度检测:修改参数后,相应通道的变化应 > 20%(容易感知的变化)
  • 一致性检测:多次重复修改参数(可选,会影响用户体验),每次的变化应相同且可预测(真实摄像头的硬件响应是确定性的)
  • 区域一致性:整个画面应该均匀受影响(白平衡和曝光是全局参数,不能只有某个区域变化)

(4) 伪造视频的检测特征

  • 预录视频:修改参数后画面完全不变
  • 屏幕投影:虽然显示了变化,但这是屏幕本身的变化,不是摄像头捕捉的变化
  • AI实时生成:虽然能做出变化,但往往延迟 > 200ms,或色彩/亮度的变化不符合物理规律

防护优势

  • 无法提前应对:黑产不知道系统会修改哪些参数、修改方向和幅度
  • 实时性高:在一帧内就能检测,黑产的实时生成无法跟上
  • 双维验证:同时检验白平衡和曝光,难以同时欺骗两个维度
  • 物理可验证:色彩和亮度变化是可测量的硬件响应

踩坑点
必须先通过光线传感器获取当前环境光,低环境光下此功能点有误报情况,基于此如果在弱光环境下但是采集到的人脸背景不符合弱光特征,也可以证明有视频注入

4.3 随机相框:空间维度的动态挑战与 ROI 跟随

核心思路:在"时间维度"(4.1、4.2)和"空间维度"(本节)都对用户施加随机、不可预知的挑战,要求视频流能够自然响应这些挑战。随机相框通过在屏幕上生成随机移动的取景框,要求用户将人脸移入框内或跟随框移动,同时验证人脸与框的空间关系是否自然和连贯。

原理

  • 真实人脸对空间挑战的响应

    • 引导用户看到屏幕上的框时,主动将头部移动来对齐框
    • 这种头部运动应该具有以下特征:
      • 运动学连续性:头部位置变化应该是平滑的(不会瞬间跳跃)
      • 速度/加速度合理:头部不会以超过生理极限的速度移动(头部最大旋转角速度约 300°/s)
      • 跟踪延迟一致:视觉反馈(看到框) → 运动决策(大脑0.2s) → 头部运动(执行),总延迟约 200-400ms
  • 伪造视频的弱点

    • 攻击者需要预录或实时生成与随机相框完全配合的人脸运动
    • 即使用 AI人脸重建生成视频,也很难:
      • 实时获知相框参数(需要 hook UI 层)
      • 在 100-200ms 内生成对应的人脸运动帧(实时性要求太高)
      • 确保运动学特征自然(AI生成的运动可能出现不自然的抖动或加速度突变)

实现细节

(1) 随机相框轨迹生成

  • 在屏幕上生成随机移动的目标框:可以是圆周运动、随机游走、或突然跳变
  • 每次挑战的轨迹都不同,防止攻击者预先录制对应的头部运动

(2) 人脸与框的对齐度量化

  • IoU (Intersection over Union):计算人脸框与目标框的交集/并集比值(0-1,1表示完全重合)
  • 中心距离:计算人脸框心与目标框心的欧氏距离(像素)
  • 关键点覆盖率:计算人脸关键点(眼睛、鼻子等)有多少落在目标框内

(3) 对齐度动态的真实性验证

  • 响应延迟检测:从目标框改变到人脸开始跟随,应该有200-400ms的延迟(代表:视觉感知0.1s + 大脑决策0.1s + 肌肉执行0.1-0.2s)
  • 收敛曲线平滑性:IoU随时间逐步增加并稳定,相邻帧的变化应 < 10%(真实头部运动是平滑的)
  • 最终对齐度:应该达到 > 0.6 IoU(用户会尽力对齐框)
  • 运动学一致性:计算人脸框心的速度与目标框的速度,两者应有高相关性(> 0.6)

(4) 伪造的检测特征

  • 预录视频:人脸框完全不动,或运动与目标框无关
  • AI实时生成:虽然能跟踪,但响应延迟 < 100ms(不符合生理规律)
  • 屏幕投影或视频换脸:运动是存在的,但运动学特征有瑕疵(加速度不自然、速度曲线不平滑)

防护优势

  • 多维度约束:IoU、中心偏差、关键点落点、运动学等多个维度
  • 实时性高:攻击者需要实时生成或预知相框参数
  • 难以离线预处理:每次挑战都是随机的

踩坑点

  • 相框不要太靠近屏幕边缘,用户体验会变差
  • 最好每次只变化一次,多次变化影响用户体验

4.4 帧周期/循环检测:对抗重放攻击中最常见的手法

核心思路:黑产的一个常见做法是循环播放录制的视频,以降低成本。虽然循环播放看起来是连贯的,但在计算机视觉的帧级别分析上会暴露出周期性的重复。通过检测这种周期性,可以识别出重放视频。

原理

  • 循环视频的特征

    • 通常每 N 帧就会出现一个完全相同或高度相似的帧
    • 如果视频是 30 帧录制的 5 秒钟内容循环播放,那么每 150 帧会重复一次
    • 在更细的层面上,人脸的姿态、表情、背景等会在固定周期内重复出现
  • 真实视频的特征

    • 由于视频是实时拍摄,帧之间总是存在连续的微小变化(光线、人脸微动、背景变化等)
    • 相邻帧之间的差异虽然很小,但不会形成完美的周期性重复
    • 即使用户在做重复动作(如眨眼),也不会让整个画面完全相同

实现细节

(1) 多维特征提取
每一帧提取多个维度的特征,用于周期性检测:

  • 直方图:Y通道的亮度分布(对光线变化敏感)
  • LBP纹理:皮肤纹理的局部特性(难以伪造)
  • 人脸关键点:68个面部landmark的坐标(几何约束)
  • 平均亮度与方差:全帧的亮度统计(补充直方图)

(2) 周期性检测算法

  • 维护一个滑动缓冲区(这个决定了能识别的周期长度)
  • 对于每个候选周期长度,计算第 i 帧与第 i-period 帧的特征相似度
  • 如果相似度 > 0.85 的帧数超过总帧数的95%,判定为周期重复

(3) 特征相似度计算(加权融合)

  • 直方图相似度(权重40%):使用Bhattacharyya系数
  • LBP纹理相似度(权重25%):纹理直方图比较
  • 关键点相似度(权重20%):68个关键点的欧氏距离
  • 亮度相似度(权重15%):平均亮度的差异
  • 最终相似度 = 加权平均

防护优势

  • 难以规避的特征:只要是循环重放,迟早会暴露出周期性
  • 多层次检测:直方图、纹理、关键点、亮度多维度同时检测
  • 与其他检测联动:当循环检测配合4.1-4.3的行为挑战,黑产几乎无法突破

踩坑点

  • 对算法功底要求高,需要谨慎防止线上误报

4.5 帧连续性检测:对抗手动切换视频/视频拼接

核心思路:攻击者在某些场景下可能不是一直播放同一个循环视频,而是根据不同的检测阶段手动切换或动态拼接不同的视频段。例如:

  • 初始阶段播放"看起来正常"的人脸视频
  • 人脸识别通过后,切换到"符合行为挑战"的精心制作的视频
  • 在不同的识别步骤之间,切换不同的视频源

原理

  • 真实视频的连续性特征

    • 同一个人的视频是连贯的,人脸的面部纹理、皮肤特征、微表情、头部运动等都有"记忆性"
    • 人脸的肤色、光照反应、表情肌肉的反应都是基于同一个生物体的物理特性
    • 即使视频中间暂停(用户眨眼、移开镜头),恢复时人脸的特征应该是一致的
  • 视频切换的弱点

    • 不同的视频源可能有微妙的差异(拍摄时间、光源、手机型号、摄像头参数等)
    • 切换点可能出现不自然的"跳变"(即使在视觉上不明显)
    • 人脸的"生物指纹"(皮肤纹理、痣、疤痕等)在切换时可能出现变化

实现细节

(1) 人脸生物指纹提取
从人脸图像中提取难以伪造的稳定特征:

  • 皮肤纹理哈希:使用拉普拉斯滤波提取高频纹理,计算纹理特征的哈希值
  • 特定区域特征:鼻梁、额头等区域的LBP或SIFT特征(这些区域的痣、疤痕等具有唯一性)
  • 肤色分析:RGB色彩空间中的肤色分布统计

(2) 相邻帧连续性检测

  • 对每一帧提取生物指纹
  • 计算相邻帧指纹的距离(欧氏距离或余弦相似度)
  • 正常情况:同一真实视频中,相邻帧的指纹距离应该 < 0.05(平稳变化)
  • 异常情况:不同视频源的切换会导致距离 > 0.15(急剧跳变)

(3) 时间序列异常检测

  • 收集整个序列的所有指纹距离
  • 计算均值和标准差
  • 使用3-sigma规则识别异常值(距离 > 均值 + 3×标准差)
  • 异常值的出现表明可能发生了视频切换

(4) 元数据交叉验证

  • 从摄像头metadata中获取:exposure_time、ISO、color_correction_matrix等
  • 这些参数在真实视频中应该平稳变化,在视频切换时会出现突变
  • 如果生物指纹异常AND元数据异常同时出现,则高置信度判定为视频切换

(5) 切换点的特征

  • 人脸纹理特征急剧变化(不同光源、不同摄像头)
  • 肤色分布不同(不同场景的光线条件)
  • 摄像头参数跳变(exposure_time、ISO不连贯)

防护优势

  • 多源验证:结合人脸特征和摄像头metadata,难以完全一致地拼接
  • 与其他检测联动:当多个维度都检测到异常时,可信度大幅提升
  • 可对抗AI实时抠图换脸:当算法可靠时效果显著

踩坑点

  • 对算法功底要求高,需要谨慎防止线上误报

5. 最终章:多维度融合决策架构

前面 4 章我们分别给出了 5 类“物理约束证据”。真正上线时,不要押宝于某一个维度稳定:弱光、抖动、遮挡、低端机 ISP、掉帧都会让单点策略误报/漏报。

因此最终方案必须满足两点:

  • 能对抗:系统级注入 / 重放 / 拼接在多维约束下持续暴露
  • 能运营:误报可控、可解释、可回滚、可按机型/场景调参

本章给出一套可以工程落地的融合框架参考实现:
“每维打分 + 质量门控 + 加权 log-odds 融合 + 业务分流”


5.1 融合输入:统一成「得分 + 质量 + 诊断信息」

五个维度分别输出统一结构,便于做融合与线上排障:

  • D1:IMU–Vision 同步一致性
  • D2:光学响应(白平衡/曝光扰动)
  • D3:随机相框跟随(空间挑战)
  • D4:帧周期/循环(重放)
  • D5:帧连续性/拼接(切换/拼接)

每个维度输出:

  • score_i ∈ [0, 1]:异常程度(越大越像 Fake)
  • quality_i ∈ [0, 1]:该维度当前是否可信(弱光/遮挡/掉帧/抖动会降低)
  • meta_i:诊断字段(用于解释与复盘,例如:相关系数、时延、周期长度、突变点等)

工程建议:每个维度都要输出 quality_i及结合本身业务埋点,用于线上排障,可以感知误报原因


5.2 融合核心:不能「概率连乘」,改用「加权 log-odds」

把每个维度理解成提供一条证据,证据强度用似然比(Likelihood Ratio, LR)表达最方便:

  • LR_i(score_i):该分数在 Fake 上出现的相对概率 / 在 Real 上出现的相对概率

直接把 LR 连乘会遇到两个典型线上问题:

  1. 数值不稳定(连乘会导致后期验动不动 0.99+)
  2. 证据不独立(误报的共同因子:弱光/抖动/ISP 震荡/用户动作),会“重复计票”导致误报

工程上更稳的做法:把所有证据转到 log-odds 空间加权相加

先验风险 P0(可按业务/地区/黑名单等级设置,默认可用 0.1~0.2):

1
2
3
4
5
logit(P0) = ln(P0 / (1 - P0))
 
logit(P)  = logit(P0) + Σ [ w_i * quality_i * log(LR_i(score_i)) ]
 
P         = 1 / (1 + exp(-logit(P)))

参数说明:

  • w_i:该维度权重(处理“相关性/重复计票”的关键旋钮,也是你最重要的调参点)
  • quality_i:质量门控,质量差时让该维度降低权重

5.3 证据映射:score → logLR(先用「分桶查表」快速上线)

上线后需要时间采集足够数据拟合完整分布。所以可以用分桶查表

  1. 对每个维度,把 score_i 划分为 5~10 个桶(例如 0-0.1, 0.1-0.2 ...)
  2. 用历史样本(真实用户 + 已知攻击)统计每个桶的:
    • p_fake_bin = P(score 落在该桶 | Fake)
    • p_real_bin = P(score 落在该桶 | Real)
  3. 计算该桶的:
    • logLR_bin = ln( (p_fake_bin + eps) / (p_real_bin + eps) )

线上运行时:

  • 计算 score_i → 找到桶 → 取 logLR_bin
  • 再进入 5.2 的加权融合

5.4 相关性处理:避免「同一件事被多次记分」

五个维度并非独立,典型相关组:

  • {D1 IMU, D3 相框}:都与用户动作强相关
  • {D4 循环, D5 连续性}:重放/拼接常同时异常
  • {D2 光学} 在弱光/ISP 剧烈调整时可能与 D4/D5 同步波动

工程上至少做一种处理(推荐 A + B):

A) 权重降噪(最简单)

  • 给相关性强的维度设置更小的 w_i
  • 例如:w4, w5 不要都很大,否则重放时会“重复计分,4和5算法原理其实类似,容易一起误报”

B) 组内聚合(更稳)

把相关维度组先聚合再进入融合:

1
2
E_loop   = max( logLR4, logLR5 )   // 重放/拼接组
E_motion = max( logLR1, logLR3 )   // 动作一致性组(可选)

然后:

1
2
3
4
logit(P) = logit(P0)
         + w_loop   * q_loop   * E_loop
         + w_motion * q_motion * E_motion
         + w_light  * q2       * logLR2

5.5 决策分流:ACCEPT / UNCERTAIN / REJECT

不要用“≥2维/≥3维异常”这种硬规则,就无法动态适应了,(此处有吐槽,很多产品白皮书所谓的设备指纹模型,相似度算法,最后往往还是强因子做决策)。
建议以 后验概率 P + 强证据触发 来分流:

5.5.1 强证据直拒(少量但极强)

满足任一即可 REJECT:

  • P ≥ 0.95 且存在任一维度 logLR_i ≥ T_strong
  • 或重放/拼接组 E_loop ≥ T_loop_strong

好处:攻击很“硬”的时候,不需要凑齐 2/3 个维度,也能稳定拦截。

5.5.2 组合证据拒绝(多维一致)

  • P ≥ 0.85有效证据数 ≥ 2
    • 有效证据指:quality_i ≥ q_minlogLR_i 超过最小阈值

5.5.3 模糊区二次验证(控误报关键)

  • 0.60 ≤ P < 0.85 → UNCERTAIN(触发二次验证)

二次验证建议谨慎,会影响用户体验,可以进入人工复核,后置处理,或者本次登陆降权,关键业务辅助其他验证:

  • 若 D2 质量差(弱光)→ 走 D1+D3(动作一致性)优先
  • 若 D1 质量差(抖动/传感器噪声)→ 走 D2 + (D4/D5)(光学 + 时序)优先

5.5.4 放行

  • P < 0.60 → ACCEPT

登录/实名/支付/提额等业务的误拒成本不同,建议按业务线配置 P0 与阈值。


5.6 动态修改权重

融合想稳,必须根据不同环境给予不同权重,例如:

  • 弱光:环境光低 / 画面噪声高 → 降低 D2(光学响应)权重或 quality
  • 掉帧:帧间隔抖动大 → 降低 D4(循环检测)的质量(否则周期检测易误判)
  • 遮挡:人脸框不稳定、关键点置信低 → 降低 D3/D5 的质量
  • 传感器:陀螺仪噪声大、采样不连续 → 降低 D1 的质量

工程实现建议:

  • quality_i “需要线上数据支持后再打分”,让其是具有可解释的最小值/乘积
  • 每次输出 meta_i 带上 quality 下降原因(便于线上排障)

5.7 线上运营:

融合能不能长期稳定,取决于监控与回归:

  1. FPR(真实误拒率):按机型 / Android 版本 / 光照分桶
  2. UNCERTAIN 触发率:过高意味着阈值太严或某维不稳
  3. score 分布漂移:上线前期,任一维度 score_i 分布漂移都需要关注

建议上线策略:

  • 先灰度 UNCERTAIN(只做二次验证,不直拒)→ 稳定后再开 REJECT
  • 新机型/新系统版本默认保守阈值,积累数据后再提升阈值

5.8 为什么这样更难被绕过

攻击者要骗过的不再是“某个检测点”,而是一系列联动:

  • 视觉(人脸运动、纹理连续)
  • 传感器(与人脸同步)
  • 光学响应(白平衡/曝光扰动)
  • 时序规律(循环与周期)

并且融合层通过 权重/组内聚合 限制“重复计票”,既保证对攻击敏感,又能把误报压住。

技术解决不了100%的问题,一个良好的运营策略,配合业务场景,才能让人脸场景的成本降到最低,对于用户画像良好的账户,出现一次异常,应该谨慎看待是误报还是注入,现阶段的黑产对抗,不是单一点的对抗,是看谁家对用户画像画的足够精准。

这就是"魔法打败魔法"——用算法对抗算法,用模型对抗模型。

6. AI和人脸攻防展望

6.1 AI和人脸攻防展望:从"系统攻防"到"模型博弈"

如果说前四个阶段(Hook/ROM/注入)是**"系统级"的对抗,那么接下来的第五阶段,我们将进入"模型级"的博弈——即AIGC(生成式AI)与鉴伪AI的直接碰撞**。

6.1.1 攻击侧演进:实时化AIGC注入

目前的注入攻击多依赖“预录制视频”,在交互式挑战(如:随机相框、炫彩)面前容易露馅。但未来的威胁在于 “实时 AIGC 渲染”

  • 低延时驱动: 黑产正在优化 GAN 和 Diffusion 模型的推理速度。一旦端侧推理延时降低到 100ms 以内,攻击者就能截取 App 下发的指令(如“向左转头”),实时生成对应的动作帧并注入。
  • 语义级伪造: 不再是简单的像素搬运,而是基于语义的生成。攻击者通过 Hook 这里的 Challenge 信号,直接喂给 AI 模型生成对应的 Response 视频流。

6.1.2 防守侧演进:AI对抗AI(AdversarialDefense)

面对生成的完美图像,传统的 CV 算法(如 LBP、直方图)可能失效,我们需要用魔法打败魔法:

  • 频域伪造检测: 生成式 AI 生成的图像在空间域(肉眼)极其逼真,但在频域(Frequency Domain)往往存在异常的伪影(Artifacts)。未来的检测将更多利用 FFT(快速傅里叶变换)分析高频信息的丢失或异常分布。
  • 微表情与生理特征: AIGC 目前很难完美模拟人类的非自主微表情(Micro-expressions)和面部血液灌注引起的细微肤色变化(rPPG 心率检测)。这两个维度将是区分“硅基人脸”与“碳基人脸”的最后防线。
  • 多模态一致性(Audio-Visual): 结合音频。真实的说话过程,口型、面部肌肉牵动与声音的共振具有极其复杂的物理相关性,目前的 AI 很难在实时流中做到完美的音画同步与肌肉物理仿真。

6.1.3 终极信任:回归硬件(Attestation)

软件层面的“图灵测试”总有被绕过的一天。在 AI 攻防的尽头,信任锚点必须下沉:

  • TEE/SE 签名: 无论视频流多么逼真,如果生成它的设备无法提供由硬件根密钥签名的 Attestation 报告(证明 Bootloader 锁定、系统未被篡改),则一律视为不可信。
  • C2PA 标准: 推动内容来源与真实性认证标准,让摄像头在采集画面的瞬间打上硬件级数字签名,确保数据从 Sensor 到 Server 的全链路未被篡改。

7. 总结

这里的实现仅为抛砖引玉,涉及到图像深层次处理的模型或者算法仅基于个人能力实现,所以具体用到的模型及算法未展开讲究。大家如果有更合适的模型或者算法适用于这几个场景,希望大家评论区指正和分享经验,大家一起讨论,共同进步!

参考资源与开源项目

  • LSPlant
    023K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6x3f1#2m8G2M7$3g2V1i4K6u0r3e0q4y4b7L8r3q4F1N6l9`.`.

  • LSPosed
    2feK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6x3f1#2m8G2M7$3g2V1i4K6u0r3e0q4y4b7L8%4y4W2k6l9`.`.

  • Frida
    b3cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6X3M7X3W2V1j5g2)9J5c8X3k6J5K9h3c8S2

  • android_virtual_cam
    6bfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6%4x3U0l9I4y4U0f1$3x3e0f1K6y4W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4y4h3k6$3K9i4u0@1N6h3q4D9i4K6g2X3j5$3q4E0

  • OpenCV
    d25K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6G2M7r3g2F1j5%4k6Q4x3V1k6G2M7r3g2F1j5%4j5`.


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 22
支持
分享
最新回复 (15)
雪    币: 1916
活跃值: (1841)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
666
18小时前
0
雪    币: 5397
活跃值: (15848)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
3
顶一下
18小时前
0
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
6
18小时前
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
666
18小时前
0
雪    币: 3
活跃值: (155)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
火钳留名
18小时前
0
雪    币: 2392
活跃值: (3071)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
666
18小时前
0
雪    币: 924
活跃值: (2075)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
火钳留名
18小时前
0
雪    币: 233
活跃值: (1288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
火钳留名
17小时前
0
雪    币: 1152
活跃值: (6600)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
cameraserver 可以注入的点太多了 16我看也有很多实现的
17小时前
0
雪    币: 7319
活跃值: (23944)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
11
文章总结的很不错, 点赞! 底层注入工具的发展和AI活化技术都使得以往的多动作和随机炫彩带来了挑战, 侧信道的各类方案也面临众多机型兼容和 性能与安全的平衡挑战, 人脸攻防对抗也逐步依赖端安全和算法的强结合对抗.
17小时前
0
雪    币: 0
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
火钳留名
15小时前
0
雪    币: 0
活跃值: (88)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
666
15小时前
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
太强了师傅!
2小时前
0
雪    币: 1
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
6
2小时前
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
别卷了,黑灰产都开始地堆了
1小时前
0
游客
登录 | 注册 方可回帖
返回