[区块链安全-Damn_Vulnerable_DeFi]区块链DeFi智能合约安全实战(V4.1.0)
挑战网站链接
目录
- 前言
- 1. Unstoppable
- 介绍
- 漏洞代码
- 攻击代码
- 总结
- 快速认识新的ERC标准
- 进行合约审查
前言:
这是我第一次进行这个挑战,目的是想要看看别人的智能合约代码是如何写的以及学习一些安全知识。 会持续更新。
1.Unstoppable
介绍
这是一个闪电贷合约。有一个存放了一百万DVT代币的代币化保险库。它正在免费提供闪电贷款,直到宽限期结束。 为了在完全去中心化的阶段之前发现任何错误,开发人员决定在测试网中运行一个实时beta版。有一个监控合约来检查闪电贷款功能的活跃性。 从余额中拥有10个DVT代币开始,展示如何停止保险库。它必须停止提供闪电贷款。
简单来说我们作为用户,初始余额中有10个DVT代币,我们需要进行代码操作来让合约停止提供闪电贷款。
漏洞代码
这个合约的代码问题出在UnstoppableVault.sol中的flashLoan函数中。
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance(); // enforce ERC4626 requirement
totalSupply:金库份额数量(由ERC4626提供,ERC4624继承了ERC20)。 balanceBefore:底层资产数量(由ERC20提供)。 convertToShares(uint256 assets): 这是一个传入资产数量返回对应的金库份额数量的函数。(显而易见这里传入的参数出错了,进行判断对比的变量也出错了)
在初始时金库份额数量和底层资产数量相等,即1:1,所以这个判断并不会revert。 但如果我在测试中把用户的所有余额都转账给了UnstoppableVault,那么这个合约的balance就会变多,但是totalSupply并不会增加,此时balanceBefore和totalSupply就不相等了。就会出现错误,合约会暂停。
攻击代码
function test_unstoppable() public checkSolvedByPlayer {
token.transfer(address(vault), INITIAL_PLAYER_TOKEN_BALANCE);
}
总结
快速认识新的ERC标准:
1.先大致了解这个标准做了什么,能解决什么事情。 2.点进合约内部查看,了解大致的功能函数。 3.明确用户可以调用的函数。
进行合约审查:
1.明确这个合约做了什么事情。 2.明确用户可以调用的函数。 3.查看测试代码,明确初始化流程。 4.仔细寻找漏洞
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
上一篇:构造与破解SIDH 下一篇:币圈十大交易所亲测!安全可靠选对app避坑指南
区块链技术网

发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。