sherlock-2023-08-cooler-h02

[H-02] At claimDefaulted, the lender may not receive the token because the Unclaimed token is not processed

보고서

Summary

claimDefaulted 함수 호출 시 남아있는 loan.unclaimed를 처리하지 않는다. 이로 인해 대여자가 채무 상환금을 받지 못한다.

Keyword

logic flaw, asset lock, lending protocol

Vulnerability

claimDefaulted 함수는 채무 불이행 상태의 대출의 담보를 대여자에게 주는 함수이다. 이때 처리된 대출 정보는 삭제된다.

function claimDefaulted(uint256 loanID_) external returns (uint256, uint256, uint256) {
    Loan memory loan = loans[loanID_];
@>  delete loans[loanID_];
    ...
}

그런데 이 함수에서는 loan.unclaimed 를 처리하지 않는다. loan.unclaimed 는 채무자가 상환한 토큰 양이다.

채무자가 토큰을 상환하면 바로 대여자에게 전달되는 게 아니라, loan.unclaimed에 기록되고, 추후 claimRepaid() 를 호출해야 정산이 된다.

    function claimRepaid(uint256 loanID_) external {
        Loan memory loan = loans[loanID_];
 
        // Update storage.
        uint256 claim = loan.unclaimed;
        delete loans[loanID_].unclaimed;
 
        // Transfer repaid debt back to the lender.
@>      debt().safeTransfer(loan.lender, claim);
    }

따라서 claimDefaulted() 함수를 호출하면 대출자가 정산해가지 않은 채무 상환금을 잃게 된다.

Impact

대여자가 미청구된 채무 상환금을 받지 못한다.

Mitigation

function claimDefaulted(uint256 loanID_) external returns (uint256, uint256, uint256) {
+   claimRepaid(loanID_)
    Loan memory loan = loans[loanID_];
    delete loans[loanID_];

tags: bughunting, olympus dao, smart contract, solidity, lending protocol, logic flaw, asset lock, severity high