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
Rank: 121/185
Findings: 1
Award: $2.76
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: m_Rassska
Also found by: 0x1337, 0xAadi, 0xHelium, 0xLeveler, 0xblackskull, 0xbrett8571, 0xepley, 0xffchain, 0xluckhu, 0xmystery, 0xrugpull_detector, 0xvj, ABAIKUNANBAEV, Aamir, AerialRaider, Amithuddar, Bauchibred, Bauer, CatsSecurity, Cryptor, Daniel526, Draiakoo, Eigenvectors, ElCid, GREY-HAWK-REACH, Inspecktor, Juntao, King_, LinKenji, Madalad, MaslarovK, Matin, MatricksDeCoder, McToady, Noro, PENGUN, Pechenite, Phantasmagoria, RaoulSchaffranek, SBSecurity, SandNallani, Shaheen, Soul22, Stormreckson, T1MOH, Tadev, TeamSS, TheSchnilch, Topmark, Tumelo_Crypto, Udsen, Yanchuan, ZanyBonzy, _thanos1, adeolu, adriro, alexfilippov314, almurhasan, amaechieth, anarcheuz, ayden, baice, bareli, boredpukar, bronze_pickaxe, btk, cartlex_, catellatech, chaduke, cheatc0d3, circlelooper, codynhat, crack-the-kelp, critical-or-high, debo, deepkin, desaperh, dipp, eeshenggoh, evmboi32, ge6a, gesha17, glcanvas, gumgumzum, hals, hihen, hunter_w3b, jasonxiale, joaovwfreire, ke1caM, leegh, lsaudit, marchev, merlinboii, niser93, osmanozdemir1, paritomarrr, passion, pep7siup, phoenixV110, pipidu83, poneta, ro1sharkm, rouhsamad, rvierdiiev, sakshamguruji, seerether, shealtielanz, soliditytaker, spark, squeaky_cactus, stackachu, supersizer0x, tallo, taner2344, turvy_fuzz, twcctop, ubl4nk, wisdomn_, xAriextz, zach, zhaojie, zhaojohnson, ziyou-
2.7592 USDC - $2.76
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.
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:
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.
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.
Manual Review
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)