25-ETH-美链

学习视频来源:https://www.bilibili.com/video/BV1Vt411X7JF/?p=25
本博客除了包含自己的在学习过程中记录的笔记外,还包含少部分自己扩展的内容,如有错误,敬请指正。

文章目录

  • [1. 项目背景](#1. 项目背景)
  • [2. 漏洞函数:`batchTransfer`](#2. 漏洞函数:batchTransfer)
  • [3. 攻击原理:整数溢出漏洞](#3. 攻击原理:整数溢出漏洞)
    • [3.1 漏洞根源](#3.1 漏洞根源)
    • [3.2 攻击构造](#3.2 攻击构造)
    • [3.3 攻击效果](#3.3 攻击效果)
    • [3.4 攻击后果](#3.4 攻击后果)
  • [4. 预防措施](#4. 预防措施)
    • [4.1 使用 SafeMath 库(适用于 Solidity < 0.8.0)](#4.1 使用 SafeMath 库(适用于 Solidity < 0.8.0))
    • [4.2 升级至 Solidity 0.8.0+](#4.2 升级至 Solidity 0.8.0+)
    • [4.3 安全审计与测试](#4.3 安全审计与测试)
    • [4.4 补充说明:精度问题](#4.4 补充说明:精度问题)

1. 项目背景

美链(Beauty Chain,简称 BEC) 是一个部署在以太坊主网上的 ERC-20 标准代币项目。其核心特点包括:

  • 无独立区块链:BEC 并未构建自己的区块链,而是完全依托于以太坊网络。
  • 基于智能合约:所有代币的发行、转账、余额查询等操作均通过调用部署在以太坊上的智能合约函数完成。和以太币不一样。
  • 状态存储:每个账户持有的 BEC 代币数量作为合约的状态变量,保存在以太坊的状态树中。
  • 遵循 ERC-20 标准 :ERC(Ethereum Request for Comments)是 Ethereum 社区提出的代币接口规范,ERC-20 定义了如 transferbalanceOftotalSupply 等标准方法,确保代币的互操作性。

2. 漏洞函数:batchTransfer

美链合约中实现了一个名为 batchTransfer 的函数,用于批量向多个接收者转账 。其设计初衷是提升效率,允许用户一次调用即可向多个地址发送相同数量的代币。

该函数逻辑包含以下关键步骤:

  1. 计算总转账金额:amount = cnt * _value
  2. 从调用者账户扣除 amount
  3. 向每个 _receivers 地址分别转入 _value

3. 攻击原理:整数溢出漏洞

3.1 漏洞根源

Solidity 在 0.8.0 版本之前默认不检查整数运算溢出 。若乘法结果超过 uint256 最大值(2²⁵⁶ − 1),则会回绕为 0(即"下溢"或"上溢")。

uint256(最大值是 2²⁵⁶ - 1),当运算结果超过这个最大值时,就会用结果减去 2²⁵⁶,最终得到的余数就是实际值 ------ 如果刚好等于 2²⁵⁶,余数就是 0,也就是 "回绕为 0"。

3.2 攻击构造

攻击者精心构造了 batchTransfer 的输入参数:

  • _receivers 数组长度设为 2
  • _value 设为一个极大值:
    16进制:0x8000000000000000000000000000000000000000000000000000000000000000 ,10进制是:57896044618658097711785492504343953926634992332820282019728792003956564819968
    (即 2²⁵⁵,约为 5.789 × 10⁷⁶)

计算总金额:

复制代码
amount = _value × 2 = 2²⁵⁵ × 2 = 2²⁵⁶

由于 uint256 最大只能表示 2²⁵⁶ − 1,因此:

复制代码
2²⁵⁶ -2²⁵⁶ = 0

amount 溢出为 0

3.3 攻击效果

  • 合约检查调用者余额是否 ≥ amount(即 ≥ 0)→ 通过
  • 从调用者账户扣除 0 个 BEC → 余额不变
  • 但依然向两个接收地址各转账 _value(即 2²⁵⁵ 个 BEC)→ 凭空增发巨量代币

虽然 _value 超出常规数值范围,但在 Solidity 中只要符合 uint256 类型即可作为参数传入。

3.4 攻击后果

  1. 代币无限增发:攻击者成功铸造了远超总供应量的 BEC(据公开数据,单次攻击就生成了约 5 × 10⁵⁸ 个 BEC)。
  2. 市场信心崩塌:BEC 币值瞬间暴跌,几近归零。
  3. 交易所紧急响应 :主流交易平台 OKEx 立即暂停 BEC 的交易与提现,以防止进一步损失。

4. 预防措施

4.1 使用 SafeMath 库(适用于 Solidity < 0.8.0)

OpenZeppelin 提供的 SafeMath 库对所有算术运算进行溢出检查:

4.2 升级至 Solidity 0.8.0+

自 Solidity 0.8.0 起,所有整数运算默认启用溢出检查,无需额外库:

solidity 复制代码
// Solidity >=0.8.0
uint256 amount = _value * _receivers.length; // 溢出自动 revert

4.3 安全审计与测试

  • 上线前由第三方进行形式化验证和渗透测试
  • 覆盖边界条件(如最大值、零值、大数组等)

4.4 补充说明:精度问题

尽管此次攻击涉及极大数值,但需注意:

  • ERC-20 代币使用 uint256 整数,不存在浮点数精度误差。
  • 所有计算均为精确整数运算,漏洞纯属整数溢出,非精度问题。

总结:solidity语言在进行数值运算时,一定要考虑数据溢出问题。

相关推荐
TechubNews17 小时前
专访新火集团首席经济学家付鹏:解读比特币资产属性、香港楼市与普通人理财建议——Techub News对话实录
人工智能·区块链
王苏安说钢材A18 小时前
无锡佳钛合不锈钢有限公司不锈钢焊管厂家
区块链
财迅通Ai1 天前
能源板块强势领涨,汇添富能源ETF(159930.SZ)单日大涨3.41%
区块链·能源·中国神华·陕西煤业
Web3VentureView1 天前
SYNBO亮相香港《前瞻》活动,联手HashKey共筑链上原生一级市场新范式
人工智能·web3·区块链·加密货币·synbo
每日综合1 天前
Web3 多链时代,安全与体验如何兼得?UKey Wallet 的“解题思路”
安全·web3·区块链
MicroTech20251 天前
微算法科技(NASDAQ :MLGO)基于量子隐形传态的区块链共识机制:量子时代下的信任重构
科技·重构·区块链
TechubNews2 天前
Base 发布首个独立 OP Stack 框架的网络升级 Azul,将是 L2 自主迭代的开端?
大数据·网络·人工智能·区块链·能源
xiaohuoji1292 天前
震荡行情下的自动化交易:从架构视角看高抛低吸工具选型
架构·自动化·区块链
blockcoach2 天前
刘教链|比特币的马奇诺防线:从减半失灵到幂律大考
区块链
Yyyyy123jsjs2 天前
找到了美股数据中Tick级别每笔成交的稳定来源
区块链