SmartOp Vote Path Triggers Fatal Supply Invariant Halt 漏洞概述 漏洞名称: SmartOp Vote Path Triggers Fatal Supply Invariant Halt 漏洞类型: 逻辑错误/状态管理错误 严重程度: Critical CVE ID: CVE-2024-40581 影响版本: 0.1 修复版本: None 描述 一个非委员会攻击者可以提交一个签名的 SmartOp::Vote 交易,该交易通过了签名、非ce和余额预检查,但在状态突变后才失败授权。 漏洞执行顺序 1. 从攻击者余额中扣除费用 2. 非ce递增 3. 授权失败(只有委员会成员可以投票) 4. 在外部最终化顶点错误处理中再次递增非ce 5. 供应会计不匹配(sum != total_supply)导致致命停机 节点将此视为不可恢复的错误,并以代码 101 退出。 影响范围 可用性损失/DoS: 攻击者可触发的致命停机导致验证器进程退出 共识活性风险: 多个节点可能因相同的畸形授权路径而停机 状态完整性违规: 费用扣除即使在授权失败后仍被应用 非ce损坏效应: 非ce在单个被拒绝的 SmartOp 上递增两次 整体影响是关键的,因为非特权参与者可以通过单个精心制作的交易路径触发致命节点停机。 修复方案 必需逻辑修复 1. 在 apply_smart_op_tx 中的状态突变之前预验证操作授权 2. 确保每个交易生命周期中只有一个非ce转换 3. 确保费用扣除和非ce更新与成功操作语义原子化 具体补丁策略 将所有操作级别检查(如委员会成员资格用于投票/提案操作)提前到 self.debit(&tx_from) 之前 移除或限制外部错误路径递增非ce,当非ce已经递增时 添加回归测试: - 被拒绝的费用充电 SmartOp(无余额,无非ce推进) - 被拒绝的费用豁免 SmartOp - 最终化 SmartOp 后的不变量保存 安全加固 在每个被拒绝的 tx 路径周围添加不变量断言测试,以确保没有部分状态突变 考虑在应用路径中使用事务性回滚语义 POC代码