针对由 PeckShield 团队发现的 batchOverflow bug 的修复方案。
原始合约只做了一项检查,以确保发送者有足够的 whatever 来支付总金额(输入值 x 地址数量)。如果发生溢出,该金额可能为零,这将使 line 12 上的测试通过。

一种可能的修复方法是添加另一项测试,检查发送者的余额减去该金额后是否小于其当前余额。如果发生溢出,余额将保持不变,从而使其成为无效交易。但这仍然不能解决问题。如果攻击者的余额很小,比如 10 whatever,攻击者可以构造 _value 使其溢出到小于其当前持有余额的某个数值,从而通过这一道检查。
更好的修复方法是直接检查转账的总金额是否大于或等于 _value。如果发生溢出,该测试将无法通过。攻击者要绕过这一检查,至少需要拥有那个神奇数字 / 20 的数量,这仍然是一个非常巨大的数额,并且如果不利用另一个漏洞,可能无法获得。
请确保你已安装 truffle,并在项目根目录运行 truffle test 命令。效果应该类似于这样。
