{ 跳至内容 }

Solidity ABI 解码器多维内存数组漏洞

发布于 2021 年 4 月 21 日 Solidity 团队

安全警报

2021 年 4 月 5 日,Certora 开发团队的 John Toman 报告了 Solidity ABI 解码器 v2 中的一个漏洞。Certora 的漏洞披露帖子可以在这里找到反序列化代码中的内存隔离违规.

该漏洞已在 2021 年 4 月 21 日发布的 Solidity 版本 0.8.4 中修复。此漏洞存在于 ABI 编码器 v2 的所有先前版本中。

我们将此漏洞的严重程度评定为“非常低”,主要是因为该漏洞非常难以利用。

我们非常感谢 John 为发现 Solidity 编译器中的漏洞所付出的持续努力。

谁应该关心

如果您正在使用 ABI 编码器 v2(从 0.8.0 开始是默认值),特别是函数abi.decode 在内存(而不是 calldata)数组上使用多维数组或包含结构体的数组,您可能会受到影响。

此漏洞的影响是,如果编码数据是专门制作的,则解码后的值可能取决于内存中要解码的数据之外的值。

这意味着使用相同数据对 abi.decode 进行两次调用可能会导致不同的值。

无法以导致无效内存写入操作的方式利用此漏洞。

使用 abi.decode 在 calldata 字节数组上,或隐式使用 abi.decode 用于函数参数不受影响。

漏洞详细信息

ABI 规范对所有动态大小的数据使用指向数据区域的指针。当从内存(而不是 calldata)解码数据时,ABI 解码器没有正确验证其中一些指针。更具体地说,可以使用数组中的指针的大值,以便计算偏移量导致未检测到的溢出。这将导致这些指针指向内存中的区域,而不是要解码的实际区域。这样,abi.decode 可能会返回从内存中其他区域获取的值。

上一篇博文

下一篇博文

参与进来

GitHub

Twitter

Mastodon

矩阵

了解更多

博客文档用例贡献关于论坛

2024Solidity 团队

安全策略

行为准则