理解加密货币中的整数溢出与下溢攻击

整数溢出与下溢攻击,源于数学直觉与计算机实际运算方式之间的根本差异。

New to Nervos? Start here.

Explore the guide
理解加密货币中的整数溢出与下溢攻击

整数溢出攻击(integer overflow attack)或下溢攻击(underflow attack)是一类软件漏洞:计算机程序进行算术运算时,结果超出固定大小整数所能表示的最大值或最小值,导致数值以非预期且往往危险的方式回绕。

在加密货币和基于区块链的智能合约中,这个看似普通的编程问题,已被证明是去中心化系统历史上代价最高、破坏性最强的攻击途径之一。它导致资金冻结、未经授权的代币铸造和大规模经济损失,动摇了人们对早期去中心化金融(DeFi)生态的信心。这类事件尤其值得关注,因为其根源不是密码学失效,而是深藏在合约逻辑中的细微算术假设。

计算机系统中的整数概念

计算机系统中的整数,并非取值范围无限的抽象数学对象,而是用特定位数存储在内存中的固定大小表示。这一区别至关重要,因为它解释了溢出和下溢为什么会存在。在数学中,数值可以任意增大或减小;但在计算中,每种整数类型都有最大值和最小值,由分配给它的位数以及是否带符号决定。

例如,无符号 8 位整数可表示 0 到 255,而有符号 8 位整数通常可表示 -128 到 127。当算术运算的结果超出这一范围时,计算机默认不会报错,而会发生回绕:255 加 1 得到 0,0 减 1 得到 255。这种行为本身并不是程序缺陷,而是许多编程语言和处理器架构中底层算术运算的一项规定特性。

在传统软件开发中,整数溢出和下溢是众所周知的风险,通常可以通过测试、防御性编程或运行时检查加以缓解。但在区块链系统中,后果会被放大,因为代码一经部署便不可变,交易不可逆,而且智能合约经常管理真实的财务价值,却没有能够介入的中央权威。因此,在常规应用中可能只是小缺陷的问题,在去中心化环境中却可能成为灾难性漏洞。

什么是整数溢出与整数下溢攻击?

整数溢出攻击发生在攻击者有意触发某项算术运算,使结果超过整数所能容纳的最大值,导致数值回绕到一个小得多的数。相反,整数下溢攻击发生在运算结果低于可表示的最小值,导致数值回绕到一个大得多的数。在这两种情况下,攻击者都利用可预测的算术行为,以开发者未曾预期的方式操纵程序逻辑。

在区块链应用中,这些攻击常针对余额计算、代币供应量更新,或用于追踪所有权、权限和限额的计数器。例如,如果智能合约在扣减用户代币余额时,没有正确检查余额是否足够,攻击者就可能引发下溢,让余额变成一个巨大的数,而不是零。同样,如果增加代币总供应量时不检查边界,也可能引发溢出,将供应量重置为较小的数,从而为进一步利用创造条件。

这类攻击尤其隐蔽,因为它们无需破解密码学,也无需利用网络层弱点,完全依赖代码按照平台规则正确执行。从区块链的角度看,一切都按设计运行,尽管经济与逻辑结果是灾难性的。技术上的正确执行与经济上的失败同时出现,是去中心化系统中整数溢出和下溢攻击的显著特征。

整数溢出与下溢攻击在实践中如何发生

整数溢出或下溢攻击通常遵循简单的模式。攻击者先找到智能合约中对用户可控输入进行算术运算的函数,再确定所用整数类型的取值范围,计算出会使算术运算回绕的数值。最后,攻击者提交交易,触发这种行为,并利用由此产生的错误状态(state)。

以一个使用无符号整数追踪余额的简化代币合约为例。如果合约从发送者余额中扣除转账金额时,不检查余额是否大于或等于该金额,攻击者就可以指定一个超过发送者余额的金额。减法不会失败,而是发生下溢,产生一个极大的数,成为新的余额。之后,攻击者就能随意转移代币,或操纵系统中依赖余额检查的其他部分。

