Kelp DAO | rsETH - TeamSS'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: 121/185

Findings: 1

Award: $2.76

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

2.7592 USDC - $2.76

Labels

bug
downgraded by judge
grade-b
QA (Quality Assurance)
sufficient quality report
duplicate-723
Q-09

External Links

Lines of code

https://github.com/code-423n4/2023-11-kelp/blob/f751d7594051c0766c7ecd1e68daeb0661e43ee3/src/oracles/ChainlinkPriceOracle.sol#L34

Vulnerability details

Impact

Lacking proper price feeds oracle data can lead to the usage of stale prices for any of the supported assets - cbETH, rETH, etc in the system will result in incorrect calculations during the minting of rsETH in the protocol. This is an undesired behavior and may lead to users minting an incorrect amount of rsETH.

POC

When a user deposits a supported asset into the protocol, the equivalent amount of rsETH that the user receives is dependent on the chainlink price feed for that particular asset as seen here:

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

The current implementation lacks proper oracle price feed validation which would lead to multiple problems such as:

  • the code doesn't revert when price of supported asset == 0
  • price staleness is not checked.

Oracle price feeds can become stale for a number of reasons.

This could lead to stale prices according to the Chainlink documentation:

And there is no check if the return value is stale data.

Recommendation

Consider refactoring the ChainlinkPriceOracle::getAssetPrice() function to include proper price feeds oracle validation for cases where the a zero value or staled price is returned, as demonstrated in the provided code snippet.

For example:

    /////////////////////////////////////////////////////
    // ERRORS
    /////////////////////////////////////////////////////

    error ChainlinkPriceOracle__StalePrice();
    error ChainlinkPriceOracle__PriceCannotBeZero(); 

    // 1 hour buffer period used in this example. protocol team must decide proper buffer period suitable for Kelp DAO.
    uint256 private constant STALENESS_TOLERANCE = 25 hours; // 25 * 60 (minutes) * 60 (seconds) = 90000 seconds

  function getAssetPrice(address asset) external view onlySupportedAsset(asset) returns (uint256 price) {
        (, int256 price, , uint256 updatedAt,) =
            AggregatorInterface(assetPriceFeed[asset]).lastestRoundData();
        uint256 secondsSince = block.timestamp - updatedAt;

        if (secondsSince > STALENESS_TOLERANCE) {
            revert ChainlinkPriceOracle__StalePrice();
        } 

        if (price <= 0) {
            revert ChainlinkPriceOracle__PriceCannotBeZero(); 
        }
        // cast to uint256 since price already checked to be > 0. 
        uint256(price);
    }

Alternatively, use a secondary oracle. While this is in the works for the protocol, the price feed oracle data validation is important for the current implementation which uses only Chainlink for price feeds.

Tool used

Manual Review

Assessed type

Oracle

#0 - c4-pre-sort

2023-11-16T04:59:36Z

raymondfam marked the issue as sufficient quality report

#1 - c4-pre-sort

2023-11-16T04:59:45Z

raymondfam marked the issue as duplicate of #32

#2 - c4-pre-sort

2023-11-17T05:05:46Z

raymondfam marked the issue as not a duplicate

#3 - c4-pre-sort

2023-11-17T05:05:58Z

raymondfam marked the issue as duplicate of #194

#4 - c4-pre-sort

2023-11-17T07:36:37Z

raymondfam marked the issue as duplicate of #723

#5 - c4-judge

2023-12-01T17:38:31Z

fatherGoose1 changed the severity to QA (Quality Assurance)

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