Kelp DAO | rsETH - amaechieth'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: 159/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
QA (Quality Assurance)
satisfactory
sufficient quality report
duplicate-479
Q-79

External Links

Lines of code

https://github.com/code-423n4/2023-11-kelp/blob/f751d7594051c0766c7ecd1e68daeb0661e43ee3/src/LRTDepositPool.sol#L109 https://github.com/code-423n4/2023-11-kelp/blob/f751d7594051c0766c7ecd1e68daeb0661e43ee3/src/LRTDepositPool.sol#L151-L156

Vulnerability details

Impact

Significant loss of user funds, when calling depositAsset the user will lose their depositAmount and receive 0 RsETH in return due to a rounding area, for specific assets.

Proof of Concept

The protocol intends to use Chainlink Price Feeds as the price oracle however they haven't considered the fact that most price feeds denominated in USD return prices to 8 decimals.

This is problematic as RsETH is 18 decimals, therefore in getRsETHAmountToMint the returned amount to mint will likely round to 0 for these assets as you can see here.

// calculate rseth amount to mint based on asset amount and asset exchange rate rsethAmountToMint = (amount * lrtOracle.getAssetPrice(asset)) / lrtOracle.getRSETHPrice(); }

The value from getAssetPrice is computed as so:

function getAssetPrice( address asset ) public view onlySupportedAsset(asset) returns (uint256) { return IPriceFetcher(assetPriceOracle[asset]).getAssetPrice(asset); }

As you can see the value is used directly, without any consideration of the decimals.

Also, the depositAsset function doesn't allow the user to specify a minimum amount of RsETH to receive and there is no validation of the minted amount, meaning should this rounding error occur it will not be caught.

Tools Used

manual

Account for the decimals from the returned value of the price feed, and allow users to specify a minimum amount of RsETH to receive.

Assessed type

Invalid Validation

#0 - c4-pre-sort

2023-11-16T04:38:52Z

raymondfam marked the issue as sufficient quality report

#1 - c4-pre-sort

2023-11-16T04:39:16Z

raymondfam marked the issue as duplicate of #97

#2 - c4-pre-sort

2023-11-17T08:02:06Z

raymondfam marked the issue as duplicate of #479

#3 - c4-judge

2023-12-01T18:01:01Z

fatherGoose1 changed the severity to 2 (Med Risk)

#4 - c4-judge

2023-12-01T18:06:36Z

fatherGoose1 marked the issue as satisfactory

#5 - c4-judge

2023-12-04T17:24:48Z

fatherGoose1 changed the severity to QA (Quality Assurance)

#6 - c4-judge

2023-12-08T18:52:48Z

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