sherlock-2023-08-cooler-m03

[M-03] gOhm stuck forever if call claimDefaulted on Cooler directly

보고서

Summary

Clearinghouse.claimDefaulted() 대신 Cooler.claimDefaulted() 를 이용하여 Clearinghouse의 체납 대출을 청산하면 gOHM이 Clearinghouse 컨트랙트에 전송되고 잠겼다. 원래는 gOHM가 소각되어야 하지만 Cooler.claimDefaulted() 를 직접 호출하면 소각되지 않는다.

Keyword

asset lock

Vulnerability

Clearinghouse 를 통한 대출을 채무 불이행으로 청산시킬 때, Cooler.claimDefaulted()를 직접 호출하면 Clearinghouse.claimDefaulted() 에서 처리하는 다른 일(키퍼에게 리워드 주기, OHM 소각하기)을 처리하지 않고 청산된다.

Cooler.claimDefaulted() 에서는 Clearinghouse.onDefault() 콜백 함수를 호출하지만, Clearinghouse._onDefault() 에서는 아무 일도 하지 않는다.

    function _onDefault(uint256, uint256, uint256) internal override {}

Clearinghouse.claimDefaulted() 로 호출했을 때는 gOHM이 OHM으로 변환(언스테이킹)되고, 변환한 OHM을 소각한다. 하지만 Cooler.claimDefaulted()를 직접 호출한다면 Clearinghouse 컨트랙트에 담보 토큰(gOHM)이 전송된다. 이를 소각하거나 꺼낼 방법은 없다.

만약 체납된 모든 대출에 직접 Cooler.claimDefaulted() 를 호출하면 모든 담보(gOHM)를 영원히 꺼낼 수 없도록 할 수 있다.

Impact

체납된 대출의 담보 gOHM을 영원히 꺼낼 수 없도록 할 수 있다.

Mitigation

burn 함수를 추가하여 예치된 gOHM을 소각할 수 있도록 수정했다.

Memo

어차피 소각하는 게(gOHM, OHM) 잠기므로 운영/경제적 영향은 없다 판단, 미디엄 심각도 평가했다.


tags: bughunting, olympus dao, smart contract, solidity, lending protocol, asset lock, severity medium