iT邦幫忙

1

資安攻防 (五):預言機操縱 (Oracle Manipulation) 與閃電貸攻擊

  • 分享至 

  • xImage
  •  

前幾篇我們討論的重入攻擊、整數溢位或是權限控制漏洞,大多是單一合約內部「程式碼邏輯」上的瑕疵。
但在去中心化金融(DeFi)的世界裡,各個協議就像樂高積木一樣可以互相串接(可組合性 Composability)。有時候單看 A 合約沒問題,單看 B 合約也沒問題,但當駭客把兩者組合起來時,就會引發毀滅性的金融核彈。這次我們就要來介紹 DeFi 資安史上最華麗、損失金額也最龐大的攻擊組合技:閃電貸結合預言機操縱。

什麼是閃電貸 (Flash Loan)?
在傳統金融中,你要借幾千萬美金,必須要有對等的抵押品與信用評級。但在 Web3 的世界裡,有一種魔法叫做「閃電貸」。

閃電貸允許任何人「在不需要任何抵押品的情況下,瞬間借出上千萬美元的加密資產」,唯一的條件是:你必須在「同一筆區塊鏈交易 (Transaction)」結束前,連本帶利把錢還回去。

如果交易執行到最後一行時,合約發現你沒把錢還回來,EVM 的狀態回溯(Revert)機制就會啟動。這筆交易會像從來沒發生過一樣被撤銷,除了消耗掉一點 Gas 費之外,放貸方沒有任何損失。

閃電貸原本是設計來給套利者平衡各個交易所價格差的好工具,但它同時也賦予了駭客「無限的資金彈藥」,讓他們能夠輕易撼動市場價格。

致命弱點:依賴單一 DEX 的預言機 (Oracle)
智慧合約就像是被關在一個沒有窗戶的房間裡,它無法自己上網去查「現在一顆以太幣值多少美金」。它必須依賴預言機 (Oracle) 將外部的價格數據送進鏈上。

很多早期的借貸協議(Lending Protocol)為了省事,會直接把我們在 Day 12 寫的那種單一去中心化交易所(如 Uniswap V2 的單一資金池)當作唯一的價格來源。這在平時可能沒問題,但遇到擁有無限資金的閃電貸駭客時,這就是一個巨大的致命傷。

駭客劇本:五步掏空借貸協議
讓我們模擬一個真實的攻擊場景。假設有一個借貸協議,允許用戶抵押「代幣 A」來借出價值 100 萬美元的「穩定幣 USDC」。而這個協議計算「代幣 A」價值的方式,是直接去看某個 DEX 池子裡的現貨價格。

駭客的閃電貸攻擊腳本如下(這一切都在幾秒鐘的一筆交易內完成):

  1. 借取鉅款:駭客透過 Aave 或 dYdX 發動閃電貸,借出 1,000 萬顆「代幣 A」。
  2. 暴力砸盤 (操縱預言機):駭客把這 1,000 萬顆代幣 A 全部倒進那個 DEX 資金池裡。根據我們學過的 AMM 恆定乘積公式 (x * y = k),代幣 A 的數量暴增,會導致代幣 A 的價格瞬間崩盤跌到趨近於零,同時池子裡的另一種代幣 B 價格會暴漲。
  3. 趁虛而入 (超額借貸):如果駭客這時候拿著暴漲的代幣 B 去抵押,或者在砸盤前先抵押了代幣 A,此時借貸協議去查 DEX 的價格,會得到一個「被嚴重扭曲的假報價」。駭客便利用這個假報價,從借貸協議中合法借出(實際上是掏空)所有的 USDC 穩定幣。
  4. 反向操作:駭客在 DEX 進行反向交易,讓價格稍微回穩,並換回足夠的代幣 A。
  5. 歸還閃電貸:駭客把 1,000 萬顆代幣 A 還給閃電貸提供者。
    結果: 交易成功上鏈!駭客空手套白狼,賺走了幾百萬美元的 USDC,而借貸協議裡只留下一堆因為砸盤而變得一文不值的抵押品,導致嚴重的壞帳。

閃電貸本身不是漏洞,它只是一個工具;真正的漏洞在於借貸協議設計了脆弱且容易被操縱的預言機機制。這種攻擊無法單靠程式碼的語法掃描抓出來,必須依賴資安稽核人員對整體經濟模型的深度理解。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言