Morpheus 審計報告分享2:ChianLink 數(shù)據(jù)源有著不同的“心跳”
漏洞信息
漏洞報告
漏洞代碼
漏洞背景
Heartbeat
Heartbeat 是 ChainLink 價格更新的周期,不同的 Data Feeds 會擁有不同的 Heartbeat。
比如 穩(wěn)定幣/USD 和 BTC/ETH 價格的 Heartbeat 約為 24 小時。

ETH/USD 價格的 Heartbeat 約為 1 小時。

漏洞案例
在 ChainLinkDataConsumer 合約中,通過 getChainLinkDataFeedLatestAnswer() 函數(shù)返回 pathId_ 對應(yīng)的價格。其中 dataFeeds 存儲的是價格的計算路徑,比如 dataFeeds = [BTC/ETH, ETH/USD] 對應(yīng)著 BTC/USD 的價格。
在 getChainLinkDataFeedLatestAnswer() 函數(shù)中依次讀取 dataFeeds 中對應(yīng)的每個價格,并檢查其更新時間間隔是否小于 allowedPriceUpdateDelay。

但是由于不同的 Data Feeds 會擁有不同的 Heartbeat,同樣以 dataFeeds = [BTC/ETH, ETH/USD] 為例:
- 當 allowedPriceUpdateDelay 設(shè)為 1 H 時,讀取 Heartbeat 為 24 H 的 BTC/ETH 價格將會返回 0 值,無法正常進行計算。
- 當 allowedPriceUpdateDelay 設(shè)為 24 H 時,由于 ETH/USD 價格的 Heartbeat 為 1 H ,過寬的限制可能會讀取到過時的價格,從而計算出錯誤的最終價格。
修復(fù)方案
為每個 Data Feeds 設(shè)置對應(yīng)的 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


浙公網(wǎng)安備 33010602011771號