前幾篇我們討論的重入攻擊、整數溢位或是權限控制漏洞,大多是單一合約內部「程式碼邏輯」上的瑕疵。
但在去中心化金融(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 池子裡的現貨價格。
駭客的閃電貸攻擊腳本如下(這一切都在幾秒鐘的一筆交易內完成):
閃電貸本身不是漏洞,它只是一個工具;真正的漏洞在於借貸協議設計了脆弱且容易被操縱的預言機機制。這種攻擊無法單靠程式碼的語法掃描抓出來,必須依賴資安稽核人員對整體經濟模型的深度理解。