sherlock-2025-06-symbiotic-relay-m01

[M-01] Attacker will manipulate voting power calculations as getOperatorVotingPower() and getOperatorVotingPowerAt() functions lack vault validation

보고서

Summary

오퍼레이터의 투표권을 조회하는 함수에서, 조회에 사용한 볼트가 시스템에 등록된 것인지 확인하지 않는다. 따라서 미등록 또는 해지된 볼트에서도 투표권을 조회할 수 있다. 이 프로젝트는 범용적인 SDK이기때문에 이슈의 심각도를 인정해주었다.

Keyword

dao, solidity view, lack of input validation

Vulnerability

getOperatorVotingPowerAt 함수나 getOperatorVotingPower 함수는 쿼리한 볼트에서의 오퍼레이터의 투표권을 조회하는 함수이다. 이 함수들은 쿼리한 볼트에 등록된 토큰이 시스템에 등록된 토큰인지만 확인하며, 쿼리한 볼트가 시스템에 등록된 볼트인지는 확인하지 않는다. 즉, 시스템에 등록되지 않은 볼트 또는 기존에 등록되었다가 해지된 볼트에도 투표권이 있는 것으로 조회될 수 있다.

function getOperatorVotingPowerAt(
    address operator,
    address vault,
    bytes memory extraData,
    uint48 timestamp,
    bytes memory hints
) public view returns (uint256) {
    IVotingPowerProvider.OperatorVaultVotingPowerHints memory operatorVaultVotingPowerHints;
    if (hints.length > 0) {
        operatorVaultVotingPowerHints = abi.decode(hints, (IVotingPowerProvider.OperatorVaultVotingPowerHints));
    }
 
    if (
@>      !isTokenRegisteredAt(
            IVault(vault).collateral(), timestamp, operatorVaultVotingPowerHints.isTokenRegisteredHint
        )
    ) {
        return 0;
    }
    return IVotingPowerCalcManager(address(this)).stakeToVotingPowerAt(
        vault,
        getOperatorStakeAt(vault, operator, timestamp, operatorVaultVotingPowerHints.stakeHints),
        extraData,
        timestamp
    );
}
 
function getOperatorVotingPower(
    address operator,
    address vault,
    bytes memory extraData
) public view returns (uint256) {
@>  if (!isTokenRegistered(IVault(vault).collateral())) {
        return 0;
    }
    return IVotingPowerCalcManager(address(this)).stakeToVotingPower(
        vault, getOperatorStake(vault, operator), extraData
    );
}

Impact

시스템에 등록되지 않은 볼트 또는 기존에 등록되었다가 해지된 볼트에도 투표권이 있는 것으로 조회될 수 있다.

Mitigation

등록된 볼트가 아닐 시 투표권 조회 함수를 revert 한다.

// Add vault validation
if (!isSharedVaultRegistered(vault) && !isOperatorVaultRegistered(vault)) {
    return 0;
}

Memo

디자인 초이스로 볼 수 있는 부분이지만, 이 프로젝트는 SDK이기때문에 인정해주었다.


tags: bughunting, symbiotic, smart contract, solidity, restaking, dao, solidity view, lack-of-input-validation-vul, severity medium