基于硬件侧信道的模型权重推断风险分析与防御建议

封面信息图

随着大型语言模型与专有大模型资产向端侧边缘设备、异构云端 GPU 集群及多租户虚拟化环境的大规模渗透,模型权重(Weights)与模型架构(Hyperparameters)已成为核心商业资产。传统的安全防御侧重于操作系统隔离、模型文件静态加密和 API 访问控制。

然而,在物理接触、共租物理机或微架构资源共享的场景下,基于硬件物理特征的侧信道攻击(Hardware Side-Channel Attacks)正在打破传统软件安全边界。攻击者通过监测 GPU/NPU 运行时的功耗波动(Power Analysis)、电磁辐射(EM)、内存总线时序差异以及微架构缓存命中状态,能够高精度反推网络层数、神经元维度,甚至精准恢复浮点权重矩阵。

硬件侧信道推断模型权重的核心机理

┌─────────────────────────────────────────────────────────────┐
│                    目标设备硬件层 (GPU/NPU)                 │
│                                                             │
│   [矩阵乘法单元 (Tensor Core)]  ──(浮点计算功耗与时序波动)──┐
│   [高速片上缓存 (SRAM/L2 Cache)] ──(缓存行命中/未命中竞争)─┼──> 硬件物理泄露
│   [高带宽显存 (HBM/GDDR)]       ──(内存总线访问模式差异)───┘
└─────────────────────────────────────────────────────────────┘
                                  │
                                  ▼
┌─────────────────────────────────────────────────────────────┐
│                     侧信道攻击采集与分析                    │
│                                                             │
│  • 差分功耗分析 (DPA / CPA): 汉明距离/汉明权重与浮点运算关联 │
│  • 缓存侧信道 (Flush+Reload): 监控激活函数 (ReLU) 分支跳转  │
│  • 显存访问模式指纹: 依据 GEMM 分块大小重建网络拓扑结构    │
└─────────────────────────────────────────────────────────────┘

1. 差分功耗与电磁辐射攻击(DPA / EMA)

在硬件执行乘累加操作(MAC:Multiply-Accumulate)即 $Y = W \cdot X + B$ 时,CMOS 门电路的翻转率直接取决于参与运算的数据二进制汉明权重(Hamming Weight)和汉明距离(Hamming Distance)。
攻击者在设备供电引脚或芯片上方放置高采样率示波器和近场电磁探头,当向模型输入大量已知但不同的特征向量 $X$ 时,通过皮尔逊相关系数(Pearson Correlation Coefficient)比对测量功耗曲线与权重假设模型,能够逐层解密浮点权重 $W$:

$$\rho_{W_{guess}} = \frac{\sum (P_{measured} - \bar{P})(H(X, W_{guess}) - \bar{H})}{\sqrt{\sum (P_{measured} - \bar{P})^2 \sum (H(X, W_{guess}) - \bar{H})^2}}$$

2. 微架构缓存时序与分支侧信道(Cache & Branch Side-Channels)

在多租户 GPU 或共享 CPU 实例中,攻击者与推理进程共享 L2/L3 缓存及内存控制器。

  • ReLU 等非线性激活函数的输入符号推断:当 $x \le 0$ 时输出截断为 0,若底层推理引擎采用了分支跳转优化或稀疏计算加速,执行路径的时序开销截然不同。通过 Prime+Probe 或 Flush+Reload 监控缓存行,攻击者可推断出神经元的激活状态,进而解线性方程组还原权重。
  • GEMM(通用矩阵乘法)内存访问模式分析:矩阵分块算法(Tiling)在不同矩阵尺寸下产生的显存读取跨度(Stride)具有唯一物理指纹,直接暴露出隐藏层的矩阵维度(Hidden Dimensions)与注意力头数。

防御架构与硬件加固代码实现

防范硬件侧信道攻击必须采取“软硬件协同防御”策略,主要包括:计算常数时间化数据掩码(Masking)时钟与功耗混淆抖动,以及机密计算隔离

