Kelp DAO | rsETH - passion's results

A collective DAO designed to unlock liquidity, DeFi and higher rewards for restaked assets through liquid restaking.

General Information

Platform: Code4rena

Start Date: 10/11/2023

Pot Size: $28,000 USDC

Total HM: 5

Participants: 185

Period: 5 days

Judge: 0xDjango

Id: 305

League: ETH

Kelp DAO

Findings Distribution

Researcher Performance

Rank: 136/185

Findings: 1

Award: $2.76

QA:
grade-b

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

2.7592 USDC - $2.76

Labels

bug
downgraded by judge
grade-b
insufficient quality report
QA (Quality Assurance)
duplicate-36
Q-95

External Links

Lines of code

https://github.com/code-423n4/2023-11-kelp/blob/main/src/LRTConfig.sol#L80-L89

Vulnerability details

Impact

In the LRTDepositPool contract, the LRTAdmin is allowed to call the addNodeDelegatorContractToQueue function to add a nodeDelegator to the queue, there is a missing validation to check if the nodeDelegator is already in the array this could lead to one nodeDelegator that gets added more than once since the protocol only allows for adding nodeDelegators and doesn't have any way to remove nodeDelegators.

This could be an issue for the protocol since it always needs to keep in mind that one or more nodeDelegators would have more than 1 element in the array.

Proof of Concept

https://github.com/code-423n4/2023-11-kelp/blob/main/src/LRTConfig.sol#L80-L89

    function addNodeDelegatorContractToQueue(address[] calldata nodeDelegatorContracts) external onlyLRTAdmin {
        uint256 length = nodeDelegatorContracts.length;
        if (nodeDelegatorQueue.length + length > maxNodeDelegatorCount) {
            revert MaximumNodeDelegatorCountReached();
        }

        for (uint256 i; i < length;) {
            UtilLib.checkNonZeroAddress(nodeDelegatorContracts[i]); 
            nodeDelegatorQueue.push(nodeDelegatorContracts[i]);
            emit NodeDelegatorAddedinQueue(nodeDelegatorContracts[i]);
            unchecked {
                ++i;
            }
        }
    }

Tools Used

Manual Review

Consider using the same method as used with supported assets or add a function to remove from the NodeDelegatorQueue

        if (isNodeDelegatorQueue[nodeDelegatorContracts]) {
            revert alreadyInNodeDelegatorQueue();
        }
        isNodeDelegatorQueue[nodeDelegatorContracts] = true;
        nodeDelegatorQueue.push(nodeDelegatorContracts);

Assessed type

Invalid Validation

#0 - c4-pre-sort

2023-11-16T02:51:38Z

raymondfam marked the issue as insufficient quality report

#1 - c4-pre-sort

2023-11-16T02:51:45Z

raymondfam marked the issue as duplicate of #36

#2 - c4-judge

2023-11-29T21:35:51Z

fatherGoose1 changed the severity to QA (Quality Assurance)

#3 - c4-judge

2023-11-29T21:42:35Z

fatherGoose1 marked the issue as grade-b

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter