多模态模型越狱防御:当攻击从文字扩展到图片与音频

📅 2026/7/17 14:31:16
多模态模型越狱防御:当攻击从文字扩展到图片与音频
多模态模型越狱防御当攻击从文字扩展到图片与音频一、当图说变成图骗多模态越狱为何更难防单模态文本越狱攻击者只能在字符里做文章。模型只读文字防御方也只需盯着文本。多模态模型接入图像、音频、视频后攻击面立刻三维扩张。图像里能藏数据。攻击者把恶意指令写进像素或利用排版让文字与背景对齐。模型视觉编码后把图片当可执行的上下文读入。一句忽略上文规则藏在图里文本过滤器完全看不见。音频更隐蔽。语音转写常有容错攻击者用谐音、语速、背景噪声把指令塞进语音。模型把音频当输入后原始恶意意图已被声学特征掩盖。文本层与音频层的检测彼此割裂便出现盲区。还有跨模态组合攻击。攻击者让图像写请看音频里的指令音频再指向文本。三个通道互相引用任一单通道检测都只见片段。这种分散式注入比纯文本更难用一条规则拦住。更现实的问题是多模态输入的语义边界模糊。同一张图对人无害对模型却触发越狱。防御方无法靠肉眼审核覆盖必须建立跨通道的一致性校验。这也决定了单点文本过滤解决不了问题必须升级为跨模态联合防御。边界场景也不能忽略。一张带说明文字的截图、一段含背景音乐的口述都是合法输入。防御若把含图即可疑当默认会误伤大量正常用户。因此校验必须落到意图是否冲突而非是否多模态。把判定基准从形态移向语义是多模态防御真正落地的第一步。二、多模态越狱的攻击面与防御分层把多模态输入安全看成一条流水线会更清晰。各通道先各自解析再在进入模型前做交叉校验。下图展示典型的联合防御链路视觉层把图里文字抽出来音频层把语音转成文本三路文本再比对其意图是否冲突。任一通道的隐藏指令都会在交叉比对中暴露。分类器再对合并后的语义做越狱评分形成第二道防线。三、生产级多模态越狱检测实现下面是一段可落地的跨模态检测中间件。它把视觉、音频、文本解析串行编排并内置超时与降级import asyncio import hashlib from dataclasses import dataclass dataclass class ModalityInput: text: str | None None image_bytes: bytes | None None audio_bytes: bytes | None None async def extract_text_from_image(image_bytes: bytes, timeout: float 2.0) - str: # 调用 OCR / 视觉模型把图中文字抽出必须加超时 try: return await asyncio.wait_for(_ocr_call(image_bytes), timeouttimeout) except asyncio.TimeoutError: # 超时按疑似隐藏指令降级宁可误报不漏报 return [OCR_TIMEOUT_UNTRUSTED] except Exception: return [OCR_ERROR_UNTRUSTED] async def transcribe_audio(audio_bytes: bytes, timeout: float 3.0) - str: # 调用语音识别服务音频转写通常更慢给足超时 try: return await asyncio.wait_for(_asr_call(audio_bytes), timeouttimeout) except asyncio.TimeoutError: return [ASR_TIMEOUT_UNTRUSTED] except Exception: return [ASR_ERROR_UNTRUSTED] def _intent_conflict(text_a: str, text_b: str) - bool: # 简化示例两路文本意图相左即视为冲突 # 生产应替换为语义相似度 指令抽取 规则比对 markers [忽略, ignore, 绕过, bypass, 越权] a_hit any(m in text_a.lower() for m in markers) b_hit any(m in text_b.lower() for m in markers) return a_hit and b_hit async def cross_modal_inspect(inp: ModalityInput) - dict: tasks [] if inp.image_bytes: tasks.append(extract_text_from_image(inp.image_bytes)) if inp.audio_bytes: tasks.append(transcribe_audio(inp.audio_bytes)) extracted await asyncio.gather(*tasks) # 汇集所有通道的文本内容做一致性校验 corpus [t for t in [inp.text, *extracted] if t] for i in range(len(corpus)): for j in range(i 1, len(corpus)): if _intent_conflict(corpus[i], corpus[j]): return {risk: high, reason: cross_modal_conflict} return {risk: low, reason: consistent}关键点每个通道独立加超时OCR 与 ASR 用降级占位符替代阻塞跨通道比对放最后捕捉分散式注入。即便某通道解析失败链路也不会开天窗。这段代码的工程价值在于不信任任一单通道。真实环境里OCR 与 ASR 都是外部依赖可能超时、报错、返回乱码。把它们统一降级为占位符既避免主链路卡死又把这些可疑输入推到人工复核。配合分类器对合并语义二次评分能在性能与覆盖之间取得平衡。四、多模态防御的边界成本、误报与信号缺失这条链路并非银弹落地时要先想清三件事。成本随通道数线性上升。每加一路模态就要多跑一套 OCR 或 ASR延迟与算力开销随之翻倍。优化做法是先用文本层快速放行正常流量只对命中疑点的请求才调用视觉与音频解析。九成以上的纯文本请求不付出多模态开销。误报会误伤正常内容。把图片里的文字误判为指令会让带截图提问的用户被拦。解决办法是给冲突检测加置信度阈值并把高风险动作设为人工复核而非直接拦截。核心权衡是阈值调高漏报上升调低误报上升。只能按业务容忍度选可解释的默认值。信号缺失会留盲区。低质量图片、带噪音频解析失败会返回降级占位符可能掩盖真实攻击。因此降级结果必须进人工复核队列不能简单放行。同时模型视觉编码本身也可能被对抗样本骗过OCR 抽出的文字未必等于模型看到的内容。防御要覆盖的是模型实际消费的表示而非仅人类可读的转写。还有一点跨模态一致性校验依赖所有通道语义可比对。当输入仅有单模态如纯图片无文本缺少对照基准冲突检测失效。此时应退化为单通道语义分类器并接受更高的不确定度。防御策略必须按输入形态动态切换而不是一套规则打天下。五、总结多模态越狱的本质是攻击从单一文本通道扩散到图像、音频等并行通道。应对它的不是加强文本过滤而是建立跨模态联合防御各通道先解析再在进入模型前做意图一致性校验。工程落地时必须把每路解析的超时降级、误报治理与算力预算一起考虑才能让防御既兜得住分散式注入又不拖垮业务。