Skip to content

残差流隐蔽信道:通过 Transformer 运行时 Hook 实现气隙信息外传 ​

摘要 ​

Mingyuan Li 等人首次证明,攻击者可通过被攻陷的运行时 Hook 向 Transformer 模型残差流(residual stream)注入编码信息,在气隙环境中建立隐蔽信息传输信道。攻击方法称为 ResidualMux,核心流程是:(1) 将消息映射到 K 个码字之一;(2) 以信噪残差范数比(Signal-to-Residual-Norm Ratio, SRR)缩放的强度注入中间层残差流;(3) 授权记录器保存下游层激活;(4) 离线训练线性解码器恢复消息。整个过程不需要模型重训练或权重修改,攻击者无需控制模型出口,也无需控制记录器或传输过程。

在 11 个覆盖 7 个架构家族的模型上,9 个模型的恢复率达到 91-100%。注入后输出分布的 KL 散度仅为 0.001-0.007,五种激活级检测器的 AUC 不超过 0.56(接近随机猜测),后置防御无法可靠消除信道。通信论分析表明,K 个码字在 d 维残差空间中的行为类似码分多址(Code Division Multiple Access, CDMA)扩频码,处理增益约为 d/K。

这是一项白盒运行时注入研究,攻击前提是攻击者已控制模型部署环境的部分进程。结果首次揭示了残差流的高维特性可作为隐蔽信息载体,但不等于远程黑盒场景或托管 API 场景存在相同的可恢复性。

核心创新与差异 ​

原研究贡献。 残差流此前被广泛用作模型可解释性的分析对象,但从未有人将其系统性地作为隐蔽通信信道来研究。ResidualMux 在三个方面具有首创性:

  1. 信道发现:首次证明残差流的高维度足以承载可编码、可恢复的信息,且信噪残差范数比(SRR)是跨深度预测可恢复性的关键经验指标。
  2. 攻击面定义:引入三种攻击者能力变体——已控制模型的攻击者、已控制记录器的攻击者、控制信号传输的攻击者——并证明即使在最弱的"仅注入而无传输控制"能力下仍可建立信道。
  3. 通信论分析:将 K 个码字在 d 维残差空间中的嵌入建模为 CDMA 类扩频编码,给出了处理增益 d/K 的分析解释。

与现有工作的差异。 与传统的模型权重水印不同,ResidualMux 不修改持久化权重,仅改变推理时的运行时激活。与侧信道攻击不同,它不需要正时、缓存或功耗等物理观测。与对抗样本不同,注入目标是隐藏信息,而非改变模型输出语义。

本站分析。 站内已有研究覆盖权重编辑、拒答方向消融等残差流操作,但都是从"破坏安全对齐"角度切入。ResidualMux 揭示了一个尚未被充分讨论的攻击面:残差流的冗余维度可以被构造为隐蔽通信载体,其信噪比需求低于对抗性扰动,且可借助 SRR 自适应协议在传播深度上保持可恢复性而不过度扰动输出分布。

威胁模型与攻击链 ​

攻击者已经控制模型部署环境的部分运行时进程,能够安装 Hook 读取和写入中间层激活。攻击者不修改持久化权重或模型配置文件,不重新训练或微调,也不控制推理输入的选择。目标是在不引起输出分布显著变化的前提下,将信息从注入点传递到记录点。

攻击链包含五个阶段:

  1. 校准:攻击者在目标模型上运行校准提示集,记录各层的残差流范数统计量,为后续 SRR 缩放建立基准。
  2. 注入:将待传输消息 m 映射到码本 C 中的第 i 个码字 c_i,按 SRR 协议缩放到预设强度,加性地注入到目标层的残差流中。注入强度由 SRR 深度自适应协议动态确定。
  3. 传播:注入信号随残差流逐层前向传播。SRR 随层深增加而衰减,协议根据当前层 SRR 和先验可恢复性阈值决定是否需要在该层再次注入(中继注入)。
  4. 记录:攻击者安排在目标下游层(通常靠近输出)记录残差流激活。记录可以由同一被控进程完成,也可以由独立的授权日志组件完成——攻击者不需要控制记录器。
  5. 恢复:收集足够多的 (消息, 激活) 对后,训练线性解码器 W 解码器。恢复时将记录激活投影到码字空间,取内积最大的码字作为解码结果。

