當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]今天(4月23日)有人在群里說(shuō),Beauty Chain 美蜜 代碼里面有bug,已經(jīng)有人利用該bug獲得了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 個(gè) BEC

現(xiàn)在進(jìn)入你還是先行者,最后觀望者進(jìn)場(chǎng)才是韭菜。

背景

今天(4月23日)有人在群里說(shuō),Beauty Chain 美蜜 代碼里面有bug,已經(jīng)有人利用該bug獲得了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 個(gè) BEC

那筆操作記錄是 0xad89ff16fd1ebe3a0a7cf4ed282302c06626c1af33221ebe0d3a470aba4a660f

下面我來(lái)帶大家看看,黑客是如何實(shí)現(xiàn)的!

我們可以看到執(zhí)行的方法是 batchTransfer

那這個(gè)方法是干嘛的呢?(給指定的幾個(gè)地址,發(fā)送相同數(shù)量的代幣)

整體邏輯是

你傳幾個(gè)地址給我(receivers),然后再傳給我你要給每個(gè)人多少代幣(value)

然后你要發(fā)送的總金額 = 發(fā)送的人數(shù)* 發(fā)送的金額

然后 要求你當(dāng)前的余額大于 發(fā)送的總金額

然后扣掉你發(fā)送的總金額

然后 給receivers 里面的每個(gè)人發(fā)送 指定的金額(value)

從邏輯上看,這邊是沒(méi)有任何問(wèn)題的,你想給別人發(fā)送代幣,那么你本身的余額一定要大于發(fā)送的總金額的!

但是這段代碼卻犯了一個(gè)很傻的錯(cuò)!

代碼解釋

 

這個(gè)方法會(huì)傳入兩個(gè)參數(shù)

_receivers

_value

_receivers 的值是個(gè)列表,里面有兩個(gè)地址

0x0e823ffe018727585eaf5bc769fa80472f76c3d7

0xb4d30cac5124b46c2df0cf3e3e1be05f42119033

_value 的值是 8000000000000000000000000000000000000000000000000000000000000000

我們?cè)俨榭创a(如下圖)

我們一行一行的來(lái)解釋

uint cnt = _receivers.length;

是獲取 _receivers 里面有幾個(gè)地址,我們從上面可以看到 參數(shù)里面只有兩個(gè)地址,所以 cnt=2,也就是 給兩個(gè)地址發(fā)送代幣

uint256 amount = uint256(cnt) * _value;

uint256

首先 uint256(cnt) 是把cnt 轉(zhuǎn)成了 uint256類型

那么,什么是uint256類型?或者說(shuō)uint256類型的取值范圍是多少...

uintx 類型的取值范圍是 0 到 2的x次方 -1

也就是 假如是 uint8的話

則 uint8的取值范圍是 0 到 2的8次方 -1

也就是 0 到255

那么uint256 的取值范圍是

0 – 2的256次方-1 也就是 0 到115792089237316195423570985008687907853269984665640564039457584007913129639935

python 算 2的256次方是多少

那么假如說(shuō) 設(shè)置的值超過(guò)了 取值范圍怎么辦?這種情況稱為 溢出

舉個(gè)例子來(lái)說(shuō)明

因?yàn)閡int256的取值太大了,所以用uint8來(lái) 舉例。。。

從上面我們已經(jīng)知道了 uint8 最小是0,最大是255

那么當(dāng)我 255 + 1 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成0

那么當(dāng)我 255 + 2 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成1

那么當(dāng)我 0 - 1 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成255

那么當(dāng)我 0 - 2 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成254

那么 我們回到上面的代碼中,

amount = uint256(cnt) * _value

amount = 2* _value

但是此時(shí) _value 是16進(jìn)制的,我們把他轉(zhuǎn)成 10進(jìn)制

(python 16進(jìn)制轉(zhuǎn)10進(jìn)制)

可以看到 _value = 57896044618658097711785492504343953926634992332820282019728792003956564819968

那么amount = _value*2 = 115792089237316195423570985008687907853269984665640564039457584007913129639936

可以在查看上面看到 uint256取值范圍最大為 115792089237316195423570985008687907853269984665640564039457584007913129639935

