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:
- 识别谁应被授权调用它
- 验证授权检查存在(见证 + 断言)
- 检查授权使用正确的密码学验证
// 模式:授权检查
witness get_admin_key(): Bytes<32>;
export circuit admin_action(): [] {
const admin = get_admin_key();
assert hash(admin) == admin_hash.read(); // ✓ 密码学验证
// ... 执行操作
}
2. 披露分析
对于从电路返回的每个值:
- 追踪值来源(账本、见证、计算)
- 验证公共输出使用了
disclose() - 检查通过账本写入的隐式披露
// 必须对以下情况使用 disclose():
// - 从导出电路返回的值
// - 源自见证并变为公共的值
// - 应可见的账本状态
3. 输入验证
对于每个见证函数:
- 检查类型边界(Uint<N> 有 2^N 个值)
- 验证断言限定了有效范围
- 查找缺失的空/空值检查
// ❌ 无界见证
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 | 见证使用无范围断言 | 标记约束不足 |
参考资料
相关技能
- critical-issues - 错误和逻辑错误检测
- compact-core/privacy-disclosure - Compact隐私模型
- compact-core/standard-library - 加密函数安全性