codehawks-2023-07-dsc-h04

[H-04] Business Logic: Protocol Liquidation Arithmetic

보고서

Summary

청산을 해도 실질적으로 손해를 보게 되므로 청산을 하려는 유저가 없을 것이다. 이로 인해 담보 토큰의 가치가 떨어지는 상황에 프로토콜이 파산할 수 있다.

Keyword

business logic vul

Vulnerability

담보 토큰의 가격이 떨어져서 유저의 담보가 200% 과담보 아래로 떨어지면 아무나 liquidate 함수를 호출해 자신의 DSC 토큰을 소각하며 해당 유저(이하 유저A)의 담보를 청산할 수 있다. liquidate 함수 호출자는 소각한 DSC의 가치만큼의 담보 토큰을 얻으며 추가로 10%의 보너스 담보 토큰을 더 얻을 수 있다.

그런데 이 로직은 이상하다. 함수 호출자(청산자)는 자신의 DSC를 소각해야 한다. 따라서 DSC를 소지해야 한다. DSC를 새로 발행하는 유일한 방법은 컨트랙트에 담보를 예치하는 것 뿐이다. 즉, 다른 유저의 담보를 청산하기 위해 자신의 담보 토큰을 200% 과담보로 맡기고 DSC를 발행받아야 한다.

청산 보너스가 10%이므로 청산을 통해 110%만큼의 담보를 받아낼 수 있다. 하지만 이를 받기 위해 200%만큼의 담보를 예치해야 하며, 발행한 DSC는 청산에 사용해버려 예치한 담보를 꺼낼 수 없다. 즉, 청산자는 90%만큼의 손해를 본다.

Impact

이득이 없기 때문에 청산을 시도하는 유저가 없을 것이다. 청산이 이루어지지 않기 때문에, 담보 토큰의 가치가 떨어지는 시장 상황에서 프로토콜이 파산할 수 있다.

Mitigation

  • 프로토콜 내에서 플래시론 유형의 atomic mint로 재진입할 수 있도록 하여 liquidate 호출시 실질적으로 이득이 발생하도록 한다.
  • DSC 외 다른 스테이블 코인을 상환에 사용할 수 있도록 한다.

Memo

DSC를 얻기 위해 DEX를 이용할 수도 있겠지만 이 역시 문제라고 했다. DEX 풀이 불안정하면 프로토콜도 불안정해지기 때문이다.


tags: bughunting, codehawks, smart contract, solidity, business-logic-vul, severity high