從技術出發深入分析此漏洞,用樣例代碼復現攻擊原理

作者:十四君

封面: 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,且等於其他好項目的總和。

本文涉及較多鏈上數據分析可拓展閱讀:etherscan

受害方 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 美金以上

詳細數據可< 十四君> 公眾號後台輸入”FTX 與 XEN” 獲得

黑客攻擊流程

核心原理

智能合約 fallback/receive 可任意執行邏輯。

任何一個合約都有默認的 fallback 函數,典型的功能就是讓合約可以接收以太幣並對其做出反應,這也是代幣型合約用來拒絕轉賬、發出事件或轉發以太幣的典型模式。後來更多場景是應用在代理升級模式(合約部署鏈上本身不可更改,但可以修改指向新的合約,從而實現一定程度上的升級)

總之就是,一筆指向合約地址的交易,如果沒有匹配到對應執行的函數,就必然會執行 fallback 函數,而 fallback 可以將輸入參數指向另一個合約地址,從而執行對應的邏輯。

參考:https://blog.soliditylang.org/2020/03/26/fallback-receive-split/

攻擊流程

其實看完手法核心,已經很明顯了

  1. 黑客先部署了一個攻擊合約 0xCba9b1
  2. 然後利用 FTX 的交易免費提幣功能
  3. 讓 FTX 的熱錢包 0xc098b2,發起了一筆指向攻擊合約的提幣
  4. 導致交易觸髮指向 XEN 合約的 Mint 函數調用
  5. 由於 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 價格),為此安全與風控都需要特別注意,這也是筆者分析安全案件的初衷。

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