Musyg/erc4626-inflation-audit
GitHub: Musyg/erc4626-inflation-audit
该项目演示了 ERC-4626 首次存款膨胀攻击的完整安全审查流程,包含可复现的 Foundry PoC 和经过验证的修复方案。
Stars: 0 | Forks: 0
# ERC-4626 通货膨胀,演示安全审查

这是一个智能合约安全审查的自包含演示:一个故意设计存在漏洞的 ERC-4626 风格的 vault,它允许的首次存款份额膨胀攻击(通过通过的 [Foundry](https://book.getfoundry.sh) 概念验证予以证明),以及一个相同的场景已被中和的 `fixed` 分支。
## 为什么会有这个 repo
任何人都可以在个人简介中写下“我审计智能合约”。这个 repo 展示了实际的工作:一个目标,一个具体的发现,一个可执行的证明,以及一个经过验证的修复。如果不能重现,就不算完成。
## 仓库布局
本次审查存在于两个分支中:
| 分支 | 内容 | `forge test` 显示通过意味着什么 |
|--------|----------|---------------------------------|
| `master` | 存在漏洞的 vault 和利用该漏洞的 PoC | 攻击成功,受害者被抢劫 |
| `fixed` | 修复后的 vault 和相同的场景 | 攻击无利可图,受害者得到全额补偿 |
- `src/MiniVault.sol`,正在接受审查的 vault
- `test/MiniVault.poc.t.sol`,概念验证
- `ERC4626_Inflation_Review.pdf`,完整的书面报告
## 发现
| ID | 严重性 | 摘要 |
|----|----------|---------|
| H-01 | 高 | 首次存款份额膨胀。`totalAssets()` 读取实时 token 余额,因此首个存款者为 1 wei 铸造一个份额,直接捐赠资产以抬高份额价格,而下一个存款者向下舍入为尘埃。攻击者进行赎回并获取受害者的存款。 |
`master` 分支上的 PoC 数据:攻击者注入 1 wei,捐赠 10,000 ether,受害者存入 20,000 ether 并收到一个份额,攻击者进行赎回并拿走受害者约 5,000 ether 的资金。在 `fixed` 分支上,同样的攻击会让攻击者损失约 5,000 ether,而受害者能恢复约 100% 的存款。
## 重现步骤
需要 [Foundry](https://book.getfoundry.sh/getting-started/installation)。
```
git clone https://github.com/Musyg/erc4626-inflation-audit.git
cd erc4626-inflation-audit
forge install
# master:exploit 成功
forge test -vv
# fixed:相同的攻击被 neutralised
git checkout fixed
forge test -vv
```
## 修复方案
修复后的 vault 在每次转换中增加了虚拟份额和虚拟资产(小数位偏移)。虚拟金额吸收了直接捐赠,因此首个存款者无法再大幅度改变汇率,从而防止将后来的存款者的份额向下舍入为尘埃。
这是针对 ERC-4626 通货膨胀攻击的标准缓解措施。
## 严重性评级标准
高:无特权攻击者直接、无条件地盗窃存款者的资金。唯一的前提条件是排序,即抢跑(front-running)首次真实存款。不需要特殊角色,没有外部依赖,没有链状态假设。
标签:Foundry, Solidity, 区块链安全, 智能合约, 漏洞分析, 路径探测