ethereum智能合約漏洞案例分析

1.uint256溢出漏洞(以BEC為例)

BEC token的代碼可在etherscan中查看
出問題的代碼為batchTransfer方法:

 function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) {
    uint cnt = _receivers.length;
    uint256 amount = uint256(cnt) * _value;
    require(cnt > 0 && cnt <= 20);
    require(_value > 0 && balances[msg.sender] >= amount);

    balances[msg.sender] = balances[msg.sender].sub(amount);
    for (uint i = 0; i < cnt; i++) {
        balances[_receivers[i]] = balances[_receivers[i]].add(_value);
        Transfer(msg.sender, _receivers[i], _value);
    }
    return true;
  }

該方法的目的是批量從請求發(fā)送者的賬號里各轉(zhuǎn)移_value個ether至_receivers中,于是該方法的執(zhí)行需要如下前提條件

該方法的調(diào)用者的賬號中的余額 >_receivers.length * _value

batchTransfer 方法乍一看沒什么問題荔烧,但作者忘了一個重要的問題茵宪,uint256(32個字節(jié))雖然能表示很大的整形玫芦,但總歸是有限的莺琳,會溢出
如果調(diào)用者發(fā)現(xiàn)這個漏洞茂契,精巧的構(gòu)造batchTransfer的參數(shù)_receivers, _val 使得
_receivers.length * _val = amount 溢出饮亏,并且 amount < 調(diào)用賬號的余額
那么_receivers賬號中每個就將憑空產(chǎn)生_val的余額

2.權(quán)限檢測漏洞(以EDU為例)

edu token的代碼可在etherscan中查看
如果上面的代碼漏還稍微具有隱蔽性,那么EDU智能合約中的漏洞就low得令人發(fā)指糯而。
請看漏洞代碼:

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        /// same as above
        require(_to != 0x0);
        require(balances[_from] >= _value);
        require(balances[_to] + _value > balances[_to]);

        uint previousBalances = balances[_from] + balances[_to];
        balances[_from] -= _value;
        balances[_to] += _value;
        allowed[_from][msg.sender] -= _value;
        Transfer(_from, _to, _value);
        assert(balances[_from] + balances[_to] == previousBalances);

        return true;
    }

如果不管智能合約的其他部分天通,單看這個方法,你會莫名其妙熄驼,因為該方法的目的是允許任何人從任意賬戶中轉(zhuǎn)移一定金額到任意目標賬號中像寒,請注意主謂賓:

  • 任何人
  • 任意賬號
  • 任意目標賬號

你在EDU中的資產(chǎn)在這個方法面前是完全沒有任何安全性可言的。
其實該方法的本來的目的是授權(quán)給一定用戶瓜贾,允許他轉(zhuǎn)移自己的資產(chǎn)诺祸,授權(quán)的代碼是

function approve(address _spender, uint256 _value) public returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
}

授權(quán)是放在allowed中,但transferFrom卻忘記了對授權(quán)的檢測祭芦,導致你在EDU中的資產(chǎn)完全沒有設(shè)防筷笨,完整的transferFrom應該如下

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        /// same as above
        require(_to != 0x0);
        require(balances[_from] >= _value);
        require(balances[_to] + _value > balances[_to]);
        //少了最關(guān)鍵的這一行:
        require(allowed[_from][msg.sender] >= _value); 

        uint previousBalances = balances[_from] + balances[_to];
        balances[_from] -= _value;
        balances[_to] += _value;
        allowed[_from][msg.sender] -= _value;
        Transfer(_from, _to, _value);
        assert(balances[_from] + balances[_to] == previousBalances);

        return true;
    }

3. 以太坊代幣“假充值”漏洞

https://mp.weixin.qq.com/s/-neSbS38cVsnHgvbO2NFLA
以太坊代幣交易回執(zhí)中 status 字段是 0×1(true) 還是 0×0(false),取決于交易事務(wù)執(zhí)行過程中是否拋出了異常(比如使用了 require/assert/revert/throw 等機制)龟劲。當用戶調(diào)用代幣合約的 transfer 函數(shù)進行轉(zhuǎn)賬時胃夏,如果 transfer 函數(shù)正常運行未拋出異常,該交易的 status 即是 0×1(true)昌跌。

如果想了解智能合約更多的漏洞仰禀,請看
如何保護你的智能合約:6個Solidity漏洞以及如何避開它們一
如何保護你的智能合約:6個Solidity漏洞以及如何避開它們二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚕愤,隨后出現(xiàn)的幾起案子答恶,更是在濱河造成了極大的恐慌,老刑警劉巖萍诱,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬嗓,死亡現(xiàn)場離奇詭異,居然都是意外死亡裕坊,警方通過查閱死者的電腦和手機包竹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人映企,你說我怎么就攤上這事悟狱。” “怎么了堰氓?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苹享。 經(jīng)常有香客問我双絮,道長,這世上最難降的妖魔是什么得问? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任囤攀,我火速辦了婚禮,結(jié)果婚禮上宫纬,老公的妹妹穿的比我還像新娘焚挠。我一直安慰自己,他們只是感情好漓骚,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布蝌衔。 她就那樣靜靜地躺著,像睡著了一般蝌蹂。 火紅的嫁衣襯著肌膚如雪噩斟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天孤个,我揣著相機與錄音剃允,去河邊找鬼。 笑死齐鲤,一個胖子當著我的面吹牛斥废,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播给郊,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼牡肉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丑罪?” 一聲冷哼從身側(cè)響起荚板,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吩屹,沒想到半個月后跪另,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡煤搜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年免绿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擦盾。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘲驾,死狀恐怖淌哟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辽故,我是刑警寧澤徒仓,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布懂讯,位于F島的核電站呻右,受9級特大地震影響阶界,放射性物質(zhì)發(fā)生泄漏条辟。R本人自食惡果不足惜局装,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一蜕该、第九天 我趴在偏房一處隱蔽的房頂上張望茄唐。 院中可真熱鬧孝扛,春花似錦芋肠、人聲如沸乎芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奈惑。三九已至,卻和暖如春碘裕,著一層夾襖步出監(jiān)牢的瞬間携取,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工帮孔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雷滋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓文兢,卻偏偏與公主長得像晤斩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姆坚,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容