Unstoppable

题目源代码

UnstoppableVault中的flashLoan有漏洞

1
2
3
4
不通过depositTokens函数给合约传钱就可以让poolbalance与合约余额不相等,
从而使贷款中的这一句无法通过,直接revert,从而使闪电贷无法使用
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance();

Naive receiver

题目源代码

NaiveReceiverLenderPool.sol中的flashLoan出现了漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function flashLoan(
IERC3156FlashBorrower receiver,
address token,
uint256 amount,
bytes calldata data
) external returns (bool) {
if (token != ETH)
revert UnsupportedCurrency();

uint256 balanceBefore = address(this).balance;

// Transfer ETH and handle control to receiver
SafeTransferLib.safeTransferETH(address(receiver), amount);
if(receiver.onFlashLoan(
msg.sender,
ETH,
amount,
FIXED_FEE,
data
) != CALLBACK_SUCCESS) {
revert CallbackFailed();
}

if (address(this).balance < balanceBefore + FIXED_FEE)
revert RepayFailed();

return true;
}

观察到调用的外部合约是receiver(既传入的一个地址),因此任何人都可以调用别人的合约来借贷,从而消耗别人的资金
若想一个交易内完成,则for循环10次即可

Truster

题目源代码

1
2
漏洞在合约的flashloan函数中
target.functionCall(data);

仔细观察发现并无明显的漏洞,但要注意!!!每个合约在call时总会有可能approve一个账户来管理自己的token,从而造成漏洞
因此,我们就需要在flashloan的时候将target地址传入token的合约,data为approve,从而假装该合约授予你管理权限,从而将它的token全转走