特別感謝 阿德里安·赫特曼, 亞歷杭德羅·穆尼奧斯-麥當勞, 伊万·貝納維德斯, 和 萊昂太空行者.
智能合約漏洞搜尋的7 大策略
尋找智能合約漏洞可能是一項高薪的可笑工作,它也是保護生態系統免受黑客攻擊的一個組成部分。我最近有幸 採訪開發者 誰發現了一個價值70 億美元的漏洞——並且 支付了220 萬美元 報告它。
在此博客中,我們將介紹此開發人員發現的錯誤以及它如何有可能損害7b 美元的價值,然後再提供一些有助於您發現錯誤的策略和工具。
讓我們潛入水中。
多邊形智能合約錯誤示例
積聚
2020 年5 月31 日, Matic 區塊鏈上線 (Matic 後來更名為 多邊形)。 Polygon 是一個與EVM 兼容的區塊鏈,以其低gas 費用和短出塊時間而聞名。該連鎖店最近開始探索 zk-rollup 技術.
如果你看看 塊 0 Polygon 是區塊鏈的絕對第一個區塊,也稱為“創世”區塊,您將看到10 筆交易。其中一項交易創建了一個名為MRC20 的合約。
這份合同是什麼?
當我們發送一個原生區塊鏈代幣時,我們必須花費gas 才能這樣做。因此,Polygon 團隊部署了一份合約,允許您簽署交易以向某人發送ETH,而其他人則可以為此交易支付gas 費用。這種能力被稱為“元交易”,隨著 EIP-712.
您可以看到,該合約獲得了近100 億個MATIC 代幣,以幫助促進這些無氣體交易。然而,這個聰明的合約包含一個可能被利用來耗盡整個餘額的漏洞!
2021年12月3日故事主人公,偽匿名開發者 萊昂太空行者提交報告給 免疫缺陷賞金 程序列出了這個確切功能的細節。第二個英雄,我們稱之為Whitehat2,也在一天后報告了這個漏洞。
在鏈最終分叉、回滾和修復之前,大約有800,000 個MATIC 代幣被盜 2021 年12 月5 日。
這給我們留下了更多問題:漏洞是什麼?怎麼這麼久都沒被發現?它是如何被發現的?
漏洞利用
以下是促進這些無氣體交易的功能。
function transferWithSig( bytes calldata sig, uint256 amount, bytes32 data, uint256 expiration, address to ) external returns (address from) { require(amount > 0); require( expiration == 0 || block.number <= expiration, "Signature is expired" ); bytes32 dataHash = getTokenTransferOrderHash( msg.sender, amount, data, expiration ); require(disabledHashes[dataHash] == false, "Sig deactivated"); disabledHashes[dataHash] = true; from = ecrecovery(dataHash, sig); _transferFrom(from, address(uint160(to)), amount); }
乍一看,這似乎是無害的:它需要用戶的簽名、有多少代幣以及他們想將它們發送給誰,以及任何進一步的數據,以及交易的到期日期。
它運行一些要求,獲取數據散列以發送元事務,確保數據散列未被使用,然後執行此操作 ecrecovery
功能。
這個函數本質上是一個包裝器 Solidity ecrecover 功能.
此功能是我們如何驗證簽名交易的來源。你會注意到,即使在Solidity 文檔中,它也說它將“在錯誤時返回零”。這 ecrecovery
函數複製了這個,如果它有問題,它將返回0。正如許多開發人員所知,這可能很可怕。如果它在錯誤時返回零,這意味著我們應該檢查以確保返回的地址不為零,對嗎?
這是實際的代碼:
以下是可能應該存在的內容:
所以我們不對地址進行檢查以確保它沒有導致錯誤。不是問題。我們的最後一行代碼 transferWithSig
函數進行實際傳輸,我們肯定會在那裡進行某種檢查,對吧?
function _transfer(address sender, address recipient, uint256 amount) internal { require(recipient != address(this), "can't send to MRC20"); address(uint160(recipient)).transfer(amount); // It just sends the money! emit Transfer(sender, recipient, amount); }
這 _transferFrom
函數剛剛調用了我們的 _transfer
功能,如上圖。你會注意到它沒有檢查以確保 from
地址有足夠的錢。
這意味著有人可以發送無效簽名,這將導致從ecrecovery 返回零地址,但MRC20 合約仍將發送 to
處理一筆錢。這就是9,999,993,000 MATIC 可能被耗盡的方式,因為MRC20 合約直接從自己發送資金!
檢查以確保 from
address 有足夠的錢用於此已簽名的交易將阻止此問題。
智能合約漏洞如何躲避發現這麼久?
令我感到奇怪的是,在潛伏了將近一年半的漏洞之後,幾天之內就被另一個白帽黑客Leon 發現了。
好像很腥但Immunefi 團隊告訴我,這種情況經常發生。一些漏洞利用可能會因一篇文章、文章或 挑戰 然後人們開始尋找這個漏洞,導致幾個人同時發現它。
但更有可能的是,polygon 大約在這個時候驗證了Polygonscan 上的合同——所以那時人們 真的 開始看它。
也許故事還有更多,但也許沒有。
無論如何,讓我們把這個bug 作為一個可教的時刻,看看Leon 和其他bug 獵人用來發現bug 的一些技巧,幫助保護Web3 生態系統。
七大策略
現在,我們將學習Leon 和其他漏洞獵人用來發現這些漏洞並獲得漏洞賞金的技能。此提示列表假設您已經了解智能合約的基礎知識,所以是的, 學習Solidity 是先決條件.
使用這些超能力 道德黑客請記住 負責任地披露 您發現的任何漏洞。
發現漏洞的許多工作都來自於查看代碼和運行工具,例如 滑行. 對於這筆220 萬美元的支出,Leon 說他能夠通過逐行查看智能合約代碼來找到漏洞,所以請記住,查找漏洞通常是一項巨大的手動操作!
除了下面的實用技巧之外,Leon 最大的收穫是讓智能合約漏洞獵手“找到你的優勢”,但他的意思是什麼?通常,這意味著要找到使您與其他黑客不同的東西。作為一個社區,我們需要覆蓋智能合約空間的每一個角落,所以找到一個你特別擅長和擅長的部分。
以下是幫助您找到優勢的七種策略和技巧,讓您成為成功的智能合約漏洞獵手。
1. 找項目,找Bug
找到錯誤的第一種方法是了解協議的每一寸工作原理。這是每個智能合約漏洞獵人需要學習的首要技能之一:端到端理解協議的能力。
瀏覽文檔,嘗試自己重新實現協議,並在區塊瀏覽器上通過該協議查看交易。
Leon 說這種策略適用於其他獵人,但不適用於他。他專注於接下來的三個,但對於每個漏洞獵人來說,能夠做到這一點很重要。
2. 查找Bug 並蒐索項目
尋找bug 的一種更簡單的方法是找到一個鮮為人知的bug,並嘗試查看哪些協議實現了它。
這個策略需要大量研究,因為有很多人在研究 向公眾公開錯誤.
你首先需要了解所有基本的智能合約漏洞利用,然後是它們的高級版本。您需要了解最佳實踐,並查看是否有未遵循的協議。
一旦你發現一個你認為很多項目可能沒有得到保護的智能合約錯誤,就開始尋找那個錯誤。真正熟悉這個新錯誤以及如何找到它。並且一定要寫博客或某種帖子來幫助其他遇到此錯誤的智能合約開發人員保護自己。
3. 要快
希望漏洞獵人查看其智能合約的項目需要註冊漏洞賞金計劃,例如 免疫. 你會想成為第一批找到新賞金的開發者之一。如果您在其他獵人之前開始查看合同,您將比其他獵人有更多時間來發現錯誤。
有幾種方法可以加快速度——Leon 能夠在其他人之前發現智能合約漏洞的方法之一是通過為 免疫更新Discord 頻道. 每當有新項目進來或項目更新時,他都會收到通知。像這樣的工具可以幫助您在其他人之前深入研究代碼。
4. 有創意
Leon 獲得優勢的另一種方式是橫穿 社區論壇,並發現他們正在考慮提交錯誤。然後,他甚至在賞金獲得批准之前就開始查看智能合約。這給了他比其他開發人員更多的時間來查看合同,因為他們會等待提交錯誤賞金。
5. 了解你的工具
漏洞獵手使用VSCode Solidity 可視化開發者擴展、Hardhat、Foundry、Brownie、Dune、Etherscan 等工具,以及許多其他工具。
一個典型的錯誤搜尋策略可能是加載VSCode,使用Solidity 可視化擴展將代碼添加到VSCode,然後逐行查找常見錯誤或不良最佳實踐。
在找到弱點之後,設置一個測試環境來對合約進行測試是一個很好的下一步。您通常可以重用協議開發人員最初使用的大量測試。
6.不要害怕被審計的項目
這裡不多說。審計公司會犯錯誤。 Leon 發現的許多漏洞項目都經過了頂級公司的審計。
使用我們在本博客中討論的技能可以幫助您找到這些問題!
7. 行業特定知識
尋找優勢的最大優勢之一是專注於特定的利基市場。如果您非常了解某個領域,您將擁有了解所有功能如何相互交互的優勢。如果你是一位了不起的智能合約漏洞專家,但對DeFi 一無所知,那麼很難在DeFi 合約中發現漏洞。例如,許多開發人員了解代碼,但不了解金融原語。
你可以非常擅長理解去中心化交易所、借貸協議,或者僅僅是NFT!
如果您可以成為Web3 中的安全大師和某個垂直領域的大師,那麼您將處於有利位置,可以在其他所有尋找錯誤的人中占得先機。
概括
我希望這篇文章對您的智能合約漏洞搜尋之旅有用。如果您想在編寫智能合約時了解有關安全性的更多信息,請務必查看 十大DeFi 安全最佳實踐.
而且,與往常一樣,我希望看到你們在那裡建立並保持生態系統更安全。
鏈接
本文中表達的觀點僅代表作者個人觀點,不代表Chainlink 基金會或Chainlink Labs 的觀點和信念。