Open codehawks-bot opened 1 year ago
Note: There are a lot of these issues. Need to double check some closed ones if this is approved.
Moving to low, impact and likelihood seem very low
Another impact of this is that a malicious user can use buyLoan() to front run another user trying to borrow the loan. Assuming the malicious user sees in the mem-pool that someone tries to borrow() all the loan from a random pool, the malicious user can front-run the borrower and use buyLoan() to give his own-borrowed small loan into the pool, which deducted the poolBalance of that pool, now the transaction of the borrower is reverted as the poolBalance is underflow with the borrow amount. After this the malicious user can repay() immediately as there is no delay between borrow() and repay(), and continues to dos other pools. So I think this issue may be a medium one...
https://docs.codehawks.com/rewards-and-judging#What-is-a-finding?
Medium: Disruption of protocol functionality or availability
That's a different vulnerability though. You can't submit a new issue in an escalation!
Griefing a lender with dust loans
Severity
Medium Risk
Summary
In buyLoan(), there is no validation if the
totalDebt < pool.minLoanSize
. Therefore, a lender can be given a loan with very small loan which he doesn't want at all.Vulnerability Details
Since buyLoan() can be called by anyone, a malicious borrower can borrow a loan from his own pool with a pretty small
minLoanSize
so that he/she can self-borrow a small loan from his/her own pool, then forcefully push this loan by callingbuyLoan()
with his/her own loan to a random pool with enough pool balance of the pairs. Doing this cause griefing to the lender.POC
loanToken
toborrower
so that he can set up his pool in setUp() function ofLender.t.sol
Paste this code into
Lender.t.sol
: https://github.com/Cyfrin/2023-07-beedle/blob/main/test/Lender.t.sol. Right here the borrower set up his pool with very smallminLoanSize
of1 * 10 ** 18
and borrow the loan himself/herself.Paste this code into
Lender.t.sol
: https://github.com/Cyfrin/2023-07-beedle/blob/main/test/Lender.t.sol. Right here theborrower
starts the auction for his loan and callbuyLoan()
with the pool oflender1
, which has theminLoanSize
value of 100 * 10 ** 18. The test goes through successfully, meaning the loan is bought to the new pool.Use
forge test --mt test_bypassMinLoanSize
to run this test case.Impact
Tools Used
Manual
Recommendations
Consider implement a validation for min loan size like other functions in the contract after line 485.