本次攻擊如何發生?

封面: Photo by Mika Baumeister on Unsplash

2023 年 4 月 5 日,據 Beosin-Eagle Eye 態勢感知平臺消息,Arbitrum 鏈的 Sentiment 專案遭受駭客攻擊,駭客獲利約 1 百萬美元,不過在專案方的 “感化” 下,駭客已退還大部分資金。

據瞭解,Sentiment 是一個 Defi 借貸專案。 借貸邏輯是 Sentiment 為使用者開設帳戶,用戶通過此帳戶將資產質押到其他項目獲取收益,並且在質押之後也可以進行借貸。 本次攻擊如何發生,請聽我們詳細分解。

圖片

事件相關信息

攻擊交易

0xa9ff2b587e2741575daf893864710a5cbb44bb64ccdc487a100fa20741e0f74d

攻擊者位址

0xdd0cdb4c3b887bc533957bc32463977e432e49c3

攻擊合約

0x9f626f5941fafe0a5b839907d77fbbd5d0dea9d0

被攻擊合約

0x62c5aa8277e49b3ead43dc67453ec91dc6826403

攻擊流程

跟著 Beosin 一起來看看駭客是如何對 Sentiment 專案「下手」的。

1. 攻擊者首先從 Tornado.Cash 提取 1ETH 到其乙太坊帳戶,然後通過跨鏈橋將 0.7ETH 轉入到其 Arbitrum 帳戶做好 gas 準備。  然後部署了他的攻擊合約。

2. 接著攻擊者發起攻擊交易,首先攻擊合約通過閃電貸獲得 606 個 WBTC,10050 個 WETH 和 18,000,000 個 USDC。 然後,攻擊合約在 Sentiment 專案中按照專案方的正常業務邏輯創建帳戶,並只在帳戶中質押了 50 個 WETH,再通過 Sentiment 專案的 AccountManager 合約將這 50 個 WETH 添加到 Balancer 專案的 Balancer: Vault 合約中。 為價格操控之後的借款提供質押記錄。

圖片

3. 可以看到,上面的質押是通過 Sentiment 開設的帳戶進行的,之後攻擊合約以合約身份向 Balancer 提供大量流動性,一共花費了 606 個 WBTC,10000 個 WETH 和 18,000,000 個 USDC。

圖片4. 緊接著攻擊者調用 Balancer: Vault.exitPool()函數取回流動性,這個過程中 Balancer: Vault 會向攻擊者轉帳從而調用攻擊者預先構造好的 fallback 函數。

圖片

5. 在 fallback 函數中,攻擊者調用了 Sentiment 專案的 borrow 進行借貸。 按照借貸的邏輯,借款需要檢查借款人的質押,而 Sentiment 確實通過 RiskEngine.isAccountHealthy()進行了檢查。

圖片

6. 這裡的檢查是通過 WeightedBalancerLPOracle.getPrice()函數獲取抵押物價格,而該函數依賴 Balancer: Vault.getPoolTokens()傳回的數據。 由於這時攻擊者退出流動性的操作還沒有完成,這裡返回的數據是包含了攻擊者流動性的舊數據。

圖片

7. 這個舊數據導致了預言機的價格計算錯誤,WeightedBalancerLPOracle.getPrice()傳回價格由正常的 220132731298820699 變成了 3550073070005057760,提升了約 16 倍,使得攻擊者抵押的 50WETH 價值升高,從而能取出更多資產。

8. 攻擊者通過多個 borrow 和 exec,最終獲取了 0.5 個 WBTC、30 個 WETH、538,399USDC 和 360,000USDT。 然後通過跨鏈回到了攻擊者的乙太坊位址,並全部換成了 517 個 ETH,價值約 1 百萬美元。

漏洞分析

根據 Beosin 安全團隊的分析,本次攻擊主要利用了重入導致的價值計算錯誤。 這一漏洞的主要原因是 Sentiment 專案未考慮到 Balancer: Vault._joinOrExit()函數在流動性移除時,先轉移資產再更新池子餘額。 導致在轉移 ETH 資產時, 會觸發攻擊合約的 fallback 調用,此時攻擊合約借款,Sentiment 採用未更新的 Balancer 的數據計算價格,導致比質押更多的資產被借出。

Sentiment 的价格计算函数:

图片

Balancer 项目的流动性添加与移除函数:

圖片

資金追蹤

Beosin Trace 追蹤發現,被盜資金為 517 個 ETH,經專案方與駭客協商,其中 51ETH 為賞金已被駭客轉移到 Tornado.Cash,其餘資金已歸還專案方。

圖片

總結

針對本次事件,Beosin 安全團隊建議:

1. 在合約開發時,採用檢查-影響-交互模式。 並且在多個合約相互依賴時需要更加注意合約之間的影響帶來的安全問題。

2. 專案與其他專案有數據依賴時,需要謹慎考慮專案之間的結合是否會導致新的安全問題出現。 盡量通過原始數據作為自己邏輯的參考,減少對其他項目運算結果的依賴。

免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。