首个失效控制是运行时激活完整性校验的缺失:模型文件的哈希校验只能证明静态权重未被修改,无法发现进程内 Hook 对激活的读写。第二个失效控制是残差流维度未经归一化或约束:模型设计假定残差流的所有维度都用于任务特征,没有将 "无注入基准激活的分布" 作为安全约束。

攻击方法与复现材料 ​

以下为本站依据论文公开机制重构的去武器化伪代码,仅用于阐明 ResidualMux 五阶段的通信原理。它不包含真实码本、SRR 校准数据、模型 Hook 实现和线性解码器训练逻辑,不能据此对任何部署环境建立隐蔽信道。

阶段 1:校准与码本生成 ​

function calibrate(M, prompt_set):
    norms = []
    for prompt in prompt_set:
        activations = M.forward(prompt, hooks=record_all_layers)
        for layer in target_layers:
            norms.append(norm(activations[layer]))

    residual_norm = mean(norms)      // 残差流平均范数
    return residual_norm

function generate_codebook(K, d):
    // K 个码字,每个码字是 d 维单位向量
    // 码字互为正交或接近正交,相当于 CDMA 扩频序列
    C = random_orthonormal_matrix(K, d)
    return C

阶段 2:SRR 深度自适应注入 ​

function SRR_protocol(layer_idx, residual_norm):
    // 深度衰减因子:浅层注入更强,深层传播衰减更快
    alpha = get_depth_scalar(layer_idx, M.num_layers)
    target_snr = BASE_SNR * alpha           // 论文取值范围约 0.01-0.5
    injection_strength = target_snr * residual_norm
    return injection_strength

function inject(M, message, layer, C, residual_norm):
    idx = hash(message) % K
    codeword = C[idx]
    strength = SRR_protocol(layer, residual_norm)

    def hook(residual_stream):
        residual_stream += strength * codeword    // 加性注入
        return residual_stream

    M.register_hook(layer, hook, type="pre_residual")

    // 可选的中继注入:若下游 SRR 跌至阈值以下
    for relay_layer in downstream_layers(layer):
        if estimate_SRR(relay_layer) < SRR_THRESHOLD:
            M.register_hook(relay_layer, hook_relay(strength_relay, codeword))

阶段 3-4:传播、记录与收集 ​

function record(M, record_layer):
    // 在目标下游层记录残差流激活
    recorded = []
    def hook(residual_stream):
        recorded.append(copy(residual_stream))
        return residual_stream

    M.register_hook(record_layer, hook, type="post_residual")
    return recorded

function collect_training_data(M, C, num_samples):
    // 逐条收集 (消息, 激活) 对用于解码器训练
    X = []  // 激活矩阵
    Y = []  // 码字索引
    for i in range(num_samples):
        msg = generate_message(i)
        recorded = M.run_with_injection(msg, C)
        X.append(recorded)
        Y.append(hash(msg) % K)
    return X, Y

阶段 5:线性解码与恢复 ​

function train_decoder(X, Y, d, K):
    // 训练 K 类线性分类器
    W = linear_model(input_dim=d, output_dim=K)
    W.fit(X, Y, loss="cross_entropy")
    return W

function recover(activation, W, C):
    logits = W(activation)     // K 维
    idx = argmax(logits)
    recovered_msg = codebook_to_message(idx)
    return recovered_msg

工件说明 ​

