sherlock-audit / 2023-11-covalent-judging

3 stars 2 forks source link

Atharv - Missed Require statement, If values not set properly then no-one can enable the validator and hence DOS #80

Closed sherlock-admin closed 7 months ago

sherlock-admin commented 7 months ago

Atharv

medium

Missed Require statement, If values not set properly then no-one can enable the validator and hence DOS

Summary

Missing the Require check result in the DOS.

Vulnerability Detail

In the OperationalStaking.sol::initialize() function we are setting the variable validatorMaxStake. And also we are assigning the value to variable validatorEnableMinStake = DEFAULT_VALIDATOR_ENABLE_MIN_STAKE. If we set the value of

validatorMaxStake < DEFAULT_VALIDATOR_ENABLE_MIN_STAKE

we cannot enable the validator.

Here

 uint128 staked = _sharesToTokens(v.stakings[v._address].shares, v.exchangeRate);

We are calculating the staked amount and

require(staked >= validatorEnableMinStake, "Validator is insufficiently staked");

checking it should be greater than validatorEnableMinStake But validatorMaxStake < validatorEnableMinStake hence transaction will get reverts and we cannot enable the validator

Impact

Medium

Severity: High Likelihood: Low

Code Snippet

   function enableValidator(uint128 validatorId) external onlyStakingManagerOrOwner {
        require(validatorId < validatorsN, "Invalid validator");
        Validator storage v = _validators[validatorId];

        if (v.disabledAtBlock == 0) {
            // if validator is already enabled, succeed quietly
            return;
        }

        uint128 staked = _sharesToTokens(v.stakings[v._address].shares, v.exchangeRate);

@>      require(staked >= validatorEnableMinStake, "Validator is insufficiently staked");

        v.disabledAtBlock = 0;
        emit ValidatorEnabled(validatorId);
    }

Tool used

Manual Review

Recommendation

function initialize(address cqt, uint128 dCoolDown, uint128 vCoolDown, uint128 maxCapM, uint128 vMaxStake) external initializer {
        __Ownable_init();
        validatorCoolDown = vCoolDown; // 180*6857 = ~ 6 months
        delegatorCoolDown = dCoolDown; //  28*6857 = ~ 28 days
        maxCapMultiplier = maxCapM;
        validatorMaxStake = vMaxStake;
+      require(validatorMaxStake >= DEFAULT_VALIDATOR_ENABLE_MIN_STAKE);

        validatorEnableMinStake = DEFAULT_VALIDATOR_ENABLE_MIN_STAKE;
        delegatorMinStake = DEFAULT_DELEGATOR_MIN_STAKE;

        _unpaused = true;

        CQT = IERC20Upgradeable(cqt);
        emit InitializedSemantics(cqt, vCoolDown, dCoolDown, maxCapM, vMaxStake, validatorEnableMinStake, delegatorMinStake);
    }
sherlock-admin2 commented 7 months ago

1 comment(s) were left on this issue during the judging contest.

takarez commented:

invalid: admin functionality == trusted

noslav commented 7 months ago

fixed by require validator max stake to be larger than default validator enab

nevillehuang commented 6 months ago

Invalid, trusted admin input error, not valid based on sherlock rules, see point 5.