概述
EIP-4337 是一项旨在为以太坊主网添加账户抽象功能的重要提案,无需修改共识层协议。近期,OpenZeppelin 对 EIP-4337 的参考实现进行了全面的安全审计,发现了若干关键问题并提出了改进建议。本文将详细解析审计过程中发现的高危问题、低危问题及各类优化建议,并介绍相应的修复方案。
本次审计覆盖了账户抽象核心合约及样本实现,包括 EntryPoint、BLS 签名聚合器、Gnosis Safe 集成模块等关键组件。审计共发现 27 个问题,其中 23 个已完全解决,4 个部分解决,包括 1 个高严重性问题和 12 个低严重性问题。
审计范围与时间
审计类型:DeFi 安全评估
时间范围:2023年1月9日至2023年1月27日
编程语言:Solidity
代码库:eth-infinitism/account-abstraction @ 6dea6d8752f64914dd95d932f673ba0f9ff8e144
审计涵盖了以下核心合约组:
- 核心合约:EntryPoint、BaseAccount、StakeManager 等
- BLS 模块:BLSAccount、签名聚合器等
- Gnosis Safe 集成:EIP4337Manager、Fallback 处理
- 样本实现:SimpleAccount、各类 Paymaster 示例
- 工具类:Exec 工具合约
高严重性问题
无效的聚合签名漏洞
在 BLS 签名聚合器的实现中,发现了一个关键设计缺陷。打包者在构建批次时,会先验证单个签名,然后组合签名进行批量验证。然而,账户可以构造一种特殊操作,使其在单个签名验证时通过,但在组合验证时失败。
这种不一致性主要源于公钥验证逻辑:单个验证和组合验证使用的公钥来源可能不同。如果 initCode 的最后4个字与公钥不匹配,或者用户验证功能改变了公钥返回值,就会导致验证结果不一致。
修复方案:通过同步两个验证函数的公钥获取逻辑,确保使用相同的公钥源。相关修复已在 PR #195 和 PR #216 中实现。
低严重性问题
账户 EntryPoint 替换机制缺失
SimpleAccount 合约的注释表明应存在 EntryPoint 替换机制,但实际实现并无此功能。这意味着在不升级整个账户的情况下无法更换 EntryPoint 合约。
修复方案:更新文档注释明确说明当前限制,如需此功能需引入升级机制。
Gnosis Safe 签名失败处理不当
EIP4337Manager 合约在签名验证失败时直接回退,而不是返回标准的 SIG_VALIDATION_FAILED 错误值。这导致 simulateValidation 函数无法正常提供验证结果。
修复方案:修改验证逻辑,在遇到无效签名时返回标准错误值而非回退。
时间范围处理不精确
EntryPoint 合约在处理操作过期时间戳时,将 0 值(表示永不过期)转换为最大 uint64 值,但所有其他值都被减一。这种处理方式降低了时间预测的准确性。
修复方案:仅对 0 时间戳进行特殊处理,保持其他值的原样。
文档不准确与误导性问题
审计发现代码库中存在多处文档字符串和内联注释不准确的情况,包括:
- BaseAccount 中 sigTimeRange 参数的误导性描述
- 函数名引用错误(如 simulateUserOperation 应为 simulateValidation)
- 继承关系描述错误
- 参数大小说明错误(如时间戳长度描述)
修复方案:全面审查并更新所有文档字符串,确保与实现保持一致。
其他代码质量改进
审计还提出了多项代码质量改进建议:
- 为所有 require 语句添加明确的错误信息
- 补充缺失的文档字符串
- 使用安全的 ABI 编码方法(abi.encodeCall)
- 规范类型声明(使用 uint256 而非 uint)
- 优化项目文件结构
- 修复各类拼写错误和术语不一致
系统架构改进
EIP-4337 系统架构在本次迭代中有了重要演进:
- 状态变更灵活性:用户和支付者在验证操作时都可以更改 EVM 状态,提高了系统的通用性
- 存储限制增强:增加了额外的存储限制确保批处理中所有验证访问非重叠的存储插槽
- 聚合验证支持:用户操作可以将验证委托给聚合器智能合约,支持共享聚合器的操作一起验证
- 术语统一:将"钱包"术语统一改为"账户",提高一致性
- 时间限制功能:用户可以设置定义操作有效时限的时间范围
常见问题
EIP-4337 的主要目标是什么?
EIP-4337 旨在为以太坊带来账户抽象功能,而无需修改共识层协议。它允许用户使用智能合约作为其主要账户,支持更复杂的验证逻辑和 gas 支付方式。
账户抽象对普通用户有什么好处?
账户抽象让用户体验更加友好:支持社交恢复、无需手动处理 gas、批量交易处理、更灵活的安全设置等。用户不再需要担心私钥丢失或 gas 费管理问题。
这次审计发现了哪些关键风险?
审计发现了一个高严重性风险:BLS 签名聚合器中的验证不一致问题。此外还有多个低风险问题,包括文档不准确、错误处理不当、代码质量問題等。所有高风险问题都已修复。
如何确保我的账户抽象实现安全?
建议遵循以下最佳实践:进行全面测试和审计、使用最新修复后的代码版本、实施监控和警报系统、遵循最小权限原则、定期更新和维护合约实现。
监控与运维建议
为确保系统安全稳定运行,建议实施以下监控措施:
- Gas 参数异常检测:监控异常高或低的 gas 参数,识别潜在误解或攻击
- 验证失败追踪:持续监控 mempool 中验证失败的操作,及时发现异常模式
- 非标准使用分析:关注使用非标准账户、工厂和聚合器的交易,识别创新用例或限制
- 链上回滚监控:跟踪所有在链上回滚的捆绑,识别客户端问题或边界情况
- 权益水平监测:监控参与者权益异常低的操作,了解打包者风险偏好
总结
EIP-4337 账户抽象为以太坊带来了重要的用户体验改进,但复杂的智能合约系统需要严格的安全审计和持续监控。本次审计发现并修复了多个关键问题,显著提高了系统的安全性和可靠性。
开发者在使用账户抽象功能时,应确保使用最新审计通过的代码版本,并遵循智能合约安全最佳实践。定期安全审计和全面的监控系统是确保系统长期安全运行的关键。
通过持续的安全改进和社区努力,EIP-4337 有望为以太坊生态系统带来更加安全和用户友好的账户抽象体验,推动区块链技术的大规模采用。