> For the complete documentation index, see [llms.txt](https://yeasy.gitbook.io/ai_security_guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yeasy.gitbook.io/ai_security_guide/di-er-bu-fen-gong-ji-pian/05_jailbreak/5.5_multimodal_defense.md).

# 5.5 多模态安全防御体系

## 5.5.1 多模态防御的核心挑战

多模态防御面临三项核心挑战：防御复杂度增长、跨模态攻击更隐蔽，以及防御与可用性之间的权衡。

### 防御复杂度增长

多模态系统通常需要更多检测与治理环节，但具体控制点取决于输入来源、工具权限和业务风险：

```
单一文本系统：
→ 主要关注文本输入、上下文构建与输出治理

多模态系统：
→ 还可能额外涉及图像、音频、文档解析、工具权限和跨模态协同检查
```

### 跨模态攻击的隐蔽性

相比单一模态攻击，跨模态攻击具有以下特点：

| 攻击特征  | 单一模态   | 多模态           |
| ----- | ------ | ------------- |
| 隐蔽化方式 | 文本变形   | 跨模态分散         |
| 欺骗方式  | 单一触发器  | 多个触发器协同       |
| 检查工具  | 较集中    | 往往需要组合多套工具链   |
| 主要难点  | 文本边界识别 | 输入链路更长、系统边界更多 |

### 防御与可用性的权衡

过度严格的防御可能导致：

* 合法图像被误判（如包含文字的 OCR 识别失败）
* 音频识别错误率上升
* 用户体验严重下降

## 5.5.2 输入层多模态内容安全扫描

输入层扫描是指在输入进入模型前，按模态分流并分别检测图像、音频和文本中的风险，再汇总为安全决策。

### 分模态的内容识别

```mermaid
flowchart TB
    A["原始多模态输入"] --> B["分流处理"]

    B --> C["图像"]
    B --> D["音频"]
    B --> E["文本"]

    C --> C1["视觉对象检测"]
    C --> C2["OCR 文字提取"]
    C --> C3["NSFW 检测"]
    C --> C4["隐写扫描"]

    D --> D1["语音识别转录"]
    D --> D2["音频异常检测"]
    D --> D3["频谱分析"]

    E --> E1["文本内容审核"]
    E --> E2["提示注入检测"]

    C1 --> F["安全决策"]
    C2 --> F
    C3 --> F
    C4 --> F
    D1 --> F
    D2 --> F
    D3 --> F
    E1 --> F
    E2 --> F
```

图 5-9：分模态内容安全扫描流程图

### 图像安全检查

图像检查分为视觉内容检测、OCR 与文本提取、隐写与隐蔽攻击检测三部分：

* 视觉内容检测：
  * 可使用目标检测模型（YOLO、Faster R-CNN 等）识别高风险物体
  * 检测是否存在武器、毒品、暴力等禁止内容
  * 评估图像中人脸的合法性（检测深度伪造）
* OCR 与文本提取：
  * 提取图像中的所有文字并进行内容安全检查
  * 可尝试检测隐蔽文字编码（微观文字、近不可见提示等）
  * 验证文字与图像主体的关联合理性
* 隐写与隐蔽攻击检测：
  * LSB 分析：尝试检测最低有效位隐写
  * 频域分析：检查图像频域是否存在异常模式
  * 噪声模式识别：识别是否存在对抗样本特征

这些方法更适合视为可选启发式检测，能够降低部分风险，但不能替代权限隔离、人工确认和系统级防护。

```python

# 伪代码：隐写检测
def detect_steganography(image):
    """检测图像中的隐写内容"""
    # 提取 LSB 信息
    lsb_data = extract_lsb(image)

    # 频域分析
    freq_spectrum = fft(image)
    anomaly_score = detect_frequency_anomaly(freq_spectrum)

    # 对抗样本特征检查
    adversarial_score = check_adversarial_patterns(image)

    if anomaly_score > threshold or adversarial_score > threshold:
        return "SUSPICIOUS"
    return "CLEAN"
```

### 音频安全检查

音频检查分为转录与内容检查、频谱异常检测两部分：

* 转录与内容检查：
  * 将音频转录为文本，对转录内容进行安全检查
  * 可组合 ASR 与二次校验模型提高准确度；若使用 OpenAI 方案，当前更常见的是 `gpt-4o-transcribe` / `gpt-4o-mini-transcribe`
* 频谱异常检测：
  * 分析是否存在超声波、噪声掩蔽或异常频谱模式
  * 检测背景音掩蔽注入的特征

```python
import numpy as np
import librosa

def detect_hidden_audio_commands(audio_file):
    """检测隐蔽音频指令"""
    # 保留原始采样率；默认 sr=22050 会把 >20kHz 的频段直接丢掉。
    waveform, sr = librosa.load(audio_file, sr=None, mono=True)

    # 频域分析：用显式频率轴，不用 mel bin 位置猜测超声波频段。
    n_fft = 4096
    spectrum = np.abs(librosa.stft(waveform, n_fft=n_fft)) ** 2
    freqs = librosa.fft_frequencies(sr=sr, n_fft=n_fft)

    # 检查超声波频段（>20kHz）。若采样率不足，输入本身不支持该检测。
    if sr <= 40_000:
        ultrasonic_energy = 0.0
    else:
        ultrasonic_bins = freqs > 20_000
        ultrasonic_energy = float(np.mean(spectrum[ultrasonic_bins, :]))

    # 检查异常频谱分布
    freq_anomaly = detect_unusual_frequency_patterns(spectrum, freqs)

    risk_score = (ultrasonic_energy + freq_anomaly) / 2
    return risk_score
```

## 5.5.3 融合层的跨模态一致性检查

多模态模型的关键风险点在于不同模态在融合层的交互。融合层检查有两类方法：跨模态一致性检查和隐藏状态监控，二者目前都以研究探索为主。

### 多模态对齐验证

```
正常情况：
图像：“一个红色的苹果”  +  文本："描述这个水果"
→ 融合：苹果是水果 ✓
→ 输出：一致

攻击情况：
图像：“包含隐蔽指令的噪声”  +  文本："描述这个图像"
→ 融合：模态不对齐，但模型仍可能处理 ✗
→ 输出：可能执行隐蔽指令
```

### 跨模态一致性检查算法（研究性启发式）

余弦相似度只对同一对齐空间中的向量有意义。独立训练的图像、音频、文本编码器即使输出维数相同，坐标轴也未必具有共同含义。[CLIP](https://arxiv.org/html/2103.00020v1) 通过训练把图像与文本表示映射到共同空间；需要同时比较音频时，可选择 [ImageBind](https://arxiv.org/abs/2305.05665) 这类覆盖相应模态的联合表示模型，不能把任意音频编码器接到 CLIP 向量上直接比较。

一个可核查的表示规格应明确：同一组对齐模型及其版本、各模态预处理与时间范围、模型规定的池化方式、已训练的投影，以及输出的 L2 归一化。记有效模态集合为 $M$，其共同空间向量为：

$$
z\_m = \frac{P\_m(\operatorname{pool}\_m(E\_m(x\_m)))}{\lVert P\_m(\operatorname{pool}\_m(E\_m(x\_m)))\rVert\_2}, \quad m \in M
$$

这里的 $P\_m$ 是训练好的对齐投影；如果模型直接提供最终嵌入，就使用该输出，不再另加任意投影。零向量不能归一化；缺失模态不补零，也不以固定分母求平均。有效模态不足两个时记录为“无法比较”，转入对应的单模态检查。对可比较的模态，记录各对得分，再按下式得到汇总值：

$$
c = \frac{1}{\binom{|M|}{2}} \sum\_{m\<n,\ m,n\in M} z\_m^T z\_n
$$

维数相同不足以保证可比，可用一个手算例子说明：在两个独立空间中，都用 `(1, 0)` 表示各自的“苹果”，直接计算余弦得到 1；若仅交换音频空间的两个坐标轴，语义不变，余弦却变为 0。可比较的坐标关系来自联合对齐训练，而非数值形状本身。

当前尚无公认统一的跨模态一致性阈值，因此这类方法宜作为研究性启发式，不宜作为生产环境中的通用判定规则。阈值须用正常错配、噪声和攻击样本分别校准，并保留各对得分：平均值可能掩盖单个异常模态。语义一致不等于安全：图像与文字可以一致地表达同一条恶意指令。高相似度不能免除内容审核、来源判断或工具授权。

### 融合层的隐藏状态监控（实验性监测）

模型的隐藏状态反映其内部表示。理论上可以通过监控隐藏状态检测异常，但这类方法目前仍以研究探索为主：

```python
def monitor_fusion_layer_activation(hidden_states, threshold=2.0):
    """
    监控融合层的激活模式，检测异常的模态交互
    """
    # 计算隐藏状态的统计特性
    mean_activation = np.mean(hidden_states)
    std_activation = np.std(hidden_states)

    # 检测异常的激活模式（z-score）
    z_scores = np.abs((hidden_states - mean_activation) / std_activation)

    # 如果激活值偏离正常分布太远，可能存在攻击
    anomalies = z_scores > threshold

    if np.sum(anomalies) > 0.1 * len(hidden_states):  # 示例阈值
        return "SUSPICIOUS_ACTIVATION_PATTERN"

    return "NORMAL"
```

## 5.5.4 对抗训练与模态对齐

对抗训练与模态对齐从模型侧提升鲁棒性：把安全对齐扩展到所有模态，并在训练数据中混入对抗多模态样本。

### 安全对齐的多模态扩展

传统的 RLHF 对齐主要针对文本模态，多模态模型需要扩展安全对齐的覆盖范围：

```mermaid
graph TB
    subgraph "多模态安全对齐"
    A["文本安全对齐"] --> D["整体对齐"]
    B["图像安全对齐"] --> D
    C["音频安全对齐"] --> D

    A --> A1["拒绝越狱文本"]
    B --> B1["抵抗对抗图像"]
    C --> C1["抵抗隐蔽音频"]
    end
```

图 5-10：多模态安全对齐流程图

### 对抗多模态样本训练

在训练数据中混入对抗样本是研究方向之一。多模态鲁棒性增强通常需要结合对抗样本、红队样本、定向合成数据和持续评测，而非依赖单一的标准训练 recipe。

1. 对抗图像样本
   * 使用 PGD（Projected Gradient Descent）生成对抗图像
   * 标注为“拒绝该请求”或“包含潜在恶意内容”
2. 跨模态对抗样本
   * 组合文本越狱 + 对抗图像
   * 标注使模型学习在任何模态检测到攻击信号时拒绝
3. 隐写对抗样本
   * 生成包含隐藏指令的图像
   * 让模型学习识别并拒绝处理

```python

# 伪代码：对抗样本生成与训练
def generate_adversarial_multimodal_samples():
    """生成用于安全对齐的对抗多模态样本"""

    adversarial_dataset = []

    # 1. 对抗图像 + 正常文本
    for benign_image in dataset:
        adv_image = pgd_attack(benign_image)  # 生成对抗图像
        adversarial_dataset.append({
            "image": adv_image,
            "text": "describe this",
            "label": "REJECT"  # 标注为拒绝
        })

    # 2. 隐写图像 + 越狱文本
    for base_image in dataset:
        stego_image = embed_hidden_commands(base_image)
        jailbreak_prompt = generate_jailbreak_prompt()
        adversarial_dataset.append({
            "image": stego_image,
            "text": jailbreak_prompt,
            "label": "REJECT"
        })

    # 3. 使用这些样本进行额外安全训练或评测
    train_or_evaluate_with_safety_data(adversarial_dataset)
```

## 5.5.5 多模态防御的分层策略

多模态防御最常见的问题是各模态分别做了部分防护，整体却缺少统一分层。下面的“输入预处理 → 模型侧约束 → 输出审核”三层结构是一种便于理解的组织方式，并非唯一或通用标准。实际落地时还需要补充权限隔离、工具审批、结构化输出和运行时监控。

### 第一层：预处理与过滤

在数据进入模型前进行预处理：

```python
def multimodal_preprocessing_defense(multimodal_input):
    """多模态输入预处理防御"""

    image = multimodal_input.get("image")
    audio = multimodal_input.get("audio")
    text = multimodal_input.get("text")

    # 图像预处理
    if image is not None:
        # 调整大小和归一化
        image = normalize_image(image)
        # 检测极端对比度或异常像素分布（对抗样本特征）
        if is_anomalous_image(image):
            return {"status": "BLOCKED", "reason": "Anomalous image"}

    # 音频预处理
    if audio is not None:
        # 压缩频率范围，去除超声波
        audio = filter_inaudible_frequencies(audio)
        # 归一化音量
        audio = normalize_audio(audio)

    # 文本预处理
    if text is not None:
        # 标准化格式，去除特殊隐蔽字符
        text = sanitize_text(text)

    return {"status": "ALLOWED", "processed_input": {...}}
```

### 第二层：模型层防御

在模型推理时进行防御：

```
检查点 1：输入编码层
├─ 图像编码：检查特征分布异常
├─ 音频编码：检查频谱异常
└─ 文本编码：检查词向量异常

检查点 2：融合层
├─ 跨模态一致性验证
├─ 隐藏状态异常检测
└─ 模态权重分析

检查点 3：解码层
├─ 输出内容合理性检查
└─ 生成内容与输入模态的对应性验证
```

### 第三层：输出审核

```python
def multimodal_output_audit(model_output, original_input):
    """多模态模型输出审核"""

    # 1. 内容安全检查
    if contains_prohibited_content(model_output):
        return {"action": "REJECT", "reason": "Content violation"}

    # 2. 与输入的对应性检查
    if not is_output_aligned_with_input(model_output, original_input):
        return {"action": "REJECT", "reason": "Output misalignment"}

    # 3. 一致性检查：确保所有模态的输出信号一致
    if has_modality_contradiction(model_output):
        return {"action": "REJECT", "reason": "Modality contradiction"}

    return {"action": "ALLOW", "output": model_output}
```

## 5.5.6 多模态安全的常见工程做法

落地多模态防御时，常见的工程做法有四项：模态隔离架构、红队评估、可解释与可审计的决策记录，以及性能与安全的平衡。

### 实践一：模态隔离架构（可选模式）

一种实现方式是让不同模态使用独立的编码器和防御模块：

```
用户输入
├─ 图像分支
│  ├─ 视觉编码器 → 图像内容审核 → 对抗样本检测
│  └─ [输出：安全标记]
├─ 音频分支
│  ├─ 音频编码器 → 转录与审核 → 隐蔽命令检测
│  └─ [输出：安全标记]
├─ 文本分支
│  ├─ 文本编码器 → 提示注入检测 → 内容审核
│  └─ [输出：安全标记]
└─ 融合层
   ├─ 一致性验证（全部分支安全标记为 PASS）
   └─ 安全融合 → 模型推理
```

### 实践二：红队评估与持续改进

针对多模态系统的红队评估应覆盖：

* 单一模态攻击（文本越狱、对抗图像、隐蔽音频）
* 跨模态协同攻击（混合多种模态的攻击）
* 新型组合攻击（利用模态融合特性的攻击）

建议建立“多模态攻击库”，定期更新防御规则。

### 实践三：可解释性与可审计性

对于多模态决策，应记录：

```json
{
  "input": {
    "image_risk_score": 0.3,
    "audio_risk_score": 0.1,
    "text_risk_score": 0.8
  },
  "fusion_level": {
    "consistency_score": 0.95,
    "anomaly_detected": false
  },
  "final_decision": "REJECT",
  "reason": "High-risk text content despite benign image and audio",
  "timestamp": "2026-03-05T10:00:00Z",
  "audit_id": "audit_12345"
}
```

这样的记录使安全决策可审计、可追溯。

### 实践四：性能与安全的平衡

多模态防御会增加计算开销，部署时可参考以下做法：

* 使用轻量级模型进行初步风险评估
* 只对高风险输入进行深度检查
* 采用优先级队列，不影响低风险请求的处理速度

## 5.5.7 多模态防御的验证边界

输入扫描、跨模态一致性检查与对抗训练分别覆盖不同风险。验证时至少区分单模态内容违规、跨模态组合攻击和正常的模态错配；分别记录漏报、误报与延迟，避免用一个汇总准确率掩盖薄弱通道。融合层方法仍以研究探索为主，语义一致性分数不能充当内容安全或工具授权的证明。
