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 를 이용하는 함수는 다음과 같다.
harvestharvestAndDelegateRewardsdelegateAmountredelegateAmountundelegateAmountfinaliseRonRewardsForEpoch
이들은 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