SharkTeam:合约精度计算漏洞与安全建议
字数 1389 2025-08-18 11:35:36

智能合约精度计算漏洞分析与安全建议

1. 精度计算漏洞概述

智能合约开发中的精度计算漏洞已成为近期安全事件的主要原因,已造成超过千万美元的损失。这类漏洞主要涉及数值计算时的取整方式和精度处理不当,导致关键变量计算错误。

2. 典型攻击案例分析

2.1 MIM_SPELL攻击事件 (2024年1月30日)

  • 损失金额: 约650万美元
  • 漏洞原因:
    • 合约存在两个借贷变量elasticbase
    • 两者精度计算都采用了向上取整方式
    • 导致本应为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 通用安全实践

  1. 全面测试计算逻辑

    • 覆盖所有可能的输入情况
    • 特别关注边界条件和极端情况
  2. 新市场初始化检查

    • 确保所有变量正确初始化
    • 防止未初始化状态被利用
  3. 代码审查重点

    • 检查所有数值计算操作
    • 特别注意除法、取整等敏感操作
  4. 使用已验证的数学库

    • 避免自行实现复杂数学运算
    • 使用社区验证过的安全数学库

5. 开发实践建议

  1. 数值计算标准化

    • 定义并坚持使用统一的精度标准
    • 文档记录所有数值处理约定
  2. 防御性编程

    • 添加输入验证和边界检查
    • 实现安全数学运算的包装函数
  3. 测试策略

    • 单元测试覆盖所有数学运算
    • 集成测试验证跨合约交互
    • 模糊测试发现边界情况问题
  4. 监控与警报

    • 实现异常数值监控
    • 设置关键参数变化警报

6. 总结

智能合约中的精度计算问题看似简单,但可能导致严重后果。开发者必须:

  1. 充分理解数值计算在区块链环境中的特殊性
  2. 严格遵循安全数值处理的最佳实践
  3. 进行全面测试,特别是边界条件
  4. 使用已验证的数学库和安全模式

通过系统性地应用这些原则和实践,可以显著降低因精度计算问题导致的安全风险。

智能合约精度计算漏洞分析与安全建议 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. 总结 智能合约中的精度计算问题看似简单,但可能导致严重后果。开发者必须: 充分理解数值计算在区块链环境中的特殊性 严格遵循安全数值处理的最佳实践 进行全面测试,特别是边界条件 使用已验证的数学库和安全模式 通过系统性地应用这些原则和实践,可以显著降低因精度计算问题导致的安全风险。