被朋友Q到近期火熱的羊毛事件,截止目前,不僅是黑客獲利超20W刀, FTX損失108+個ETH ,合計有38名同樣思路的攻擊者部署合約發起攻擊。
本文從技術維度出發,深入分析此利用FTX交易所免手續費提幣的漏洞,結合智能合約回調發起的攻擊方式,並通過樣例代碼復現實現原理。
由於FTX已經通過人工審計針對攻擊者進行懲罰,該漏洞處於風險可控階段。切勿嘗試可能導致封號沒收質押物。
1、背景
1.1 XEN是什麼?
是近期大火的一個XEN幣,到10-15為止已有超過120W筆交易,其實筆者對這類缺乏長期價值對Web3毫無建設性意義的項目一直沒什麼興趣,因為他的機制就是只要發起的交易消耗了多少的GAS,就可以鑄造出一定數量的XEN幣,而眾所周知Etherscan有針對gas消耗的排行榜
可以看到真正出色的項目往往由於服務用戶多交易量大,所以gas消耗高排名靠前,彷彿成了另一種的應用商店熱門榜單,而XEN一舉通過“衝票“成了冠絕以太坊整個生態的Top1,且等於其他好項目的總和。
可拓展閱讀: 當我們在看Etherscan的時候,到底在看什麼?
1.2 受害方FTX交易所
本次被攻擊的也正是其免費提幣的優惠活動,在平台有質押且有一定交易記錄後即可發起免費提幣,而提幣會受制於之前交易量(因此本文僅出於科普分析攻擊手法,請勿模仿,易於被FTX官方封號沒收質押資產)
1.3 鏈上數分結果
其實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”獲得
2、黑客攻擊流程分析
2.1 核心原理
智能合約的fallback/receive可任意執行邏輯。
任何一個合約都有默認的fallback函數,典型的功能就是讓合約可以接收以太幣並對其做出反應,這也是代幣型合約用來拒絕轉賬、發出事件或轉發以太幣的典型模式。後來更多場景是應用在代理升級模式(合約部署鏈上本身不可更改,但可以修改指向新的合約,從而實現一定程度上的升級)
總之就是,一筆指向合約地址的交易,如果沒有匹配到對應執行的函數,就必然會執行fallback函數,而fallback可以將輸入參數指向另一個合約地址,從而執行對應的邏輯。
參考:https://blog.soliditylang.org/2020/03/26/fallback-receive-split/
2.2 攻擊流程
其實看完手法核心,已經很明顯了
- 黑客先部署了一個攻擊合約0xCba9b1
- 然後利用FTX的交易免費提幣功能
- 讓FTX的熱錢包0xc098b2,發起了一筆指向攻擊合約的提幣
- 導致交易觸髮指向XEN合約的Mint函數調用
- 由於XEN合約可以設置Mint出代幣的收益方,從而將代幣轉入黑客地址
2.3 手法還原
其實任意fallback非常好觸發,咱們通過現場手搓實現下,當然並不是MintXen,而是臨時隨意的一個20token來示意。
下文便是最簡單的一個ERC20代幣了,任何人均可執行mint函數,雷同於XEN了
對於ERC20/721實現原理可拓展閱讀: 【源碼解讀】你買的NFT到底是什麼?
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管理。
3、總結-從攻擊事件看“元交易”
其實如果不是黑客本身知道FTX有免費提幣優惠,且其提幣的交易的gasLimit設置為固定值50W,則很難發起這樣的攻擊,因為依據以太坊黃皮書,普通轉賬也僅僅需要2.1W的gas即可。
黑暗森林的web裡知其雄守其雌,這樣的攻擊從歷史進程來看,其實更有警示性意義
筆者想談談元交易的發展
元交易是來自於Christian Lundkvist教授在2015年的一個設想
如今上手Dapp 實在是太麻煩了,以太坊生態若想普及,就應該允許新用戶直接使用其功能,而不是先安排幾座大山讓用戶翻山越嶺。這意味著需要為新來的用戶墊付Gas 費用。當前的以太坊協議並沒有提供原生方法來實現這一點。然而,得益於公/私密鑰對,用戶可以通過對元交易進行簽名並證明所有權。
相信未來元交易終會成為應用主流,本次的FTX代付gas執行免費提幣轉賬還只是元交易的某種小小(偽)實現,但只有安全+無感才能迎接全民低成本上鍊時代的到來(而非低代幣gas價格) ,為此安全與風控都需要特別注意,這也是筆者分析安全案件的初衷。
歡迎你從後台提交web3行業問題探討
點贊關註十四,用技術視角帶給你價值