SharkTeam:合约精度计算漏洞与安全建议
字数 1389 2025-08-18 11:35:36
智能合约精度计算漏洞分析与安全建议
1. 精度计算漏洞概述
智能合约开发中的精度计算漏洞已成为近期安全事件的主要原因,已造成超过千万美元的损失。这类漏洞主要涉及数值计算时的取整方式和精度处理不当,导致关键变量计算错误。
2. 典型攻击案例分析
2.1 MIM_SPELL攻击事件 (2024年1月30日)
- 损失金额: 约650万美元
- 漏洞原因:
- 合约存在两个借贷变量
elastic和base - 两者精度计算都采用了向上取整方式
- 导致本应为0的参数计算得到1,使比例失衡
- 攻击者能够超额借出MIM代币
- 合约存在两个借贷变量
- 详细分析: 链接
2.2 RadiantCapital攻击事件 (2024年1月2日)
- 损失金额: 约450万美元
- 漏洞原因:
- 新市场未初始化流动性指数
- 攻击者通过闪电贷操纵指数大小
- 利用
rayDiv函数中的四舍五入精度问题 - 重复存取操作获利
2.3 Onyx Protocol攻击事件 (2023年11月11日)
- 损失金额: 约210万美元
- 漏洞原因:
- 类似RadiantCapital,新市场未初始化流动性
divUint函数中存在四舍五入漏洞
- 详细分析: 链接
2.4 WiseLending攻击事件 (2024年1月12日)
- 损失金额: 约46.5万美元
- 漏洞原因:
- 计算借贷份额时使用向上取整
- 攻击者重复存取操作提高份额价格
- 利用高份额价格借走大量ETH
2.5 HopeLend攻击事件 (2023年10月18日)
- 损失金额: 约85万美元
- 漏洞原因:
- 操纵hToken流动性指数扭曲价值
- 利用少量hToken抵押借入其他资产
- 利用
rayDiv函数四舍五入漏洞反复存取
3. 精度问题分类
3.1 第一类问题:错误的向上取整
- 可能导致本应为0的参数取到1
- 使后续计算出现严重漏洞
3.2 第二类问题:四舍五入问题
- 特别是错误使用
rayDiv函数 - 精度损失导致计算结果偏差
4. 安全建议
4.1 针对向上取整问题
- 如果逻辑需要向上取整:
- 对取整变量为1或0等边界条件进行多次测试
- 设计多种测试用例覆盖各种可能情况
4.2 针对四舍五入问题
- 采用"先乘后除"统一精度的方法
- 使用
10**18作为小数点后数值的标准 - 避免直接使用除法操作
4.3 通用安全实践
-
全面测试计算逻辑
- 覆盖所有可能的输入情况
- 特别关注边界条件和极端情况
-
新市场初始化检查
- 确保所有变量正确初始化
- 防止未初始化状态被利用
-
代码审查重点
- 检查所有数值计算操作
- 特别注意除法、取整等敏感操作
-
使用已验证的数学库
- 避免自行实现复杂数学运算
- 使用社区验证过的安全数学库
5. 开发实践建议
-
数值计算标准化
- 定义并坚持使用统一的精度标准
- 文档记录所有数值处理约定
-
防御性编程
- 添加输入验证和边界检查
- 实现安全数学运算的包装函数
-
测试策略
- 单元测试覆盖所有数学运算
- 集成测试验证跨合约交互
- 模糊测试发现边界情况问题
-
监控与警报
- 实现异常数值监控
- 设置关键参数变化警报
6. 总结
智能合约中的精度计算问题看似简单,但可能导致严重后果。开发者必须:
- 充分理解数值计算在区块链环境中的特殊性
- 严格遵循安全数值处理的最佳实践
- 进行全面测试,特别是边界条件
- 使用已验证的数学库和安全模式
通过系统性地应用这些原则和实践,可以显著降低因精度计算问题导致的安全风险。