[原始输入特征 X] ──> [随机掩码生成器 (Mask Gen)] ──> [掩码特征 X' = X ⊕ R]
                                                           │
                                                           ▼
[模型权重 W]     ──> [权重掩码分解 W = W1 + W2]   ──> [掩码安全 GEMM 引擎]
                                                           │ (恒定执行时序 + 功耗白噪声)
                                                           ▼
[模型推理输出 Y] ◄── [去掩码重构还原模块] ◄───────────────┘

软硬件协同常数时间与数据掩码防御实现

以下为基于 C/C++ 与底层向量原语实现的抗侧信道常数时间矩阵乘法与激活函数防护示例:

#include <stdint.h>
#include <string.h>
#include <stdlib.h>

// 常数时间选择操作,避免任何数据依赖的分支跳转
static inline float constant_time_select_float(uint32_t mask, float a, float b) {
    union { float f; uint32_t u; } ua = { .f = a }, ub = { .f = b }, res;
    // 当 mask 为 0xFFFFFFFF 时选 a,为 0x00000000 时选 b
    res.u = (ua.u & mask) | (ub.u & ~mask);
    return res.f;
}

// 抗侧信道常数时间 ReLU 激活函数实现
void secure_constant_time_relu(float *layer_output, size_t length) {
    for (size_t i = 0; i < length; i++) {
        union { float f; uint32_t u; } val = { .f = layer_output[i] };
        // 提取浮点数符号位:为 1 表示负数,为 0 表示正数
        uint32_t sign_bit = (val.u >> 31) & 1;
        // 构造掩码:正数为 0xFFFFFFFF,负数为 0x00000000
        uint32_t positive_mask = -(1 - sign_bit);
        
        // 无论输入正负,执行相同的指令序列与内存读写操作
        layer_output[i] = constant_time_select_float(positive_mask, layer_output[i], 0.0f);
    }
}

// 基于加法秘密共享的一阶数据掩码矩阵乘法 (First-Order Additive Masking GEMM)
void masked_secure_gemm(
    const float *input_x, 
    const float *weight_w, 
    float *output_y, 
    size_t rows, 
    size_t cols, 
    size_t inner_dim
) {
    // 动态生成随机掩码矩阵 R
    float *mask_r = (float *)malloc(rows * inner_dim * sizeof(float));
    float *masked_x = (float *)malloc(rows * inner_dim * sizeof(float));
    
    for (size_t i = 0; i < rows * inner_dim; i++) {
        mask_r[i] = ((float)rand() / (float)RAND_MAX) * 0.1f;
        // X' = X - R,切断物理功耗与原始输入 X 的直接相关性
        masked_x[i] = input_x[i] - mask_r[i];
    }

    // 分别计算 Y1 = (X - R) * W 与 Y2 = R * W
    // 使得硬件功耗信号被完全白噪化
    float *y1 = (float *)calloc(rows * cols, sizeof(float));
    float *y2 = (float *)calloc(rows * cols, sizeof(float));

    for (size_t i = 0; i < rows; i++) {
        for (size_t j = 0; j < cols; j++) {
            float sum1 = 0.0f;
            float sum2 = 0.0f;
            for (size_t k = 0; k < inner_dim; k++) {
                sum1 += masked_x[i * inner_dim + k] * weight_w[k * cols + j];
                sum2 += mask_r[i * inner_dim + k] * weight_w[k * cols + j];
            }
            // 最终去掩码重构:Y = Y1 + Y2
            output_y[i * cols + j] = sum1 + sum2;
        }
    }

    free(mask_r);
    free(masked_x);
    free(y1);
    free(y2);
}

企业级模型防推断工程实践建议

  1. 启用硬件级机密计算环境(Confidential Computing)
    在公有云部署高价值专有模型时,优先选用支持机密计算的硬件基础设施(如 NVIDIA H100/A100 机密计算模式、AMD SEV-SNP、Intel TDX)。硬件引擎在 GPU 内部实施显存全程 AES-XTS-256 加密与完整性校验,阻断宿主机 Hypervisor 及同机租户对总线与内存时序的窥探。
  2. 算子执行时序随机化与虚假计算注入(Dummy Operations)
    在底层算子编译器(如 Triton、TVM、TensorRT 插件)中加入时钟抖动(Jittering)与随机虚假计算块。破坏攻击者采样功耗波形的对齐基准点(Trace Alignment),使差分分析的信噪比急剧下降。
  3. 模型参数稀疏化与动态量化混淆
    避免使用静态固定的浮点权重。引入动态量化(Dynamic Quantization)机制,每次前向推理时在保证精度的容差范围内对权重引入微小的动态尺度因子(Dynamic Scaling Factor),彻底切断外部观测特征与固定权重物理比特位的映射关系。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