区块链智能合约的漏洞特别容易造成大量的代币被Web3的攻击者盗取。这也是我们SINE安全技术对有关区块链智能合约安全写的第二部分的文章,这篇文章依然是具体的去写区块链智能合约里的比较常见漏洞。
0x02漏洞详细介绍与基本原理
算术外溢(arithmeticoverflow)或称之为外溢(overflow)指的是在计算机界里发生的事。运转单一数据处理时,当计算生成出来的结果超过寄存器或储存器能够存储或显示的能力限制的状况就叫做算术上溢。相反,叫做算术下溢。在solidity中,uint8能够显示的范畴是0-255这256个数,当使用uint8类别在具体运算中计算255+1是会存在上溢的,这种计算出来结果显示0可能就是uint8类别可显示的最低值。相同的,下溢可能就是计算生成出来的结果特别小,低于寄存器或储存器能够存储或显示的能力限制就会形成下溢。比如在Solidity中,当使用uint8类别计算0-1时就会形成下溢,这种计算出来值为255可能就是uint8类别可显示的最高值。
针对于区块链里的智能合约溢出漏洞是存在着版本的一些差别的:
Solidity 小于0.8版本的 该漏洞不会报错
Solidity 大于等于 0.8版本 该溢出漏洞会报错
因此,当看到Solidity版本小于0.8的时候,就要注意该区块链智能合约是不是有溢出漏洞。
智能合约溢出漏洞复现
在TimeLock区块链智能合约中客户可以根据deposit()变量存到自己的代币并且给代币加锁(block.timestamp+1weeks)锁住几天时间,其实客户也可以使用increaseLockTime()变量来提高储存时长。不过在储存时间达到以前,代币还会继续锁在TimeLock区块链智能合约里边,不管客户怎么操作都难以拿出。
那如何造成溢出漏洞呢?在deposit()变量之中能够存入代币同时通过Balance来查询自个的存款,假如攻击者存入2^256个代币造成区块链智能合约溢出并且清空自己的存款,我觉得没有谁那么愚笨做出这种事儿,这件事成本费用太高。那么我们就只能依靠别的漏洞点来开启这一溢出漏洞!
increaseLockTime(uint_secondsToIncrease)之中_secondsToIncrease直接跟账户所对应的锁住时长lockTime开展运算,因此我们能够操控_secondsToIncrease参数使它在和LockTime开展运算是溢出,就可以造成溢出漏洞,进而在未达到取款时长拿出咱们存入的代币。
SINE安全对智能合约溢出漏洞修复的一些建议:
1.应用SafeMath来避免外溢;
2.应用Solidity0.8或以上版本来开发设计合约并慎用unchecked因为在unchecked处理过的代码块里边并没有对参数采取溢出检查的;
3.须要谨慎使用变量的类型强制类型转换,比如将uint256类型的参数强转为uint8类型因为两种形式的取值不一样也可能会致使外溢。