취약점 요약
에이전트(Agent)는 담보 비율(Collateral Ratio, CR)이 충분히 높을 때 담보 출금(Withdrawal)을 선언할 수 있습니다.
그러나 출금을 실행하는 시점에 CR이 최소 기준 이하로 떨어져도 검증이 이루어지지 않습니다.
즉,
- Agent 오너가 출금 실행 → CR이 최소치 아래로 하락 → Vault가 청산 대상이 됨
- 같은 트랜잭션에서 Liquidation을 직접 실행 → 청산 과정에서 할인된 담보를 자기 스스로 가져감
결과적으로 Agent 오너는 담보를 빼내면서도, 스스로 청산자로 참여해 추가 이익을 취할 수 있습니다
알아야 하는 정보
- CR (Collateral Ratio) : 담보 대비 발행된 자산의 비율. 시스템은 최소 CR 이상을 유지해야 안전.
- announceWithdrawal() : 담보 출금을 선언. 이때는 CR이 정상인지 확인.
- withdrawalExecuted() : 출금 실행. 단, 이 함수는 출금 후 CR이 최소 이상인지 확인하지 않음.
- Liquidation : Vault가 최소 CR 미만일 때 담보를 청산할 수 있음. 청산자는 담보를 할인된 가격으로 획득.
발견 위치
- contracts/fasset/library/AgentsExternal.sol
문제 코드