code4rena-2024-03-dittoeth-h04
[H-04] Partially filled Short Records created without a short order cannot be liquidated and exited
Summary
연동된 숏 주문이 존재하지 않는 부분 매칭 숏을 만들 수 있다. 이 숏은 청산되거나 종료될 수 없다.
Keyword
logic flaw, defi
Vulnerability
숏 주문이 부분매칭 되면 숏(숏 레코드)은 부분 매칭 상태(SR.PartiallyFilled)로 표시된다. 정상적인 상태라면 부분 매칭된 숏은 서로 연동된 부분 매칭된 숏 주문을 가진다. 그런데 숏은 부분 매칭 되었지만 연동된 숏 주문이 없는 상황이 발생할 수 있다.
숏 주문 생성을 요청하면 먼저 기존 구매 주문과 체결하고, 남은 판매량이 있다면 숏 주문을 생성한다. 그런데 남은 판매량이 최소량(minAskEth)보다 작다면 숏 주문을 생성하지 않는다. 즉 숏은 부분 매칭 상태이지만 연동된 숏 주문은 생성되지 않는다.
{
...
@> matchIncomingSell(asset, incomingAsk, matchTotal);
@> if (incomingAsk.ercAmount.mul(incomingAsk.price) >= minAskEth) {
addSellOrder(incomingAsk, asset, orderHintArray);
}
s.bids[asset][C.HEAD].nextId = C.TAIL;
return;
}
...부분 매칭 숏을 닫거나 청산시킬 때는 연동된 숏 주문을 닫아야 한다. 연동된 숏 주문을 조회하지 못하면 이 기능들은 revert 된다. 따라서 연동된 숏 주문이 생성되지 않은 부분매칭 숏은 닫거나 청산이 불가하다.
Impact
숏을 종료, 청산할 수 없다.
Mitigation
숏 주문을 생성하지 않을 것이라면 숏을 전체 매칭(SR.FullyFilled) 상태로 변경한다.
tags: bughunting, dittoeth, smart contract, solidity, logic flaw, defi, severity high