code4rena-2025-01-liquid-ron-m01
[M-01] User can earn rewards by frontrunning the new rewards accumulation in Ron staking without actually delegating his tokens
Summary
Ronin 스테이킹 리워드는 하루마다 갱신된다. 리워드가 갱신되기 전에 프론트러닝하여 Liquid Ron 에서의 지분을 높이고, 리워드가 갱신된 후 출금하면 스테이킹을 오래 유지하지 않고 이자만 받아갈 수 있다.
Keyword
frontrunning, staking
Vulnerability
Ronin 체인의 문서를 참고하면 Ronin 스테이킹 리워드는 하루동안의 최저 잔액을 기준으로 계산된다. 스테이킹 금액이 증가하면 매일 0시에 적용되며 어제치 리워드는 이 시점에 추가된다. 즉, 위임을 한 첫 날의 경우 해당 날짜의 최저 잔액이 0이므로 보상을 받을 수 없다.
하지만 Liquid Ron에는 이러한 시간 제약이 없다. 리워드를 수확하는 트랜잭션을 프론트러닝하면 리워드가 발생하기 직전에 지분을 증가시키고, 리워드가 수확된 후 출금하여 이자를 즉시 얻어갈 수 있다.
리워드를 Liquid Ron으로 수확해오는 harvest 콜을 프론트러닝 하는 것으로는 공격이 불가하다. 프론트러닝을 하여 입금하는 시점에 발행된 share는 아직 수확되지 않은 리워드를 고려하여 계산하기 때문이다. 대신 Ronin 스테이킹 컨트랙트에서 하루치 리워드가 갱신되는 시점에 프론트러닝을 할 수 있다. 24시간 주기로 리워드가 갱신되는데, 갱신되기 전까지는 Liquid Ron 측의 아직 수확되지 않은 리워드 양도 갱신되지 않기 때문이다.(날짜가 지나기 전까지는 어제치 리워드가 증가하지 않음)
Impact
스테이킹을 장기간 유지하지 않으면서 이자만 탈취해갈 수 있다.
Mitigation
락 매커니즘 등을 도입하여 유저가 최소 예치 기간을 유지하게 한다. 이자만 먹고 출금할 수 없도록 한다.
Memo
통합하는 프로토콜에 락이나 시간 관련 로직이 있다면 타이밍이 잘 맞는지 확인해보자.
tags: bughunting, liquid ron, smart contract, solidity, frontrunning, staking, severity medium