整形数据的溢出概念(什么是整数溢出)

溢出原理

计算机中整数变量有上下界,如果在算术运算中出现越界,即超出整数类型的最大表示范围,数字便会如表盘上的时针从12到1一般,由一个极大值变为一个极小值或直接归零,此类越界的情形在传统的软件程序中很常见,但是否存在安全隐患取决于程序上下文,部分溢出是良性的(如tcp序号等),甚至是故意引入的(例如用作hash运算等)。 

以太坊虚拟机(EVM)为整数指定固定大小的数据类型,这意味着一个整型变量只能有一定范围的数字表示,例如:一个uint8只能存储在范围[0,255]的数字,若试图存储256到一个uint8将变成0,不加注意的话,只要没有检查用户输入又执行计算,导致数字超出存储它们的数据类型允许的范围。

溢出实例

高卖低收(CVE-2018-11811)

类型描述:管理员通过修改合约中的参数来制造溢出漏洞,导致用户提币转出token之后,却收不到ETH(或收到极少量ETH),造成用户经济损失。 

漏洞实例:合约Internet Node Token (INT) 

合约地址:

https://cn.etherscan.com/address/0x0b76544f6c413a555f309bf76260d1e02377c02a#code

漏洞位置:L179

漏洞危害:用户提币之后,无法得到对应数额的ETH; 

漏洞原理:sellPrice被修改为精心构造的大数后,可导致amount sellPrice的结果大于整数变量(uint256)最大值,发生整数溢出,从而变为一个极小值甚至归零。该值在程序语义中是用于计算用户提币应得的ETH数量,并在L179进行了校验,但该值被溢出变为极小值之后可以逃逸L179的校验,并导致用户售出token后只能拿到少量的(甚至没有)ETH。

下溢增持(CVE-2018-11687)

类型描述:管理员在特定条件下,通过调用合约中有漏洞的发币函数制造下溢,从而实现对自身账户余额的任意增加。 

漏洞实例:合约Bitcoin Red(BTCR) 

合约地址:

https://cn.etherscan.com/address/0x6aac8cb9861e42bf8259f5abdc6ae3ae89909e11#code

漏洞位置:L45

整形数据的溢出概念(什么是整数溢出)

漏洞危害:管理员执行了一个正常向某个地址进行发币的操作,实际已经暗中将自身账户的余额修改为了一个极大的数; 

漏洞原理:distributeBTR()函数的本意是管理员给指定地址发放一定数额的token,并从自身账户减少对应的token数量。减少管理员账户余额的操作为balances[owner] -= 2000 108 ,运算的结果将被存到balances[owner]中,是一个无符号整数类型。当管理员余额本身少于2000 * 108时,减法计算结果为负值,解释为无符号整数即一个极大值。

随意铸币 (CVE-2018-11812)

类型描述:管理员调用铸币函数给某个地址增加token时,利用溢出漏洞可以突破该函数只能增加token的限制,实际减少该地址的token数量,从而实现对任一账户余额的任意篡改(增加或减少)。

漏洞实例:合约PolyAi (AI) 

合约地址:
https://cn.etherscan.com/address/0x5121e348e897daef1eef23959ab290e5557cf274#code

漏洞位置:L136

整形数据的溢出概念(什么是整数溢出)

漏洞危害:管理员可以绕过合约限制,任意篡改所有地址的token余额; 

漏洞原理:攻击者通过构造一个极大的mintedAmount,使得balanceOf[target] + mintedAmount发生整数溢出,计算结果变为一个极小值。

超额铸币(CVE-2018-11809)

类型描述:管理员通过构造恶意参数,可以绕过程序中规定的token发行上限,实现超额铸币。合约Playkey (PKT)存在此类漏洞,导致合约中的铸币上限形同虚设,从而发行任意多的token。此外,我们还发现Nexxus (NXX)、Fujinto (NTO)两个合约存在类似漏洞,这两个合约没有铸币上限限制,但同样的手段,可以溢出合约中一个用于记录已发币总量(totalSupply)的变量值,使其与市场中实际流通的总币数不一致。 

漏洞实例:合约Playkey (PKT)

合约地址:
https://cn.etherscan.com/address/0x2604fa406be957e542beb89e6754fcde6815e83f#code

漏洞位置:红色标注的行L241

整形数据的溢出概念(什么是整数溢出)

漏洞危害:管理员可以篡改已发币总量(totalSupply)为任意值,并绕过合约中的铸币上限超额发行token; 

漏洞原理:_value在函数调用时被设置为精心构造的极大值,使得totalSupply + _value计算结果溢出后小于tokenLimit,从而轻易绕过L237行的铸币上限检测。

超额分配(CVE-2018-11810)

类型描述:管理员通过制造溢出来绕过合约中对单地址发币的最大上限,可以对指定地址分配超额的token,使得对单地址的发布上限无效。 

漏洞实例:合约LGO (LGO) 

合约地址:
https://cn.etherscan.com/address/0x123ab195dd38b1b40510d467a6a359b201af056f#code

漏洞位置:红色标注的行L286

整形数据的溢出概念(什么是整数溢出)

漏洞危害:管理员绕过合约中规定的单地址发币上限,给指定地址分配超额的token; 

漏洞原理:一个极大的_amount可以使得算数加法运算holdersAllocatedAmount + _amount发生整数溢出,变为一个极小值,从而绕过L286的检测。

超额购币(CVE-2018-11809)

漏洞描述:买家如果拥有足够多的ETH,可以通过发送大量token制造溢出,从而绕过ICO发币上限,达到超额购币。 

漏洞实例:合约EthLend (L

原创文章,作者:七芒星实验室,如若转载,请注明出处:https://www.sudun.com/ask/34326.html

(0)
七芒星实验室's avatar七芒星实验室
上一篇 2024年4月15日 上午8:32
下一篇 2024年4月15日 上午8:34

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注