溢出原理
计算机中整数变量有上下界,如果在算术运算中出现越界,即超出整数类型的最大表示范围,数字便会如表盘上的时针从12到1一般,由一个极大值变为一个极小值或直接归零,此类越界的情形在传统的软件程序中很常见,但是否存在安全隐患取决于程序上下文,部分溢出是良性的(如tcp序号等),甚至是故意引入的(例如用作hash运算等)。
以太坊虚拟机(EVM)为整数指定固定大小的数据类型,这意味着一个整型变量只能有一定范围的数字表示,例如:一个uint8 ,只能存储在范围[0,255]的数字,若试图存储256到一个uint8将变成0,不加注意的话只要没有检查用户输入又执行计算,导致数字超出存储它们的数据类型允许的范围,Solidity中的变量就可以被用来组织攻击
溢出实例
高卖低收(CVE-2018-11811)
类型描述:管理员通过修改合约中的参数来制造溢出漏洞,导致用户提币转出token之后,却收不到ETH(或收到极少量ETH),造成用户经济损失。
漏洞实例:合约Internet Node Token (INT)
合约地址:https://cn.etherscan.com/address/0x0b76544f6c413a555f309bf76260d1e02377c02a#code
漏洞位置:L179