漏洞信息
漏洞报告
- https://code4rena.com/audits/2025-08-morpheus/submissions/S-709
漏洞代码
- https://github.com/code-423n4/2025-08-morpheus/blob/a65c254e4c3133c32c05b80bf2bd6ff9eced68e2/contracts/capital-protocol/ChainLinkDataConsumer.sol#L78-L107
漏洞背景
Heartbeat
Heartbeat 是 ChainLink 价格更新的周期,不同的 Data Feeds 会拥有不同的 Heartbeat。
比如 稳定币/USD
和 BTC/ETH
价格的 Heartbeat 约为 24 小时。
ETH/USD
价格的 Heartbeat 约为 1 小时。
漏洞案例
在 ChainLinkDataConsumer 合约中,通过 getChainLinkDataFeedLatestAnswer() 函数返回 pathId_ 对应的价格。其中 dataFeeds 存储的是价格的计算路径,比如 dataFeeds = [BTC/ETH, ETH/USD] 对应着 BTC/USD 的价格。
在 getChainLinkDataFeedLatestAnswer() 函数中依次读取 dataFeeds 中对应的每个价格,并检查其更新时间间隔是否小于 allowedPriceUpdateDelay。
但是由于不同的 Data Feeds 会拥有不同的 Heartbeat,同样以 dataFeeds = [BTC/ETH, ETH/USD] 为例:
- 当 allowedPriceUpdateDelay 设为 1 H 时,读取 Heartbeat 为 24 H 的 BTC/ETH 价格将会返回 0 值,无法正常进行计算。
- 当 allowedPriceUpdateDelay 设为 24 H 时,由于 ETH/USD 价格的 Heartbeat 为 1 H ,过宽的限制可能会读取到过时的价格,从而计算出错误的最终价格。
修复方案
为每个 Data Feeds 设置对应的 Heartbeat 时间,不要共用同一个阈值时间。
补充材料
ChainLink 的 Data Feeds 之间除了 Heartbeat 有所差异外,价格精度 decimals 也有所不同。
Decimals
不同的 Data Feeds 会有不同的 decimals,基本分为 8 和 18 两类。
比如 ETH/USD 的 decimals 为 8:https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419#readContract
而 BTC/ETH 的 decimals 为 18:https://etherscan.io/address/0xdeb288F737066589598e9214E782fa5A8eD689e8#readContract