
关于
检测源代码中敏感数据的缺失清零操作,并识别被编译器优化移除的清零操作,防止内存中的敏感信息泄露。
name: zeroize-audit description: "检测源代码中敏感数据缺失清零的问题,识别被编译器优化移除的清零操作,支持汇编级分析和控制流验证。适用于审计处理密钥、密码或其他敏感数据的 C/C++/Rust 代码。" allowed-tools:
- Read
- Grep
- Glob
- Bash
- Write
- Task
- AskUserQuestion
- mcp__serena__activate_project
- mcp__serena__find_symbol
- mcp__serena__find_referencing_symbols
- mcp__serena__get_symbols_overview risk: unknown source: community
zeroize-audit — Claude 技能
适用场景
- 审计加密实现(密钥、种子、随机数、机密数据)
- 审查认证系统(密码、令牌、会话数据)
- 分析处理个人身份信息或敏感凭证的代码
- 验证安全关键代码库中的安全清理操作
- 调查敏感数据处理的内存安全性
不适用场景
- 无安全焦点的通用代码审查
- 性能优化(除非与安全擦除相关)
- 与敏感数据无关的重构任务
- 不包含可识别密钥或敏感值的代码
目的
检测源代码中敏感数据缺失清零的问题,识别被编译器优化(如死存储消除)移除或削弱的清零操作,需提供 LLVM IR/汇编证据。功能包括:
- 汇编级分析:寄存器溢出和栈残留检测
- 数据流追踪:密钥副本跟踪
- 堆分配器安全警告
- 语义 IR 分析:循环展开和 SSA 形式
- 控制流图分析:路径覆盖验证
- 运行时验证测试生成
范围
- 对目标代码库只读操作(不修改被审计代码;将分析产物写入临时工作目录)
- 生成结构化报告(JSON)
- 需要有效的构建上下文(
compile_commands.json)和可编译的翻译单元 - 被优化移除的发现必须附带编译器证据(IR/汇编差异对比)
输入参数
完整 schema 见 {baseDir}/schemas/input.json。关键字段:
| 字段 | 必填 | 默认值 | 说明 |
|---|---|---|---|
| path | 是 | — | 仓库根目录 |
| compile_db | 否 | null | compile_commands.json 路径,用于 C/C++ 分析。若未设置 cargo_manifest 则必填。 |
| cargo_manifest | 否 | null | Cargo.toml 路径,用于 Rust crate 分析。若未设置 compile_db 则必填。 |
| config | 否 | — | 定义启发式规则和已批准擦除方法的 YAML |
| opt_levels | 否 | ["O0","O1","O2"] | IR 比较的优化级别。O1 为诊断级别:若擦除在 O1 消失则为简单 DSE;O2 捕获更激进的消除。 |
| languages | 否 | ["c","cpp","rust"] | 要分析的语言 |
| max_tus | 否 | — | 从编译数据库处理的翻译单元数量上限 |
| mcp_mode | 否 | prefer | off、prefer 或 require — 控制 Serena MCP 使用方式 |
| mcp_required_for_advanced | 否 | true | MCP 不可用时将 SECRET_COPY、MISSING_ON_ERROR_PATH 和 NOT_DOMINATING_EXITS 降级为 needs_review |
| mcp_timeout_ms | 否 | — | MCP 语义查询的超时预算 |
| poc_categories | 否 | 全部 11 个可利用类别 | 生成 PoC 的发现类别。C/C++:支持全部 11 个类别。Rust:仅支持 MISSING_SOURCE_ZEROIZE、SECRET_COPY 和 PARTIAL_WIPE;其他 Rust 类别标记为 poc_supported=false。 |
| poc_output_dir | 否 | generated_pocs/ | 生成 PoC 的输出目录 |
| enable_asm | 否 | true | 启用汇编生成和分析(步骤 8);产生 STACK_RETENTION、REGISTER_SPILL。若 emit_asm.sh 缺失则自动禁用。 |
| enable_semantic_ir | 否 | false | 启用语义 LLVM IR 分析(步骤 9);产生 LOOP_UNROLLED_INCOMPLETE |
| enable_cfg | 否 | false | 启用控制流图分析(步骤 10);产生 MISSING_ON_ERROR_PATH、NOT_DOMINATING_EXITS |
| enable_runtime_tests | 否 | false | 启用运行时测试用例生成(步骤 11) |
前置条件
运行前需验证以下条件,每项都有明确的失败处理方式。
C/C++ 前置条件:
| 前置条件 | 缺失时的失败处理 |
|---|---|
| compile_db 路径下的 compile_commands.json | 快速失败 — 不继续执行 |
| PATH 中的 clang | 快速失败 — IR/ASM 分析不可能 |
| PATH 中的 uvx(用于 Serena) | 若 mcp_mode=require:失败。若 mcp_mode=prefer:无 MCP 继续;按置信度门控规则降级受影响的发现。 |
| {baseDir}/tools/extract_compile_flags.py | 快速失败 — 无法提取每个翻译单元的标志 |
| {baseDir}/tools/emit_ir.sh | 快速失败 — IR 分析不可能 |
| {baseDir}/tools/emit_asm.sh | 警告并跳过汇编发现(STACK_RETENTION、REGISTER_SPILL) |
| {baseDir}/tools/mcp/check_mcp.sh | 警告并视为 MCP 不可用 |
| {baseDir}/tools/mcp/normalize_mcp_evidence.py | 警告并视为 MCP 不可用 |