ERC20 智慧合約整數溢位系列漏洞披露
從2016年The DAO被盜取6000萬美元開始 ,到美鏈BEC價值歸零 、BAI和EDU任意賬戶轉帳 ,再到最近EOS漏洞允許惡意合約穿透虛擬機器危害礦工節點 ,“智慧合約”儼然成為區塊鏈安全重災區。“清華-360企業安全聯合研究中心”團隊在區塊鏈安全方面進行了持續研究,開發了自動化漏洞掃描工具,近期發現了多個新型整數溢位漏洞,可造成超額鑄幣、超額購幣、隨意鑄幣、高賣低收、下溢增持等嚴重危害。
1.背景
智慧合約作為區塊鏈2.0的代表技術,適應於區塊鏈去中心化、分散式的特點, 具有獨立執行、不可篡改的優良特性,可用於實現包含金融工具在內的各類分散式應用。開發者可以自行定義交易邏輯並開發程式碼釋出到鏈上,合約程式碼在礦工節點的虛擬機器環境(如EVM)中執行。合約交易被打包進區塊後,鏈上節點執行相同程式碼,從而同步改變鏈上資料狀態。故合約的多方參與者無需建立信任,也無法相互欺騙。
與傳統程式一樣,智慧合約無法避免地存在安全漏洞。而與傳統程式不一樣的是,合約執行在開放的區塊鏈網路當中,可以被任意呼叫,而且合約的執行具有“不可更改”的效果,導致合約的漏洞被利用之後危害更大 。前面提到的BEC等合約中存在的整數溢位漏洞便是一個典型的例子,攻擊者對漏洞的利用造成了數額驚人的損失。
整數溢位是一種常見的高危漏洞,曾引發許多嚴重事故。1996年阿麗亞娜5型運載火箭在發射37秒後解體並爆炸就是由於整數溢造成的 。整數溢位的原理是:計算機中整數變數有上下界,如果在算術運算中出現越界,即超出整數型別的最大表示範圍,數字便會如錶盤上的時針從12到1一般,由一個極大值變為一個極小值或直接歸零。此類越界的情形在傳統的軟體程式中很常見,但是否存在安全隱患取決於程式上下文,部分溢位是良性的(如tcp序號等),甚至是故意引入的(例如用作hash運算等)。整數溢位漏洞檢測和校驗是有挑戰性的,程式設計師極容易犯錯,而自動化檢測方法最大難點在於判斷候選溢位是否真正導致了危害,以免造成大量的誤報。
2.自動化挖掘
“清華-360企業安全聯合研究中心” ChainTrust團隊成員充分利用多年軟體漏洞挖掘的經驗,針對智慧合約開發了自動化檢測工具,可以高效挖掘高危整數溢位漏洞。檢測工具通過準確構建整數溢位點的上下文語義,採用符號執行和汙點分析等技術,有效區分了無害溢位和有害溢位,能夠顯著降低漏洞的誤報率和漏報率。
截止目前,團隊針對Etherscan上排名前470位的代幣合約進行了檢測,除去未提供原始碼、沒有完整爬取原始碼或耗時過長的合約,最終完整分析了390份合約。在這些被分析的合約中,團隊總共發現25個智慧合約存在整數溢位安全問題,申請獲得了5個CVE編號,主要包含下述6類新型危害。
團隊成員在“全球EOS開發者大會”上對部分漏洞進行了首次披露。本報告將對漏洞情況進行詳細披露,旨在推進社群的安全健康發展。
3.新型漏洞詳情
3.1.underSell: 高賣低收(CVE-2018-11811)
管理員通過修改合約中的引數來製造溢位漏洞,導致使用者提幣轉出token之後,卻收不到ETH(或收到極少量ETH),造成使用者經濟損失。
漏洞例項:合約Internet Node Token (INT)
漏洞所在位置:紅色標註的行L175
漏洞攻擊效果:使用者提幣之後,無法得到對應數額的ETH;
漏洞原理:sellPrice被修改為精心構造的大數後,可導致amount sellPrice的結果大於整數變數(uint256)最大值,發生整數溢位,從而變為一個極小值甚至歸零。該值在程式語義中是用於計算使用者提幣應得的ETH數量,並在L175進行了校驗,但該值被溢位變為極小值之後可以逃逸L175的校驗,並導致使用者售出token後只能拿到少量的(甚至沒有)ETH。
3.2.ownerUnderflow: 下溢增持(CVE-2018-11687)
管理員在特定條件下,通過呼叫合約中有漏洞的發幣函式製造下溢,從而實現對自身賬戶餘額的任意增加。
漏洞例項:合約Bitcoin Red(BTCR)
漏洞所在位置:紅色標註的行L41
漏洞攻擊效果:管理員執行了一個正常向某個地址進行發幣的操作,實際已經暗中將自身賬戶的餘額修改為了一個極大的數;
漏洞原理:distributeBTR()函式的本意是管理員給指定地址發放一定數額的token,並從自身賬戶減少對應的token數量。減少管理員賬戶餘額的操作為balances[owner] -= 2000 108 ,運算的結果將被存到balances[owner]中,是一個無符號整數型別。當管理員餘額本身少於2000 * 108時,減法計算結果為負值,解釋為無符號整數即一個極大值。
3.3.mintAny: 隨意鑄幣 (CVE-2018-11812)
管理員呼叫鑄幣函式給某個地址增加token時,利用溢位漏洞可以突破該函式只能增加token的限制,實際減少該地址的token數量,從而實現對任一賬戶餘額的任意篡改(增加或減少)。在我們的檢測中,有多達18個合約存在類似安全問題。
漏洞例項:合約PolyAi (AI)
漏洞所在位置:紅色標註的行L132
漏洞攻擊效果:管理員可以繞過合約限制,任意篡改所有地址的token餘額;
漏洞原理:攻擊者通過構造一個極大的mintedAmount,使得balanceOf[target] + mintedAmount發生整數溢位,計算結果變為一個極小值。
3.4. overMint: 超額鑄幣(CVE-2018-11809)
管理員通過構造惡意引數,可以繞過程式中規定的token發行上限,實現超額鑄幣。合約Playkey (PKT)存在此類漏洞,導致合約中的鑄幣上限形同虛設,從而發行任意多的token。此外,我們還發現Nexxus (NXX)、Fujinto (NTO)兩個合約存在類似漏洞,這兩個合約沒有鑄幣上限限制,但同樣的手段,可以溢位合約中一個用於記錄已發幣總量(totalSupply)的變數值,使其與市場中實際流通的總幣數不一致。
漏洞例項:合約Playkey (PKT)
漏洞所在位置:紅色標註的行L237
漏洞攻擊效果:管理員可以篡改已發幣總量(totalSupply)為任意值,並繞過合約中的鑄幣上限超額發行token;
漏洞原理:_value在函式呼叫時被設定為精心構造的極大值,使得totalSupply + _value計算結果溢位後小於tokenLimit,從而輕易繞過L237行的鑄幣上限檢測。
3.5.allocateAny: 超額定向分配(CVE-2018-11810)
管理員通過製造溢位來繞過合約中對單地址發幣的最大上限,可以對指定地址分配超額的token,使得對單地址的釋出上限無效。
漏洞例項:合約LGO (LGO)
漏洞所在位置:紅色標註的行L286
漏洞攻擊效果:管理員繞過合約中規定的單地址發幣上限,給指定地址分配超額的token;
漏洞原理: 一個極大的_amount可以使得算數加法運算holdersAllocatedAmount + _amount發生整數溢位,變為一個極小值,從而繞過L286的檢測。
3.6.overBuy:超額購幣(CVE-2018-11809)
買家如果擁有足夠多的ETH,可以通過傳送大量token製造溢位,從而繞過ICO發幣上限,達到超額購幣。
漏洞例項:合約EthLend (LEND)
漏洞所在位置:紅色標註的行L236
4.漏洞列表
團隊採用自動化工具分析了390份ERC20智慧合約,除上述已披露的漏洞之外,共發現25個智慧合約存在未知的整數溢位漏洞,詳細情況如下表所示,出於對相關廠商安全的考慮,隱去了具體的漏洞位置、原始碼等技術細節,相關廠商安全人員如有需求,可與研究團隊聯絡(列表最右側一列的型別編號對應上述分類,每種合約可能同時存在多種型別漏洞):
5.結論
智慧合約之所以“智慧”,是由於合約程式碼一旦上鍊,其執行效果完全由可見且不可篡改的程式碼來決定,而不用依賴於對任何參與方的信任。然而,由上述漏洞分析可見,智慧合約並沒有預期的“智慧”,存在相當多的安全風險,尤其是管理員許可權下,可能導致諸多嚴重的安全問題。僅僅通過整數溢位這一常見漏洞型別,管理員便能夠任意篡改所有賬戶餘額,惡意超額、甚至無上限鑄幣,背離合約白皮書的約定,這樣的合約無法保證參與多方的公平性,更無談智慧。而管理員利用整數溢位進行作惡早已有先例,2018年2月初,基於以太坊的Monero Gold(XMRG) Token在交易所的價格先猛漲787%,後迅速暴跌至崩盤,造成大量使用者經濟損失 ,其背後就是管理團隊利用預留的整數溢位漏洞進行超額鑄幣,並在交易所拋售造成惡性通貨膨脹,最後價值幾乎歸零 。在區塊鏈上執行的智慧合約,本意是利用區塊鏈不可篡改的特性來構建可信的執行環境,然而安全漏洞的存在就像一個個隱藏的定時炸彈,對智慧合約的可信任基礎帶來了巨大的挑戰。
在近一個月之前,團隊已經發現上述安全漏洞,在評估了安全威脅之後第一時間反饋給相關廠商,並通知了交易所(如火幣網),希望能夠幫助廠商和交易所及時修補漏洞和杜絕安全隱患,多家廠商在得到通報後也積極做出了應急響應。
6.關於我們
清華-360企業安全聯合研究中心(籌)是清華大學網路研究院和360企業安全集團共同成立的聯合研究機構,結合清華大學和360企業安全集團在學術研究和產業服務中的優勢,面向世界學術和技術前沿開展研究,服務於國家和社會對網路空間安全的戰略需求。研究團隊在漏洞挖掘與攻防領域有豐富的經驗,團隊在國際四大頂級安全會議中發表多篇論文,在世界學術和工業界有廣泛的影響力,孕育了“藍蓮花”等國際知名黑客戰隊。
參考文獻
【1】Explaining the DAO exploit for beginners in Solidity
【2】Building a safer crypto token
【3】EDU問題:還原EDU被黑客攻擊始末:期貨與現貨的組合套現
【4】BAI 智慧合約存在和 EDU 一樣的漏洞,可轉走任意賬戶裡的 BAI Token
【5】EOS Node Remote Code Execution Vulnerability — EOS WASM Contract Function Table Array Out of Bounds
【6】區塊鏈智慧合約漏洞,想說補你不容易(乾貨)
【7】導致慘重代價的Bug
【8】Monero Gold – The story and tech specs of a 4 million USD shitcoin scam, brilliantly executed
【9】Monero Gold (XMRG) 價格,圖表,市值,以及其他計量 | CoinMarketCap
相關文章
- 以太坊智慧合約 Hexagon 存在溢位漏洞Go
- 智慧合約安全之整型溢位
- 二進位制漏洞挖掘之整數溢位
- 整數溢位
- 【力扣】組合總數(另一種整數溢位)力扣
- EOS.CYBEX孵化團隊鏈安科技發現EOS智慧合約可能出現溢位漏洞
- 什麼是智慧合約漏洞?
- [二進位制漏洞]棧(Stack)溢位漏洞 Linux篇Linux
- DASP智慧合約Top10漏洞
- EduCoin智慧合約transferFrom任意轉賬漏洞
- SMT整型溢位漏洞分析筆記筆記
- Linux堆溢位漏洞利用之unlinkLinux
- 棧溢位漏洞利用(繞過ASLR)
- 通俗易懂談BEC智慧合約致命漏洞
- 從CVE復現看棧溢位漏洞利用
- 以太坊智慧合約-猜數字
- substrate學習筆記10:開發erc20合約筆記
- 小技巧!CSS 整塊文字溢位省略特性探究CSS
- 四位整數位數拆分
- CVE-2010-3333-office RTF棧溢位漏洞分析
- 智慧合約語言 Solidity 教程系列8 - Solidity APISolidAPI
- 智慧合約語言 Solidity 教程系列8 – Solidity APISolidAPI
- 溢位、上溢、下溢
- java.sql.SQLException: 數字溢位JavaSQLException
- 緩衝區溢位漏洞的原理及其利用實戰
- 緩衝區溢位漏洞那些事:C -gets函式函式
- 數數的位數(正整數)
- 正向合約&反向合約倉位變化計算
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- 谷歌Project Zero團隊調整漏洞披露指南:增加30天緩衝期谷歌Project
- leetcode 解題:7. 整數反轉 @ 彈出和推入數字 & 溢位前進行檢查LeetCode
- CVE 2015-0235: GNU glibc gethostbyname 緩衝區溢位漏洞
- CVE-2010-2883-CoolType.dll緩衝區溢位漏洞分析
- 從零開始復現 DIR-815 棧溢位漏洞
- MySQL 數值型別溢位處理MySql型別
- 智慧合約從入門到精通:智慧合約的前世今生
- 富士通推出新技術檢測以太坊智慧合約漏洞
- 這些智慧合約漏洞,可能會影響你的賬戶安全!