以太坊基金会官方博客发布消息,智能合约语言 Solidity 及 安全团队发布了一篇公告表示,Solidity 存储阵列出现缺陷。

据该公告称,该bug都在编译器中存在了很长时间,直到现在才被发现,即使包含它们的合约很可能在测试中出现故障。

Daenam Kim发现了一个问题,其中无效数据存储在与带符号整数数组的连接中。这个bug 从solid 0.4.7开始就存在了,安全团队认为它是两个bug中比较严重的一个。如果这些数组在特定情况下使用负整数,就会导致数据损坏,因此应该很容易检测到错误。

通过以太坊 bug 奖励金程序,团队收到了关于新的实验性ABI编码器(称为ABIEncoderV2)中的一个缺陷的报告。新的ABI编码器仍然被标记为实验性的,但因为它已经在主网上使用所以仍然是一个需要被告知出来的问题。感谢林明川发现并修复了这个bug!

0.5.10版本包含了对bug的修复。目前,我们不打算发布对遗留0.4的修复。在接触相关代码路径的测试中,这两个bug都应该很容易看到。

如果您已经部署了在存储中使用带符号整数数组并直接分配的合约,那么需要关注这个该bug。
一个包含至少一个负值的文字数组(x =[-1, -2, -3])或一个与之不同的带符号整数类型的现有数组,这将导致存储数组中的数据损坏。

如何检查合约是否容易受到攻击?

如果在存储中使用带符号整数数组,那么可以尝试在使用负值的地方运行测试。结果应该是实际存储的值是正的而不是负的。

存储数组可以从不同类型的数组分配。在复制和赋值操作期间,对每个元素执行类型转换。

ABIEncoderV2数组错误

如果您已经部署了使用实验性ABI encoder V2的合约,那么这些合约可能会受到影响。这意味着只有在源代码中使用以下指令的合约才会受到影响:

pragma experimental ABIEncoderV2;

只有当满足以下所有条件时,该bug才会出现:

包含数组或结构体的数据被直接发送到外部函数的调用,abi.encode 或没有预先分配本地(内存)的事件数据申请。

该数据要么包含结构体数组,要么包含固定大小的数组(即至少是二维数组)。

可能后果

当然,在程序控制流程中 bug 都会产生各种各样的后果,但我们预期这更容易导致故障而非可用性。

当此 bug 触发时,某些情况下会将方法调用的被损坏参数发送到其他合约。

内容来源:区块律动