此時(shí),amout已經(jīng)超過(guò)了最大值,溢出 則 amount = 0

下一行代碼 require(cnt > 0 && cnt <= 20); require 語(yǔ)句是表示該語(yǔ)句一定要是正確的,也就是 cnt 必須大于0 且 小于等于20

我們的cnt等于2,通過(guò)!

require(_value > 0 && balances[msg.sender] >= amount);

這句要求 value 大于0,我們的value是大于0 的 且,當(dāng)前用戶擁有的代幣余額大于等于 amount,因?yàn)閍mount等于0,所以 就算你一個(gè)代幣沒(méi)有,也是滿足的!

balances[msg.sender] = balances[msg.sender].sub(amount);

這句是當(dāng)前用戶的余額 – amount

當(dāng)前amount 是0,所以當(dāng)前用戶代幣的余額沒(méi)有變動(dòng)

for (uint i = 0; i < cnt; i++) {

balances[_receivers[i]] = balances[_receivers[i]].add(_value);

Transfer(msg.sender, _receivers[i], _value);

}

這句是遍歷 _receivers中的地址, 對(duì)每個(gè)地址做以下操作

balances[_receivers[i]] = balances[_receivers[i]].add(_value);

_receivers中的地址的余額 = 原本余額+value

所以 _receivers 中地址的余額 則加了57896044618658097711785492504343953926634992332820282019728792003956564819968 個(gè)代幣!!!

Transfer(msg.sender, _receivers[i], _value); } 這句則只是把贈(zèng)送代幣的記錄存下來(lái)!!!

總結(jié)

就一個(gè)簡(jiǎn)單的溢出漏洞,導(dǎo)致BEC代幣的市值接近歸0

那么,開(kāi)發(fā)者有沒(méi)有考慮到溢出問(wèn)題呢?

其實(shí)他考慮了,

可以看如上截圖

除了amount的計(jì)算外, 其他的給用戶轉(zhuǎn)錢 都用了safeMath 的方法(sub,add)

那么 為啥就偏偏這一句沒(méi)有用safeMath的方法呢。。。

這就要問(wèn)寫(xiě)代碼的人了。。。

啥是safeMath

 

safeMath 是為了計(jì)算安全 而寫(xiě)的一個(gè)library

我們看看他干了啥?為啥能保證計(jì)算安全.

function mul(uint256 a, uint256 b) internal constant returns (uint256) {

uint256 c = a * b;

assert(a == 0 || c / a == b);

return c;

}

如上面的乘法. 他在計(jì)算后,用assert 驗(yàn)證了下結(jié)果是否正確!

如果在上面計(jì)算 amount的時(shí)候,用了 mul的話, 則 c / a == b 也就是 驗(yàn)證 amount / cnt == _value

這句會(huì)執(zhí)行報(bào)錯(cuò)的,因?yàn)?0 / cnt 不等于 _value

所以程序會(huì)報(bào)錯(cuò)!

也就不會(huì)發(fā)生溢出了...

那么 還有一個(gè)小問(wèn)題,這里的 assert 好 require 好像是干的同一件事

都是為了驗(yàn)證 某條語(yǔ)句是否正確!

那么他倆有啥區(qū)別呢?

用了assert的話,則程序的gas limit 會(huì)消耗完畢

而require的話,則只是消耗掉當(dāng)前執(zhí)行的gas

總結(jié)

那么 我們?nèi)绾伪苊膺@種問(wèn)題呢?

我個(gè)人看法是

只要涉及到計(jì)算,一定要用safeMath

代碼一定要測(cè)試!

代碼一定要review!

必要時(shí),要請(qǐng)專門做代碼審計(jì)的公司來(lái) 測(cè)試代碼

這件事后需要如何處理呢?

目前,該方法已經(jīng)暫停了(還好可以暫停)所以看過(guò)文章的朋友 不要去測(cè)試了...

不過(guò)已經(jīng)發(fā)生了的事情咋辦呢?

我能想到的是,快照在漏洞之前,所有用戶的余額情況

然后發(fā)行新的token,給之前的用戶 發(fā)送等額的代幣...

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