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