code4rena-2024-03-dittoeth-h07
[H-07] Valid redemption proposals can be disputed by decreasing collateral
Summary
담보율을 낮추는 함수가 업데이트 시점을 기록하지 않아 청산 요청 이후에 업데이트 된 숏을 이의제기에 사용할 수 있다. 공격자가 청산을 취소시키고 수수료를 얻거나, 자신의 숏이 청산되지 않도록 하거나, 청산을 방해하여 디페깅을 유발할 수 있다.
Keyword
logic flaw, wrong state
Vulnerability
disputeRedemption 함수는 숏 청산 요청이 가능한데 포함되지 않은 숏을 찾아 제시하면 청산 요청을 취소시키는 함수이다. 청산 요청이 생성된 지 한시간 이상 전에 업데이트 된 숏만 이의제기에 사용할 수 있다. disputeRedemption 가 성공하면 이의제기에 사용된 숏의 담보율보다 높은 담보율을 가진 숏에게 빼앗았던 담보를 돌려주고, 청산을 무효화한다. 또한 disputeRedemption 호출자에게는 청산자가 맡겼던 dUSD 중 일부를 수수료로 준다.
function disputeRedemption(address asset, address redeemer, uint8 incorrectIndex, address disputeShorter, uint8 disputeShortId)
external
isNotFrozen(asset)
nonReentrant
{
...
@> if (disputeCR < incorrectProposal.CR && disputeSR.updatedAt + C.DISPUTE_REDEMPTION_BUFFER <= redeemerAssetUser.timeProposed)
{
...그런데 숏의 담보를 일부 꺼낼 수 있는 decreaseCollateral 함수는 updatedAt 를 업데이트 하지 않는다. 따라서 청산 요청 시점에 높은 담보율을 가지고 있던 숏의 담보율을 낮춘 뒤 disputeRedemption 에 사용할 수 있다.
Impact
공격자가 (원래는 취소 불가했던) 청산을 취소시키고 수수료를 얻거나, 자신의 숏이 청산되지 않도록 하거나, 청산을 방해하여 디페깅을 유발할 수 있다.
Mitigation
decreaseCollateral 함수에서 updatedAt 를 업데이트 한다.
tags: bughunting, dittoeth, smart contract, solidity, logic flaw, wrong state, severity high