深入解讀:FTX 交易所免手續費漏洞致使被薅 20W 刀 XEN 羊毛案
從技術出發深入分析此漏洞,用樣例代碼復現攻擊原理
作者:十四君
封面:Photo by Markus Spiske on Unsplash
被朋友 Q 到近期火熱的羊毛事件,來分析本次利用 FTX 交易所免手續費提幣的漏洞,結合智能合約回調發起的攻擊,截止目前,不僅是始作俑者黑客獲利超 10W 刀,更有 15 名同樣思路的攻擊者部署合約發起攻擊。
由於 FTX 已經通過人工審計針對攻擊者進行懲罰,該漏洞處於風險可控階段,所以本文處於科普目的系統的分析攻擊的前因後果與鏈上數據表現,總結對 web3 發展的啓發。
背景
XEN 是什么?
是近期大火的一個 XEN 幣,到 10-15 為止已有超過 120W 筆交易,其實筆者對這類缺乏長期價值對 Web 毫無建設性意義的項目一直沒什么興趣,因為他的機制就是只要發起的交易消耗了多少的 GAS,就可以鑄造出一定數量的 XEN 幣,而衆所周知 Etherscan 有針對 gas 消耗的排行榜
可以看到真正出色的項目往往由於服務用戶多交易量大,所以 gas 消耗高,仿佛成了另一種的應用商店熱門榜單,而 XEN 一舉通過 “衝票 “成了冠絕以太坊整個生態的 Top1,且等於其他好項目的總和。
受害方 FTX 交易所
本次被攻擊的也正是其免費提幣的優惠活動,在平臺有質押且有一定交易記錄後即可發起免費提幣,而提幣會受制於之前交易量(因此本文僅出於科普分析攻擊手法,請勿模仿,易於被 FTX 官方封號沒收質押資產)
鏈上數分結果
其實 mirror 上爆出的還不是最大的攻擊者,而此攻擊手法最早出現在 10-10 號,截止 10-15 號,合計類似邏輯的攻擊地址有 38 個,合計 1.45W 筆攻擊(無法判斷地址背後是否為相同攻擊者)。
計算依據:FTX 熱錢包單筆轉移 gas 消耗大於 5W,且 to 地址是合約地址的交易。
下圖為其中 top10 的攻擊者,其交易數佔總攻擊數的 80%,致使 FTX 手續費損失 86 個 ETH
筆者通過對其交易的 gas 消耗總值核算後,得出 FTX 本次損失總值為:108.19 個 ETh
合計鑄造出 XEN 約 24 億個。按 14 號日常價格估算的話,則黑客總收益在 24W 美金以上
黑客攻擊流程
核心原理
智能合約 fallback/receive 可任意執行邏輯。
任何一個合約都有默認的 fallback 函數,典型的功能就是讓合約可以接收以太幣並對其做出反應,這也是代幣型合約用來拒絕轉账、發出事件或轉發以太幣的典型模式。後來更多場景是應用在代理升級模式(合約部署鏈上本身不可更改,但可以修改指向新的合約,從而實現一定程度上的升級)
總之就是,一筆指向合約地址的交易,如果沒有匹配到對應執行的函數,就必然會執行 fallback 函數,而 fallback 可以將輸入參數指向另一個合約地址,從而執行對應的邏輯。
參考:https://blog.soliditylang.org/2020/03/26/fallback-receive-split/
攻擊流程
其實看完手法核心,已經很明顯了
- 黑客先部署了一個攻擊合約 0xCba9b1
- 然後利用 FTX 的交易免費提幣功能
- 讓 FTX 的熱錢包 0xc098b2,發起了一筆指向攻擊合約的提幣
- 導致交易觸發指向 XEN 合約的 Mint 函數調用
- 由於 XEN 合約可以設置 Mint 出代幣的收益方,從而將代幣轉入黑客地址
攻擊手法還原
其實任意 fallback 非常好觸發,咱們通過現場手搓實現下,當然並不是 MintXen,而是臨時隨意的一個 20token 來示意。
下文便是最簡單的一個 ERC20 代幣了,任何人均可執行 mint 函數,雷同於 XEN 了
對於 ERC20/721 實現原理可拓展閱讀:xx
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract token20 is ERC20 { constructor() ERC20("Gold", "GLD") {} function mint(address to,uint256 amount) public { _mint(to,amount); }}
而攻擊合約也很簡單,設置寫死要調用 Mint 的 XEN 合約地址以及黑客收益的地址。
interface IERC20 {function mint(address to,uint256 amout) external ;}contract attack{ address ERC20Addr = 0xd9145CCE52D386f254917e481eB44e9943F39138; address myAddr = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4; receive() external payable { IERC20(ERC20Addr).mint(myAddr,1e18); selfdestruct(payable(myAddr)); }}
可以看到實驗中,對此攻擊合約發起的任意一筆交易,即會觸發了 receive,且 myAddr 的 GLD 余額增加 1e18 個,當然並不能拿着這個代碼就去復現黑客的實現了,因為要鑄造更多的 GEX 還得增加工廠合約部署的邏輯,即能提高 gas 消耗也吻合 XEG 的 mint 管理。
總結-從攻擊事件看” 元交易 “的發展
其實如果不是黑客本身知道 FTX 有免費提幣優惠,且其提幣的交易的 gasLimit 設置為固定值 50W,則很難發起這樣的攻擊,因為依據以太坊黃皮書,普通轉账也僅僅需要 2.1W 的 gas 即可。
黑暗森林的 web 裏知其雄守其雌,這樣的攻擊從歷史進程來看,其實更有警示性意義
筆者想談談元交易的發展
元交易是來自於 Christian Lundkvist 教授在 2015 年的一個設想
如今上手 Dapp 實在是太麻煩了,以太坊生態若想普及,就應該允許新用戶直接使用其功能,而不是先安排幾座大山讓用戶翻山越嶺。這意味着需要為新來的用戶墊付 Gas 費用。當前的以太坊協議並沒有提供原生方法來實現這一點。然而,得益於公/私密鑰對,用戶可以通過對元交易 進行籤名並證明所有權。
相信未來元交易終會成為應用主流,本次的 FTX 代付 gas 執行免費提幣轉账還只是元交易的某種小小(僞)實現,但只有安全+無感才能迎接全民低成本上鏈時代的到來(而非低代幣 gas 價格),為此安全與風控都需要特別注意,這也是筆者分析安全案件的初衷。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
區塊鏈愛好者
文章數量
34524粉絲數
0