什么是 Integer Overflow Attack?
Integer Overflow Attack 发生在程序的数值达到最大值然后回绕到最小值,从而让攻击者可以篡改余额或限制。在加密领域,这种回绕可以把像“你有足够的代币吗?”的检查从原本应该为否的情况变成是。想象一下老式里程表从 999999 翻到 000000,但赌注是金钱。
“现代编译器会阻止这类事情发生。”不尽然。许多 智能合约 在某些地方仍然使用未检查的算术、自定义数学函数或汇编代码,这些都可能重新引入溢出漏洞。
Integer Overflow Attack 如何运作
下面用一个代币合约作示范,快速说明流程。
- 步骤 1:合约用定长整数存储余额,并提供一个用于相加、相减或相乘金额的函数。
- 步骤 2:攻击者选择会把数值推过最大值的输入,导致回绕到很小或接近零的值。
- 步骤 3:这种回绕会颠倒某个检查。例如:回绕后余额看起来很大,或转账限制看起来很小,于是 require 通过。
- 步骤 4:攻击者铸造了不应得的代币,绕过了上限,或转移了他们本不该能动用的资金。
- 步骤 5:他们通过交易或桥接把收益洗掉,然后在被发现前离开。
真实案例:曾有多个 ERC 20 代币出现批量溢出漏洞,攻击者借此铸造出荒谬的供应量,然後在交易所抛售。确实发生过。
为什么 Integer Overflow Attack 很重要
如果你持有代币、开发应用或在 DeFi 交易,你应该在意。这关乎数字,而数字掌控加密系统。
- 好处:了解其运作方式能帮你及早发现危险信号,保护资金。
- 观点:算术类漏洞长期存在。新链和新工具层出不穷,但数学错误仍然会被攻击者利用。
- 相关性:你会在代币供应计算、奖励系统、NFT 计数器以及常见的 去中心化应用 中看到它们,这些系统会处理用户余额。
在 Solidity 中,默认保持算术检查,並把 unchecked 块控制到最小并审计。加入模糊测试,尝试极端数值,而不只是常规路径。
Integer Overflow Attack 的关键特征
与其他漏洞不同之处:
- 回绕:数值从最大值跳回零,就像循环计数器。
- 无声发生:如果算术未被检查,没有内置错误,失败结果看起来像正常输出。
- 可触发:通常用户可控的输入可以促成恰好发生回绕的时刻。
- 可重复:一旦找到,攻击者可以脚本化并在多个目标上重复利用。
变体
主要的几种形式,同一家族、不同路径:
- 下溢:相减低於零並回绕到很大的值。
- 相加:对余额或供应相加使其超过最大值然后回到小数值。
- 相乘:奖励乘数或缩放因子把值推过限制。
- 计数器:代币 ID 或供应计数器翻滚,允许在达到上限后继续铸造。
Integer Overflow Attack 不只出現在 Solidity。它也可能在 Vyper、Rust、Move 或自定义汇编中出现,许多公开的 漏洞利用 本质上都是围绕余额或供应的未检查算术。
示例
一个奖励函数把用户提供的数乘以大的加成,数值回绕,限制检查通过,Integer Overflow Attack 让攻击者铸造远超预期的代币。
趣闻
街机经典游戏在第 256 关的崩溃?那个臭名昭著的冻结来源於整数溢出,证明即使复古游戏也会无意中出现类似加密的漏洞。
总结
把 Integer Overflow Attack 想像成数值跑了一个完整圈,攻击者从缝隙中冲出来;保持算术检查,你会更安心。