这一过程之所以对攻击者可靠,是因为它具有确定性。区块链执行完全可预测,算术行为没有随机性,同一笔交易会在每个节点上产生相同结果。一旦攻击者理解算术规则,利用漏洞就成了精确计算的问题,而非猜测。

区块链早期事件带来的教训

2018 年的 BeautyChain 攻击是最常被引用的整数溢出案例之一。漏洞位于批量转账函数中:该函数计算待转账代币总量时,未能正确处理乘法运算。攻击者通过触发溢出生成了数量惊人的代币,使其涌入市场,导致代币实际上变得一文不值。

另一个有启示意义的案例是 Proof of Weak Hands Coin。其提现逻辑中的下溢漏洞,让用户能够提取超过存入金额的 ETH。原本用于减少用户余额的减法发生回绕,使用户能够反复提取 ETH,直至合约资金大部分耗尽。

所谓的 BatchOverflow 漏洞表明,共享代码模式可能放大风险。许多 ERC-20 代币合约采用相似逻辑实现批量转账功能,而这些逻辑常常复制自通用示例。这些实现依靠未经检查的乘法计算转账总额,造成广泛的溢出风险。攻击者在多个项目中利用这一共同弱点,未经授权铸造大量代币。虽然具体经济损失各不相同,但对信任和生态稳定性的广泛影响十分显著。

随着 DeFi 成熟,整数溢出和下溢漏洞变得不那么常见,但并未完全消失。流动性池、奖励计算和杠杆机制之间日益复杂的交互,引入了新的算术边界情况。即使攻击手法变得更加复杂,基本教训仍未改变:细小的算术错误一旦嵌入金融逻辑,仍可能造成远超预期的后果。

缓解策略与最佳实践的演进

为应对早期这些失败,区块链社区制定了多种缓解策略,旨在降低整数溢出和下溢攻击的风险。其中最重要的进展之一,是安全算术库得到广泛采用。在以太坊生态中,SafeMath 等库成为标准做法,提供能够自动检查溢出和下溢的算术运算,一旦违规便回退交易。

编程语言的演进也发挥了关键作用。较新版本的 Solidity 默认内置溢出和下溢检查,从根本上改变了算术模型,让安全性优先于单纯的性能。这一转变大幅降低了现代智能合约意外出现算术漏洞的可能性。

除了工具,安全审计和形式化验证也已成为智能合约开发不可或缺的部分。专业审计会专门查找算术缺陷,形式化方法则可以从数学上证明,某些类别的错误,包括溢出和下溢,不会在任何执行路径中发生。尽管没有哪种方法能提供绝对保证,这些实践仍能显著提高攻击成本,降低灾难性故障的概率。

结语

整数溢出与下溢攻击,源于数学直觉与计算机实际运算方式之间的根本差异。在区块链和智能合约领域,这种差异使加密货币历史上一些破坏性最强的攻击得以发生。

现代语言、库和安全实践虽然已大幅减少这类漏洞,却无法将其完全消除。算术仍是计算的基础,任何管理数字价值的系统都必须谨慎对待它。长期适用的教训很明确:区块链系统的安全性不仅依赖密码学,也依赖严谨的算术推理、规范的设计,以及持续的警觉。

Share
CKB

CKBuilders:CKB 上的新一代区块链创作者——第二辑

一年过去,CKBuilders 在探索深度和参与广度上都有了显著成长。本文将继续讲述那些不断突破边界的建设者的故事

30 min read

支付通道网络如何支持多种资产

了解 Taproot Assets、RGB 和 Fiber 如何支持多资产支付通道,以及 Fiber 的跨链枢纽如何连接比特币闪电网络。

12 min read

实现即时加密货币支付的五种闪电网络替代方案

走出只支持比特币的支付层:了解为稳定币、智能合约和自主 AI 智能体打造的即时加密货币支付基础设施。

9 min read
See all articles
↑