Compact合约安全审查 compact-reviewer:security-review

这是一个用于Midnight网络上Compact智能合约的全面安全分析技能。它专注于检测安全漏洞、隐私泄露、披露违规、访问控制问题以及零知识证明(ZK)特定攻击向量。关键词:智能合约安全,零知识证明,隐私保护,区块链审计,访问控制,漏洞检测,ZK攻击向量,Compact语言。

智能合约 0 次安装 0 次浏览 更新于 2/26/2026

name: compact-reviewer:security-review description: 用于审查Compact合约中的安全漏洞、隐私泄露、披露违规、访问控制问题或ZK特定攻击向量。

安全审查技能

针对Midnight网络上Compact智能合约的全面安全分析。

使用时机

此技能在以下查询时激活:

  • Compact合约中的安全漏洞
  • 隐私和披露问题
  • 访问控制验证
  • ZK特定攻击模式
  • 审计和安全审查

触发词:安全、漏洞、审计、披露、访问控制、隐私泄露、攻击向量

快速参考

安全检查清单

类别 检查项 失败严重性
访问控制 导出的电路验证调用者授权 🔴 严重
披露 所有公共输出都使用 disclose() 🔴 严重
输入验证 所有见证输入都经过验证/有界 🔴 严重
状态保护 账本写入具有授权检查 🟠 高
ZK攻击 低熵见证不用于哈希 🔴 严重
时序 无见证依赖的控制流 🟠 高

常见漏洞

// ❌ 缺少访问控制
export circuit withdraw(amount: Uint<64>): [] {
    balance.decrement(amount);  // 任何人都可以调用!
}

// ✅ 具备访问控制
export circuit withdraw(amount: Uint<64>): [] {
    const caller = get_caller_secret();
    assert hash(caller) == owner_hash.read();
    balance.decrement(amount);
}
// ❌ 披露违规
export circuit get_balance(): Uint<64> {
    return balance.read();  // 缺少disclose!
}

// ✅ 显式披露
export circuit get_balance(): Uint<64> {
    return disclose(balance.read());
}

ZK攻击向量

ID 攻击 风险 检测方法
AV-03 无效符可链接性 🔴 严重 persistentHash() 使用低熵输入
AV-06 见证熵耗尽 🔴 严重 有界见证类型(Uint<8>, 枚举)
AV-01 隐式污点泄露 🟠 高 见证依赖的控制流
AV-08 电路约束不足 🔴 严重 缺少对见证范围的断言

审查流程

1. 访问控制验证

对于每个 export circuit

  1. 识别谁应被授权调用它
  2. 验证授权检查存在(见证 + 断言)
  3. 检查授权使用正确的密码学验证
// 模式:授权检查
witness get_admin_key(): Bytes<32>;

export circuit admin_action(): [] {
    const admin = get_admin_key();
    assert hash(admin) == admin_hash.read();  // ✓ 密码学验证
    // ... 执行操作
}

2. 披露分析

对于从电路返回的每个值:

  1. 追踪值来源(账本、见证、计算)
  2. 验证公共输出使用了 disclose()
  3. 检查通过账本写入的隐式披露
// 必须对以下情况使用 disclose():
// - 从导出电路返回的值
// - 源自见证并变为公共的值
// - 应可见的账本状态

3. 输入验证

对于每个见证函数:

  1. 检查类型边界(Uint<N> 有 2^N 个值)
  2. 验证断言限定了有效范围
  3. 查找缺失的空/空值检查
// ❌ 无界见证
witness get_choice(): Uint<8>;  // 256种可能性

export circuit vote(): [] {
    const choice = get_choice();
    voteTally[choice].increment(1);  // 无边界检查!
}

// ✅ 有界见证
export circuit vote(): [] {
    const choice = get_choice();
    assert choice < 5;  // 只有5个有效选项
    voteTally[choice].increment(1);
}

4. ZK特定检查

运行攻击向量检查清单:

检查项 查找内容 如果发现
AV-01 if disclose(witness) 或见证在循环计数中 标记时序泄露
AV-03 persistentHash(low_entropy) 标记无效符可链接性
AV-06 在安全关键路径中使用 Uint<1-16> 标记暴力破解风险
AV-08 见证使用无范围断言 标记约束不足

参考资料

相关技能