本文详细分析了针对 ERC-4626 标准的通货膨胀攻击,包括其定义、攻击示例以及预防措施。作者通过多个代码示例展示了黑客如何利用漏洞进行攻击,以及推荐的修复方法,强调了安全审计和开发者在早期保护 DeFi 金库和池的重要性。
作者: Konstantin Nekrasov - MixBytes 的安全研究员
通货膨胀攻击是一个广泛存在的问题,针对 ERC-4626 代币化保险库标准,并且直到最近才得到关注。这种攻击允许恶意行为者盗取脆弱池中的首次存款,可能导致毫无防备的投资者遭受重大损失。这个漏洞在 OpenZeppelin ERC4626 审计 中得到了强调。
许多项目使用 ERC-4626 标准,如 erc4626.info,而且 在实际操作中有价值数百万美元的交易 可能被利用(但幸运的是没有)。因此,我们决定撰写一篇文章,描述这种攻击以及如何防范它。
在早期阶段,任何利用“铸造股份”功能以交换基础资产的交易池都可能受到通货膨胀攻击,导致投资者将部分或全部资金损失给池或黑客。
该漏洞源于“铸造股份”功能中的舍入问题,如以下公式所示:
sharesAmount = totalShares * assetAmount / asset.balanceOf(address(this))
黑客可以操纵分母,使受害者获得零或一股保险库。
让我们来看三个示例。
示例 1. 将股份舍入为零
该示例基于 OpenZeppelin ERC4626 实现:
abstract contract ERC4626 is ERC20 {
IERC20 asset;
constructor(IERC20 asset_) {
asset = asset_;
}
function totalAssets() public view returns (uint256) {
return asset.balanceOf(address(this));
}
function convertToShares(uint256 assets) public view returns (uint256) {
if (totalAssets() == 0) {
return assets;
}
return totalSupply() * assets / totalAssets();
}
function convertToAssets(uint256 shares) public view returns (uint256) {
return totalAssets() * shares / totalSupply();
}
function deposit(uint256 assets) public {
asset.transferFrom(msg.sender, address(this), assets);
_mint(msg.sender, convertToShares(assets));
}
function burn(uint256 shares) public {
_burn(msg.sender, shares);
asset.transfer(msg.sender, convertToAssets(shares));
}
}
攻击场景:
如何修复?一个选项是限制铸造零股份,但这单独并没有完全解决漏洞,正如第二个示例所示。
示例 2. 舍入为一股
假设我们在上述示例的 deposit() 函数中添加了以下条件:
require(convertToShares(assets) != 0);
然后攻击变得更加复杂:
如何修复?有 不同的方法。例如,你可以在首次存款时铸造“死亡股份”。
示例 3. 纠缠和死亡股份
假设我们采取额外步骤,实施“死亡股份”技术,该技术 由 UniswapV2 使用 以保护池的 deposit() 函数:
uint constant NUMBER_OF_DEAD_SHARES = 1000;
function deposit(uint256 assets) public {
asset.transferFrom(msg.sender, address(this), assets);
uint shares = convertToShares(assets);
if (totalShares() == 0) {
_mint(address(0), NUMBER_OF_DEAD_SHARES);
shares -= NUMBER_OF_DEAD_SHARES;
}
_mint(msg.sender, shares);
}
攻击的复杂性增加了三倍,尽管黑客不再能窃取资金,但仍然可以利用纠缠机会:
在本文中,我们分析了几种可能导致 ERC-4626 保险库受到通货膨胀攻击的漏洞代码示例。我们讨论了几种如何防范攻击的方法及其缺陷。有关不同方法的详细列表,以及它们的优缺点,可以在 OpenZeppelin GitHub 问题 中找到。审计员和开发人员了解这种攻击的工作原理以确保 DeFi 保险库和池的早期阶段安全至关重要。
MixBytes 是一支专业区块链审计员和安全研究员团队,专注于为 EVM 兼容和 Substrate 基础项目提供全面的智能合约审计和技术咨询服务。请在 X 上关注我们,随时了解最新的行业趋势和见解。
- 原文链接: mixbytes.io/blog/overvie...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!