code4rena-2025-01-liquid-ron-m02

[M-02] Operators are unable to perform any actions due to incorrect modifier implementation

보고서

Summary

onlyOperator modifier는 operator 가 함수를 호출하는 것을 허용해야 하는데 반대로 이를 막는다.

Keyword

access control

Vulnerability

onlyOperator modifier는 owner 또는 operator로 등록된 계정만 호출할 수 있도록 막아야 한다. 그런데 실제로는 호출자가 owner이며 operator로 설정되지 않았을 때만 허용하고 있다. 즉, operator는 onlyOperator 가 붙은 함수를 실행할 수 없다.

/// @dev Modifier to restrict access of a function to an operator or owner
modifier onlyOperator() {
@>  if (msg.sender != owner() || operator[msg.sender]) revert ErrInvalidOperator();
    _;
}

Impact

onlyOperator 를 이용하는 함수는 다음과 같다.

  • harvest
  • harvestAndDelegateRewards
  • delegateAmount
  • redelegateAmount
  • undelegateAmount
  • finaliseRonRewardsForEpoch

이들은 RON을 스테이킹/언스테이킹 하고, 리워드를 수확, 그리고 출금을 finalize 하는 컨트랙트의 핵심 기능이다. Owner도 이 함수를 호출할 수는 있지만, 원래 의도는 Owner 와는 별개인 Operator 가 호출하는 것이다. 즉, Operator가 이를 호출할 수 없다면 컨트랙트는 정상적으로 운영될 수 없다.

Mitigation

owner 가 아니거나, operator가 아닐 때 트랜잭션을 취소한다.

modifier onlyOperator() {
-   if (msg.sender != owner() || operator[msg.sender]) revert ErrInvalidOperator();
+   if (msg.sender != owner() && !operator[msg.sender]) revert ErrInvalidOperator();
    _;
}

tags: bughunting, liquid ron, smart contract, solidity, access control vulnerability, severity medium