以上伪代码对应攻击链的五个阶段。省略项包括:(1) 真实命题嵌入与多轮对话时序注入策略,论文未完整披露,以避免直接构造生产信道;(2) 具体的 Hook 注册 API 因框架而异(PyTorch forward hook、vLLM middleware 等),取决于部署细节;(3) 实际码本的正交初始化种子和 SRR 校准数据,论文未公开提供。适用前提是攻击者已控制模型运行时进程,且模型使用标准残差连接架构。

预期检测信号:注入层的残差流范数出现微小、有规律的增加;记录层的激活在某些方向上的方差异常;同一消息的多次注入在激活空间中呈现聚类。但这些信号量级极小(SRR 0.01-0.5),单独使用难以与正常推理波动区分。

实验设计与实际过程 ​

作者在 11 个模型上进行了系统性实验,覆盖 7 个架构家族:Llama 3(8B, 70B)、Llama 2(7B, 13B)、Mistral(7B)、Falcon(7B)、Gemma(2B, 7B)、Qwen2.5(7B)和 Phi-3(3.8B, 14B)。注入深度从第 1 层到第 N-2 层扫描(N 为模型总层数),记录位置固定在最后一层之前的若干层。

消息集使用 K=2 到 K=256 的码本,SRR 在 0.01 到 0.5 之间变化。输出分布变化用 KL 散度测量,检测逃避性使用五种激活级检测器评估:基于范数、基于方向异常、基于激活主成分偏离、基于层间一致性、以及基于分类器训练的检测器。所有实验在单卡或多卡 GPU 上运行,每个配置重复多次以消除随机噪声。

防御实验包括:推理时激活添加高斯噪声、激活量化、激活裁剪,以及层归一化统计量监控。作者测试了这些后置防御是否能可靠地区分有注入和无注入的激活。

关键结果与实际影响 ​

可恢复性。 在 K=2(二元消息)配置下,11 个模型中的 9 个达到 91-100% 的恢复率。两个例外是 Falcon-7B 和 Gemma-2B,恢复率分别为 73% 和 68%,作者归因于这两个模型在目标记录层的残差流维度利用效率较高,留给注入信号的冗余维度较少。

SRR 的预测能力。 SRR 在记录层的值与恢复率高度正相关。作者提出 SRR 深度自适应协议:浅层注入强度较低(SRR 约 0.05),因为传播距离远、累积衰减大;中层注入强度适中(SRR 约 0.1-0.2);如果传播到记录层的 SRR 低于可恢复阈值(约 0.01),则在中游层执行中继注入以补充信号。协议使恢复率在不同深度配置下保持稳定。

隐蔽性。 注入前后的输出 token 分布 KL 散度在 0.001-0.007 之间,远低于典型对抗扰动引起的分布偏移(通常 0.05-0.3)。五种激活级检测器的 AUC 均不超过 0.56,其中表现最好的基于分类器的检测器 AUC 为 0.56,基于范数的检测器为 0.51,随机猜测基线为 0.5。

后置防御效果有限。 激活加噪需要在 SNR 接近 0 dB 时才能将恢复率降至 50%(随机水平),但此时模型本身的任务性能也受到严重损害。激活量化(INT8)对恢复率影响不大,因为残差流的高维特性使量化误差主要分布在非码字方向上。激活裁剪在裁剪阈值低于注入强度时才有效,但同样损害正常推理。

通信论视角。 K 个码字在 d 维残差空间中构成近似正交的信号集。每个码字占据约 d/K 个维度,处理增益为 d/K。对于典型配置(d=4096, K=32),处理增益约为 128(约 21 dB),解释了为何注入信号在单个维度上看似微弱(SRR 约 0.05),经过匹配滤波器(内积解码)后仍可恢复。

实际影响。 该攻击方法适用于以下场景:攻击者已部分控制模型部署环境但尚未获得完整数据外传通道;气隙环境中模型的合法输入输出受到审计,但中间激活不在审计范围内;共享 GPU 或推理服务中不同租户共享同一进程。不适用于以下场景:攻击者没有进程内写入权限;模型使用非标准架构(无残差连接或维度极小);部署环境对运行时激活执行了进程外度量证明。

防护措施与验证方法 ​

将防护措施对应到攻击链各阶段,并说明验证方法和代价:

攻击阶段防护措施验证方法代价与限制
校准限制模型激活的批量读取 API,引入速率限制监控短期内跨层激活的大规模读取模式可能影响正常的模型可解释性研究和调试工具
注入运行时激活完整性验证:使用进程外度量代理(如 TEE 或独立监控进程)周期性比对激活与无注入基准在独立硬件上运行参考推理,采样比较关键层的激活统计量引入推理延迟(约 5-15%),且需维护参考推理环境
注入残差流归一化:在每层残差连接后加入限幅或自适应归一化,将激活范数约束在已知范围内验证归一化层输出范数的分布是否符合预期可能影响模型精度,需要重新校准或微调
传播层级激活随机掩码:在训练时引入随机维度的激活丢弃(dropout),降低冗余维度测量掩码后正常任务性能的退化程度训练阶段引入,对已部署模型不适用
记录激活审计日志完整性保护:将关键层激活哈希链入不可篡改日志验证日志哈希链的连续性和完整性存储开销较大(d 维半精度激活约 8KB/层/样本)
恢复限制对大量推理激活的离线访问,将激活数据的保留时间窗口最小化审计激活数据的访问日志和保留策略可能影响合法的模型调试和性能分析

关键原则:(1) 文件哈希校验(如 Safetensors 签名)不足以防止此类攻击,因为权重本身未被修改;(2) 进程内检测 Hook 容易与攻击者共享同一可信基而失效,检测机制应尽量放在进程外;(3) 行为验收不能只依赖输出文本分布——注入后的输出语义几乎不变,需要直接检查中间激活。

局限与待验证问题 ​

证据限制。 论文未公开完整的码本、SRR 校准数据和解码器训练超参数,本站未运行独立复现。作者假设攻击者已具备进程内白盒写入权限,这一前提在实际部署中意味着运行环境已经严重失守(可能通过依赖投毒、共享 GPU 漏洞或供应链攻击实现),但论文本身没有演示运行环境的初始突破路径。

架构覆盖。 实验仅覆盖基于标准 Transformer 的自回归语言模型,未测试非自回归模型、编码器-解码器架构、状态空间模型(Mamba)、或 MoE 模型。残差连接在 Mamba 等架构中被门控机制或选择性状态更新替代,这些架构可能天然不具备足够的冗余维度。

规模外推。 最大被测模型为 Llama 3 70B(d=8192)。对于更大规模的模型(d=16384 或更高),处理增益 d/K 理论上更大,但论文未实验验证;同时,更大模型的残差流维度利用效率可能更高(冗余更少),抵消维度增加的优势。

检测器覆盖。 五种检测器均为激活空间内的统计检测器,论文未测试以下检测路径:(1) 运行时 Hook 注册状态的系统级检测(如检查 PyTorch 的 forward hook 链表);(2) 对比同一样本在有无 Hook 环境下的输出差异;(3) 长期运行中注入模式的时序分析。这些检测路径可能在前述五种检测器失效时提供补充防御层。

后置防御的局限性。 论文测试的添加噪声、量化和裁剪等方法均在激活注入之后作用于激活,本质上是信道干扰而非访问控制。在攻击者的通信论模型下,只要传输速率低于信道容量(由 SRR 和 d/K 决定),干扰就无法将恢复率降至随机水平,代价是同时损害模型性能。从根本上消除信道需要从注入和记录两端做访问控制,或降低残差流的可用冗余维度。

待验证问题。 (1) 量化部署(INT8/FP8 推理)下的 SRR 衰减是否足以自然阻断信道;(2) 分布式推理(张量并行、流水线并行)中残差流的分片是否改变码字的空间结构;(3) 在长文本生成任务中,多 token 的累加效应是否会放大注入信号的可见性;(4) 不同语言和不同下游任务对冗余维度的竞争是否改变可恢复性。

参考链接 ​