7月8日下午,降維安全實(shí)驗(yàn)室(johnwick.io)監(jiān)控到,以太坊智能合約AMR存在高危風(fēng)險(xiǎn)交易。團(tuán)隊(duì)對(duì)代碼進(jìn)行分析,發(fā)現(xiàn)其中存在的整數(shù)溢出漏洞已被人惡意利用,導(dǎo)致AMR大量增發(fā)。今年4月份,攻擊者也曾利用該漏洞攻擊美圖合作的美鏈BEC,導(dǎo)致市場上頓時(shí)出現(xiàn)海量BEC,貨幣價(jià)值幾乎歸零。
那么,整數(shù)溢出漏洞是什么?可以從我們熟悉的登陸密碼說起。
程序怎么判斷用戶輸入密碼的正誤呢?后臺(tái)的操作是這樣的,先讓用戶輸入密碼,然后再調(diào)取真正的密碼,與之對(duì)比,如果差異為0,則輸出密碼正確,否則錯(cuò)誤。
這在用戶輸入正確密碼(結(jié)果為0)或錯(cuò)誤密碼(結(jié)果不為0)時(shí)都很好判斷。但是,由于后臺(tái)留給密碼的存儲(chǔ)空間是有限的(比如4個(gè)字節(jié)),如果此時(shí)用戶輸入的數(shù)據(jù)超出4個(gè)字節(jié),那么將會(huì)出現(xiàn)字符溢出。如果程序事先沒有被設(shè)置對(duì)溢出進(jìn)行判斷的話,溢出的字符將使系統(tǒng)報(bào)錯(cuò)或關(guān)閉。
我們?cè)賮砜创舜握麛?shù)溢出漏洞的缺陷代碼片段(由Bcsec安全團(tuán)隊(duì)提供):
該片段出現(xiàn)在一個(gè)叫“multiTransfer”的函數(shù)中,函數(shù)的作用是讓一個(gè)地址可以同時(shí)給多個(gè)地址轉(zhuǎn)賬。問題代碼中的totalTokensToTransfer計(jì)算出一共要支出的幣的總量,tokens是最終給每個(gè)地址轉(zhuǎn)賬的金額。
由于項(xiàng)目方給totalTokensToTransfer變量賦值時(shí)未進(jìn)行溢出判斷,導(dǎo)致當(dāng)tokens參數(shù)非常大時(shí),totalTokensToTransfer變量進(jìn)行數(shù)次計(jì)算后溢出為溢出值(攻擊者一般將溢出值控制在0-10),系統(tǒng)即認(rèn)為本次轉(zhuǎn)賬總金額為溢出后的值(比如0,也就是轉(zhuǎn)賬金額為0),由此便繞過余額檢查的步驟繼續(xù)完成交易,但實(shí)際上其轉(zhuǎn)賬金額遠(yuǎn)大于錢包所含金額。于是系統(tǒng)憑空轉(zhuǎn)(多)出巨額代幣,黑客將其在市場上拋售獲利。
今年6月份,安比實(shí)驗(yàn)室(SECBIT)對(duì)以太坊上部署的合約進(jìn)行的分析檢測,發(fā)現(xiàn)共有866個(gè)合約存在相同問題。
為什么會(huì)存在這些漏洞呢?
Bcsec安全團(tuán)隊(duì)表示,這類漏洞本質(zhì)是由于編程人員的疏忽造成的,之所以在以太坊ERC20中較大規(guī)模蔓延,是由于很多新上線的合約直接copy自一些合約模板,而未對(duì)其進(jìn)行嚴(yán)格的安全評(píng)估,因此新項(xiàng)目如要使用應(yīng)盡量確保其合約的安全性,才可以代表資產(chǎn)進(jìn)行交易。