作者:zxx友善@360 0KEE Team
來源:https://www.jianshu.com/p/c5363ffad6a7

最近通過對智能合約的審計,發現了一些智能合約相關的安全問題。

其中我們發現智能合約Hexagon存在溢出攻擊,可產生無數的token,導致整個代幣都沒有意義。 Token地址:https://etherscan.io/address/0xB5335e24d0aB29C190AB8C2B459238Da1153cEBA

該代幣可能要上交易所,我們已第一時間向官方通知該問題。

目前發現受影響合約地址:

成因分析

問題出現在_transfer函數當中,當調用transfer轉幣時,會調用_transfer函數:

/* Send tokens */
function transfer(address _to, uint256 _value) public returns (bool success) {
    _transfer(msg.sender, _to, _value);
    return true;
}

_value可控,burnPerTransaction為常量,當_value + burnPerTransaction溢出時為0,可以導致繞過驗證。

/* INTERNAL */
function _transfer(address _from, address _to, uint _value) internal {
    /* Prevent transfer to 0x0 address. Use burn() instead  */
    require (_to != 0x0);
    /* Check if the sender has enough */
    require (balanceOf[_from] >= _value + burnPerTransaction);
    /* Check for overflows */
    require (balanceOf[_to] + _value > balanceOf[_to]);
    /* Subtract from the sender */
    balanceOf[_from] -= _value + burnPerTransaction;  
    /* Add the same to the recipient */
    balanceOf[_to] += _value;
    /* Apply transaction fee */
    balanceOf[0x0] += burnPerTransaction;
    /* Update current supply */
    currentSupply -= burnPerTransaction;
    /* Notify network */
    Burn(_from, burnPerTransaction);
    /* Notify network */
    Transfer(_from, _to, _value);
}
string public constant name = "Hexagon";
string public constant symbol = "HXG";
uint8 public constant decimals = 4;
uint8 public constant burnPerTransaction = 2;

漏洞利用

合約中 burnPerTransaction = 2 , 所以當轉賬_value0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe時, _value + burnPerTransaction =0 ,即可成功攻擊,為balanceOf[_to]增加大量代幣。

require (balanceOf[_from] >= _value + burnPerTransaction);   
// require (balanceOf[_from] >= 0);   

[....]

require (balanceOf[_to] + _value > balanceOf[_to]);   
balanceOf[_from] -= _value + burnPerTransaction;  
// balanceOf[_from]-=0
balanceOf[_to] += _value;    
//balanceOf[_to]+=fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe

可參考下圖Transcations,目前生成的代幣已銷毀:

總結

建議使用 SafeMath 來處理計算操作,避免溢出。

同時,以太坊智能合約有很多開源合約,使用參考開源合約前,應對代碼進行安全審計。

關于我們

0KEE Team隸屬于360信息安全部,360信息安全部致力于保護內部安全和業務安全,抵御外部惡意網絡攻擊,并逐步形成了一套自己的安全防御體系,積累了豐富的安全運營和對突發安全事件應急處理經驗,建立起了完善的安全應急響應系統,對安全威脅做到早發現,早解決,為安全保駕護航。技術能力處于業內領先水平,培養出了較多明星安全團隊及研究員,研究成果多次受國內外廠商官方致謝,如微軟、谷歌、蘋果等,多次受邀參加國內外安全大會議題演講。目前主要研究方向有區塊鏈安全、WEB安全、移動安全(Android、iOS)、網絡安全、云安全、IOT安全等多個方向,基本覆蓋互聯網安全主要領域。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/604/