整数溢出的漏洞危害和预防

时间:2024-03-18 17:49:51

智能合约作为区块链2.0的代表技术,适应于区块链去中心化、分布式的特点, 具有独立运行、不可篡改的优良特性,可用于实现包含金融工具在内的各类分布式应用。开发者可以自行定义交易逻辑并开发代码发布到链上,合约代码在矿工节点的虚拟机环境(如EVM)中执行。合约交易被打包进区块后,链上节点执行相同代码,从而同步改变链上数据状态。故合约的多方参与者无需建立信任,也无法相互欺骗。

合约运行在区块链节点中,具有不可更改的特性,那么伴随而来的就会有漏洞被攻击利用造成很大的危害。所有程序都可能存在漏洞,智能合约也不例外。这次我们就一起了解一下智能合约中整数溢出的危害和预防,怎么才能让你的合约更加安全可靠的使用。

整数溢出是一种常见的高危漏洞,曾引发许多严重事故。1996年阿丽亚娜5型运载火箭在发射37秒后解体并爆炸就是由于整数溢造成的 。h运算等)。2010年的比特币大整数溢出,CVE-2010-5139 ,黑客通过整数溢出构造了大概92233720368.54277039 个比特币,最近的SMT/BEC的整数安全场景与之前比特币的场景类似。整数溢出漏洞检测和校验是有挑战性的,程序员极容易犯错,而自动化检测方法最大难点在于判断候选溢出是否真正导致了危害,以免造成大量的误报。

整数溢出案例分析:
不安全的写法
整数溢出的漏洞危害和预防
简单说明整数溢出:相当于一个存储 0 的 uint8 (无符号的 8 位整数,即只有正数)变量中减去 1,将导致该变量的值变为 255。这是一个下溢。我们明明为该 uint8 分配了一个低于其储存范围的值,结果却是 绕回来 变成了 uint8 所能储存的最大值。同样,给一个 uint8 加上 2^8=256 会使变量保持不变,因为我们已经绕过了 uint 的整个值域又回到原值(对于数学家来说,这类似于将三角函数的角度加上 2pi ,sin(x) = sin(x + 2pi))。添加大于数据类型范围的数字称为上溢。为了清楚起见,添加 257 到一个目前仅有 0 值的 uint8 变量将变成数字 1。将固定类型变量视为循环有时很有启发意义,如果我们加入的数字超出最大可存储数字,等于是从零开始加上超出额,反之也是从零开始(从零中减去一定数额,等同于从最大数字往下减该数额
安全写法
整数溢出的漏洞危害和预防
可以看到我们在前面加了一个require的限制条件,这样在下面标注执行的地方就不会产生溢出。
还有一种安全的写法
整数溢出的漏洞危害和预防
所有的加法,减法和乘法(除法被排除在外,因为它不会导致上溢/下溢,并且 EVM 除以 0 时会丢出错误)运算都可以使用标准的SafeMath库,这样就会避免溢出。
现在 成都链安有一款插件(Beosin-VaaS:ETH)可以有效的检测智能合约整数溢出问题,结果如下
不安全的
整数溢出的漏洞危害和预防
会检测出这一行存在溢出

另外两种使用require限制条件和SafeMath库的都不会报出这一行存在问题。

推荐一款“一键式”智能合约自动形式化验证工具,可精确定位到有风险的代码位置并指出风险原因,有效的检测智能合约常规安全漏洞、安全属性和功能正确性,精确度高达95%以上,为智能合约代码提供“军事级”的安全验证。