編者按:本文來自36氪戰略合作區塊鏈媒體「Odaily星球日報 」(公眾號ID:o-daily,APP下載)
7月8日下午,降維安全實驗室(johnwick.io)監控到,以太坊智能合約AMR存在高危風險交易。團隊對代碼進行分析,發現其中存在的整數溢出漏洞已被人惡意利用,導致AMR大量增發。今年4月份,攻擊者也曾利用該漏洞攻擊美圖合作的美鏈BEC,導致市場上頓時出現海量BEC,貨幣價值幾乎歸零。
那麼,整數溢出漏洞是什麼?可以從我們熟悉的登陸密碼說起。
程序怎麼判斷用戶輸入密碼的正誤呢?後臺的操作是這樣的,先讓用戶輸入密碼,然後再調取真正的密碼,與之對比,如果差異為0,則輸出密碼正確,否則錯誤。
這在用戶輸入正確密碼(結果為0)或錯誤密碼(結果不為0)時都很好判斷。但是,由於後臺留給密碼的存儲空間是有限的(比如4個字節),如果此時用戶輸入的數據超出4個字節,那麼將會出現字符溢出。如果程序事先沒有被設置對溢出進行判斷的話,溢出的字符將使系統報錯或關閉。
我們再來看此次整數溢出漏洞的缺陷代碼片段(由Bcsec安全團隊提供):
該片段出現在一個叫「multiTransfer」的函數中,函數的作用是讓一個地址可以同時給多個地址轉帳。問題代碼中的totalTokensToTransfer計算出一共要支出的幣的總量,tokens是最終給每個地址轉帳的金額。
由於項目方給totalTokensToTransfer變量賦值時未進行溢出判斷,導致當tokens參數非常大時,totalTokensToTransfer變量進行數次計算後溢出為溢出值(攻擊者一般將溢出值控制在0-10),系統即認為本次轉帳總金額為溢出後的值(比如0,也就是轉帳金額為0),由此便繞過餘額檢查的步驟繼續完成交易,但實際上其轉帳金額遠大於錢包所含金額。於是系統憑空轉(多)出巨額代幣,黑客將其在市場上拋售獲利。
今年6月份,安比實驗室(SECBIT)對以太坊上部署的合約進行的分析檢測,發現共有866個合約存在相同問題。
為什麼會存在這些漏洞呢?
Bcsec安全團隊表示,這類漏洞本質是由於編程人員的疏忽造成的,之所以在以太坊ERC20中較大規模蔓延,是由於很多新上線的合約直接copy自一些合約模板,而未對其進行嚴格的安全評估,因此新項目如要使用應儘量確保其合約的安全性,才可以代表資產進行交易。
我是作者黃雪姣,區塊鏈項目報導/交流可加微信hxjiapg,勞請備註職務和事由。