Kelp DAO | rsETH - merlinboii'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: 124/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-114

External Links

Lines of code

https://github.com/code-423n4/2023-11-kelp/blob/main/src/LRTDepositPool.sol#L162-L176 https://github.com/code-423n4/2023-11-kelp/blob/main/src/LRTDepositPool.sol#L71-L89

Vulnerability details

Risk: High

  • Impact: High
  • Likelihood: Medium (Even though restricted to LRT admin, the inability to undo mistakenly added duplicates poses a significant risk)

Impact

The duplicate node delegator addresses in the nodeDelegatorQueue leads to inaccurate calculations of asset amount distribution data of NDCs, and eigenLayer.

This issue is unrecoverable, as the current implementation lacks a mechanism to undo the addition of duplicates.

Vulnerabilities

The addNodeDelegatorContractToQueue function of the LRTDepositPool contract restricts to only the LRT admin to add new node delegator contract addresses by passing the nodeDelegatorContracts array.

File: src/LRTDepositPool.sol

162:     function addNodeDelegatorContractToQueue(address[] calldata nodeDelegatorContracts) external onlyLRTAdmin {

However, this function does not check check whether the given node delegator contract addresses are already added in the nodeDelegatorQueue.

File: src/LRTDepositPool.sol

168:      for (uint256 i; i < length;) {
169:            UtilLib.checkNonZeroAddress(nodeDelegatorContracts[i]);
170:            nodeDelegatorQueue.push(nodeDelegatorContracts[i]);
171:            emit NodeDelegatorAddedinQueue(nodeDelegatorContracts[i]);
172:            unchecked {
173:                ++i;
174:            }
175:        }

As a result, if the LRT admin mistakenly adds node delegator contract addresses that are already included, the calculation of asset amount distribution data of NDCs, and eigenLayer from the getAssetDistributionData function will be incorrect.

File: src/LRTDepositPool.sol

81:        uint256 ndcsCount = nodeDelegatorQueue.length;
82:        for (uint256 i; i < ndcsCount;) {
83:            assetLyingInNDCs += IERC20(asset).balanceOf(nodeDelegatorQueue[i]);
84:            assetStakedInEigenLayer += INodeDelegator(nodeDelegatorQueue[i]).getAssetBalance(asset);
85:            unchecked {
86:                ++i;
87:            }
88:        }

Furthermore the result of that calculation will always incorrect since implementation lacks functionality to remove duplicates from the nodeDelegatorQueue.

Proof of Concept

Tools Used

Foundry

  1. Consider introducing a mapping mechanism to track unique node delegator addresses, ensuring that each node delegator address in the nodeDelegatorQueue array is unique.

For example, introducing the mapping (address => bool) isNodeDelegatorAdded;

  1. Applying the validation step to check the given array with this mapping into the addNodeDelegatorContractToQueue function (L169-171, and L174).
File: src/LRTDepositPool.sol

168:      for (uint256 i; i < length;) {
169:           if (isNodeDelegatorAdded[nodeDelegatorContracts[i]]) {
170:              revert AlredayAddedNodeDelegator();
171:            }
172:            UtilLib.checkNonZeroAddress(nodeDelegatorContracts[i]);
173:            nodeDelegatorQueue.push(nodeDelegatorContracts[i]);
174:            isNodeDelegatorAdded[nodeDelegatorContracts[i]] = true;
175:            emit NodeDelegatorAddedinQueue(nodeDelegatorContracts[i]);
176:            unchecked {
177:                ++i;
178:            }
179:        }

This improvement will ensure accurate calculations in the getAssetDistributionData function.

The recommendation should be considered in alignment with the project's business requirements, and any updates should be tested to ensure they meet the specific needs of the project.

Assessed type

Invalid Validation

#0 - c4-pre-sort

2023-11-15T23:49:12Z

raymondfam marked the issue as insufficient quality report

#1 - c4-pre-sort

2023-11-15T23:49:42Z

raymondfam marked the issue as duplicate of #36

#2 - c4-judge

2023-11-29T21:35:52Z

fatherGoose1 changed the severity to QA (Quality Assurance)

#3 - c4-judge

2023-11-29T21:36:49Z

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