内存安全与后门防范

原理

后门分类矩阵:

后门类型攻击向量Rust 能否阻止
缓冲区溢出后门栈溢出覆盖返回地址消除
Use-After-Free 后门释放后继续使用指针消除
格式字符串后门printf(user_input)消除
源码级后门直接写入恶意逻辑不阻止
供应链后门污染依赖包不阻止
编译器后门修改 rustc不阻止
侧信道后门时序/功耗分析不确定

Rust 消除约 70% 经典后门向量,但仍有供应链、逻辑、编译器层面的后门需要额外防范。

Ken Thompson 的编译器后门(1984 Turing Award 演讲):攻击者修改 C 编译器在编译 login 时插入后门,并修改编译器源码使其在自举时重新插入后门——源码审查无法发现。对抗此攻击需要可重现构建 + 多样编译(diverse double-compiling)。

供应链安全方案:cargo-vet 人工审计记录 + cargo-audit CVE 扫描 + cargo-deny 许可证检查 + SBOM(Software Bill of Materials)生成。

安全: 后门技术
安全: 供应链攻击


语法

安全模式

// 不允许:unchecked 索引(缓冲区溢出 vector)
// let x = v[index]; // 若 index 越界 → panic(debug),但非溢出
 
// 正确:边界检查
let x = v.get(index).ok_or_else(|| Error::Bounds)?;
 
// 不允许:裸指针操作(safe 代码中禁止)
// let p: *const u8 = ...;
 
// 正确的数据校验
fn validate_amount(amount: f64) -> Result<(), ValidationError> {
    if amount.is_nan() || amount.is_infinite() || amount < 0.0 {
        return Err(ValidationError("invalid amount"));
    }
    Ok(())
}

防范清单

cargo audit                      # CVE 扫描
cargo deny check                 # 许可证/来源/依赖重复
cargo vet                        # 人工审计记录
cargo sbom                       # 生成 SBOM (cargo-cyclonedx)

实践

AI 自检

  1. Ken Thompson 的编译器后门在现代供应链中对应什么攻击形态?如何通过可重现构建防范?
  2. cargo vetcargo audit 的区别?各自的审计范围和信任模型?