XREX 資安長開源兩套 Web3 資安工具 強化智能合約安全開發
編按:XREX 資安長暨總經理 Sun Huang 擁有超過 15 年的國際資安經驗,並獲得 Offensive Security Certified Professional (OSCP)、Certified Ethical Hacker (CEH)、AWS Certified Security - Specialty (AWS ACS) 等國際資安執照及認證。近期,Sun 開源兩套 Web3 資安工具,協助工程師與開發者強化智能合約安全開發。Sun 撰寫本文,分享開發工具的緣由,並分享實例示範如何使用這兩套工具。
做為 XREX 資安長,我從今年 3 月開始主持公司內部培訓,提升資安團隊的兩大技能:Web3 資安分析能力,以及虛擬貨幣鏈上金流的威脅分析,也對 XREX 產品工程團隊舉辦了兩次 Web3 資安工作坊,這也是我分別在今年 6 月和 7 月開源兩套 Web3 資安工具 DeFiHackLabs 和 DeFiVulnLabs 的緣由。
每一次只要有 DeFi 項目遭駭,XREX 內部都會分析事件的根本原因並嘗試重現問題。我們會透過 Fork 主網特定區塊狀態,模擬駭客攻擊智能合約的手法,並觀察餘額狀態的改變。每一次的攻擊事件都可以幫助我們在未來開發時,避免踩到同樣的坑、犯同樣的錯。
我心想,這些寶貴的經驗也應該讓更多人受惠,因此就在 6 月中開源了一個 Web3 安全相關的工具 DeFiHackLabs ,將過往累積的資安事件概念性驗證程序 (Proof of Concept,PoC) 都收錄進去。我使用 Paradigm 推出的以太坊開發工具 Foundry 做為框架,因為編譯快速、集成了很多實用功能,使用起來非常順手,更多 Foundry 使用的相關資訊,可參考 Foundry Book。
原先我的初衷只是希望在 Web3 的發展過程中,為資安做點貢獻,如常地發到 Twitter 做個紀錄。非常意外的是,隔日我收到了無數 Twitter 通知,才知道原來我的推文被 Paradigm 的技術長 Georgios Konstantopoulos 轉推,引起社群很好的響應。
隨後有許多人私訊我,想了解有沒有適合新手或剛入圈的工程師的 Solidity 常見漏洞教學。了解到這些需求後,我在 7 月初再開源了另一個工具 DeFiVulnLabs,整理了常見 Solidity 的漏洞測試與防禦方式,當天推文的轉推數量與單日 4 萬次的訪問量蠻令我驚訝的,由此也可以知道,有非常多人對區塊鏈技術的開發非常感興趣,積極想要增進資安能力並從過往的事件中學習,這讓我非常振奮,也很期待未來持續在 Web3 安全領域做出貢獻。
這篇部落格,也與各位分享 DeFiHackLabs 和 DeFiVulnLabs 這兩套 Web3 資安工具和使用方式,希望在大家打造智能合約與開發 DeFi 項目時,可以免於在區塊鏈黑暗森林中迷失與跌倒。
DeFiVulnLabs
(難度等級: 初級)
DeFiVulnLabs 目前收錄了 19 種智能合約的常見漏洞類型,如下表所列:
使用方式
以 ERC777 callbacks and reentrancy 為例:
智能合約要求代幣總供給量必須 ≤ 1000 顆,否則不允許鑄造新的代幣。你能繞過最大總供給量限制嗎?
ERC777 callbacks and reentrancy 原始碼連結
執行: forge test --contracts ./src/test/ERC777-reentrancy.sol -vvvv
-v 參數代表顯示測試程式碼的 logs 與 Execution traces,共有 5 個 Level。
執行輸出如下所示:
執行輸出顯示攻擊者成功繞過限制,產出額外 9,000 顆代幣
我們節錄關鍵 Execution traces 向讀者解讀為何 Token 餘額可以從 1,000 增加至 10,000,如下圖所示:
重入攻擊 Execution traces
可以看到當攻擊合約 ContractTest 呼叫 MyERC777.transfer() 時,ERC1820Registry 合約會回調呼叫 ContractTest.tokensReceived(),這意味著攻擊者可以在 tokensReceived() 裡寫入惡意程式碼並再次重新進入 MyERC777 合約的執行流程。
此處的惡意程式碼是再次呼叫 MyERC777.mint(),使代幣合約再次鑄造 9,000 顆 Token 給攻擊合約。最後就可以看到攻擊合約的餘額共有 10,000 顆 Token 了。
DeFiHackLabs
(難度等級: 中級)
DeFiHackLabs 目前收錄了 42 個過往 DeFi 資安事件重現,可以從真實世界中了解過往的駭客攻擊手法,並在開發智能合約時避免踩到一樣的坑。近期 Foundry 支援了可以一次 fork 不同區塊,也可以跨鏈,不需要從 CLI 帶入 fork-url & fork-block-number 參數,在測試上又更方便了!
使用方式
以 InverseFinance - Flashloan & Price Oracle Manipulation 為例:
Inverse Finance 項目在 2022 年 6 月 16 日時,遭受閃電貸攻擊,損失約 120 萬美金,由於項目方實作了不安全的預言機來計算抵押品價格,導致攻擊者可透過閃電貸操控抵押品價格來獲利。
執行: forge test --contracts ./src/test/InverseFinance_exp.sol -vvvv
希望以上兩個工具的分享,可以幫助想要開發 Web3 項目的團隊加強智能合約的安全性與韌性。若有任何疑問,也歡迎在推特上(@1nf0s3cpt)與我交流。
XREX 將在 8 月 19 日至 20 日出席 2022 HITCON x Yourator 數位職涯博覽會。歡迎有志之士前來與我們聊聊。到時見!
本文刊登於《鏈新聞》:XREX資安長開源兩套Web3資安工具,強化智能合約安全開發
共同編撰:Sun Huang / Seal Cao 曹富翔 / Yoyo Yu 尤芷薇 / Fred Lai 賴彥志