
2018年7月10日晚, 有相關(guān)安全公司創(chuàng)建并維護的智能合約風(fēng)險列表倉庫中接收到問題合約提交請求(漏洞報告者 xhyumiracle 來自長亭科技)。Lightcoin Token合約(合約地址:0xd97579Cea3fE2473682a4C42648134BB982433B9)的授權(quán)轉(zhuǎn)賬方法存在漏洞,授權(quán)賬戶可無限轉(zhuǎn)出被授權(quán)賬戶的金額,并且,授權(quán)賬戶可以利用這個漏洞給任意賬戶授權(quán)。

Lightcoin 合約的 transferFrom() 函數(shù),即授權(quán)轉(zhuǎn)賬函數(shù),在執(zhí)行完轉(zhuǎn)賬后本該修改授權(quán)金額,減去已轉(zhuǎn)出部分金額。但這一步驟中把這授權(quán)賬戶地址寫錯了,也就是將allowed[_from][msg.sender] -= _value; 誤寫成了 allowed[_from][_to] -= _value;,進而引發(fā)了漏洞。

該安全公司的小伙伴迅速分析了該漏洞指出,這個漏洞引發(fā)的后果有兩方面:
授權(quán)賬戶在完成授權(quán)轉(zhuǎn)賬后,其被授權(quán)的金額不會改變,也就是說,授權(quán)賬戶可以無限轉(zhuǎn)出被授權(quán)賬戶的金額。
轉(zhuǎn)賬完成后實際修改的是這筆轉(zhuǎn)賬接收地址(to)對于被授權(quán)賬戶 _from 的授權(quán)轉(zhuǎn)賬金額,但是由于對 allowed[_from][_to] -= _value;操作并沒有做溢出校驗,可以利用溢出來給 _to 地址巨額的授權(quán)。
若 _to 地址原本就有授權(quán),那么授權(quán)金額可能減小,也溢出為一個極大的值。
若 _to 地址原本沒有授權(quán),即 allowed[_from][_to 值為 0, 就可以利用溢出獲得這個被授權(quán)地址(_from 地址)的授權(quán),一旦授權(quán)后,就可以無限轉(zhuǎn)賬。
據(jù)悉,Lightcoin 項目方已獲知該漏洞并已完成合約升級工作,提醒廣大持幣用戶不必恐慌,做好升級工作即可。
目前問題合約已作廢:0xd97579Cea3fE2473682a4C42648134BB982433B9
升級后新合約地址為:0x1295b55fA04FBAc6d9e7c351Ecb3486e88129027

根據(jù)相關(guān)安全公司風(fēng)險監(jiān)控平臺顯示,存在相同漏洞的合約共 9份,強烈建議各個項目方和交易所及時做好自查工作。下圖為該問題的合約地址(出于對項目方的保護,合約地址已部分馬賽克)。

本文轉(zhuǎn)載自《無限授權(quán)轉(zhuǎn)賬漏洞》,版權(quán)屬于原作者,已獲得授權(quán)