{Solidity:log}
逐字区块重复数据删除中的错误
Solidity 团队于 2023 年 11 月 8 日发布
10 月 24 日,Ori Pomerantz 报告了一个影响在 Yul 代码中使用逐字内置函数的错误。经过调查,团队能够确认问题并找到其根源。该错误存在于块重复数据删除优化器步骤中,其中识别并合并了等效的汇编块。被相同的操作码包围的逐字汇编项被错误地视为相同并被统一。该错误从 0.8.5 版本(引入了逐字)开始存在,并且仅影响启用了优化的纯 Yul 编译。Solidity 代码或在内联汇编块中使用的 Yul 将...
阅读更多访问具有副作用的表达式的 .selector 成员时,旧版代码生成中的错误
Solidity 团队于 2023 年 7 月 19 日发布
2023 年 6 月 26 日,在调查与使用 abi.decode 相关的安全报告时,发现了 Solidity 编译器旧版代码生成管道中的一个错误,该报告中使用三元表达式(具有副作用)作为类型参数。旧版代码生成器没有评估复杂的表达式,例如赋值、函数调用或条件表达式,这些表达式的 .selector 正在被访问。这导致此类表达式的副作用未执行,因此可能导致使用旧版管道编译的合约出现错误行为。该...
阅读更多FullInliner 非表达式拆分参数评估顺序错误
Solidity 团队于 2023 年 7 月 19 日发布
2023 年 7 月 4 日,OtterSec 的 Robert Chen 发现了一个 Yul 优化器错误。编译器的最早受影响版本是 0.6.7,该版本引入了修改优化器步骤序列的功能。2023 年 7 月 19 日发布的 Solidity 版本 0.8.21 提供了修复程序。我们为该错误分配了“低”的总体分数。该错误在受影响的情况下具有“高”严重性,但我们认为它实际影响已部署合约的可能性“非常低”。哪些合约受影响?触发此错误的先决条件是...
阅读更多在条件提前终止时存储写入删除错误
Solidity 团队于 2022 年 9 月 8 日发布
2022 年 9 月 5 日,通过差异模糊测试发现了 Solidity 的 Yul 优化器中的一个错误。该错误是在版本 0.8.13 中引入的,并且 2022 年 9 月 8 日发布的 Solidity 版本 0.8.17 提供了修复程序。通过 IR 代码生成的优化更容易触发该错误,但理论上也可能发生在旧版代码生成的优化中。我们为该错误分配了“中/高”的严重性。谁应该关注如果您正在使用旧版代码生成的优化,则仅当您使用...时才需要关注。
阅读更多调用数据元组 ABI 重新编码中的头部溢出错误
Solidity 团队于 2022 年 8 月 8 日发布
2022 年 7 月 5 日,来自以太坊基金会的 Chance Hudson(@vimwitch)发现了 Solidity 代码生成器中的一个错误。编译器的最早受影响版本是 0.5.8,该版本引入了调用数据数组和结构的 ABI 重新编码。2022 年 8 月 8 日发布的 Solidity 版本 0.8.16 提供了修复程序。我们为该错误分配了“中”的严重性。哪些合约受影响?当合约执行满足以下所有条件的元组的 ABI 编码时,该错误的影响就会显现:元组的最后一个组件...
阅读更多关于内联汇编的内存副作用的优化器错误
Solidity 团队于 2022 年 6 月 15 日发布
2022 年 6 月 5 日,Certora 开发团队的 John Toman 报告了一个优化器错误,该错误可能导致在某些条件下内联汇编块中的内存写入被错误地删除。该错误是在 Solidity 0.8.13 中引入的,其中增加了一个新的 Yul 优化器步骤,旨在删除对内存和存储的未使用写入。我们为该错误分配了“中”的严重性。哪些合约受影响?Yul 优化器将最外层 Yul 块中从未读取的所有内存写入视为未使用并将其删除。这...
阅读更多将脏字节数组复制到存储时的错误
Solidity 团队于 2022 年 6 月 15 日发布
2021 年 7 月 1 日,通过差异模糊测试发现了 Solidity 代码生成器中的一个错误。该错误会导致旧版代码生成管道生成可能在复制来自调用数据或内存的字节数组时将脏值写入存储的代码。最初,假设存储中的脏值仅可以使用内联汇编观察到。但是,使用空的 .push() 调整字节数组大小而实际上不向其写入值,可能会在没有任何内联汇编的情况下公开脏字节。该错误...
阅读更多关于继承期间数据位置的错误
Solidity 团队于 2022 年 5 月 17 日发布
2021 年 2 月 5 日,Nicolas Venturo 报告了一个错误,该错误允许覆盖函数将参数的数据位置从内存更改为调用数据。该错误是在 Solidity 0.6.9 中引入的,同时引入了对所有变量(而不仅仅是外部函数的参数)使用调用数据数据位置的功能。我们为该错误分配了“非常低”的严重性。哪些合约受影响?该错误的影响是内存指针被解释为调用数据指针,反之亦然。仅当您更改...时才会发生这种情况。
阅读更多嵌套调用数据数组 ABI 重新编码中的大小检查错误
Solidity 团队于 2022 年 5 月 17 日发布
2022 年 4 月 7 日,Certora 开发团队的 John Toman 报告了 Solidity 代码生成器中的一个错误。Certora 的错误披露帖子可以在这里找到。该错误已通过 2022 年 5 月 17 日发布的 Solidity 版本 0.8.14 修复。该错误最初是在 Solidity 版本 0.5.8 中引入的。我们为该错误分配了“非常低”的严重性。哪些合约受影响?如果您将嵌套数组直接传递给另一个外部函数调用或对其使用 abi.encode,则可能会受到影响。如果调用数据是...
阅读更多abi.encodeCall 字面量错误
Solidity 团队于 2022 年 3 月 16 日发布
2022 年 3 月 10 日,Solidity 团队在将 abi.encodeCall 与固定长度的字节字面量一起使用时发现了实现中的一个错误。它是在 Solidity 0.8.11 中与 abi.encodeCall 一起引入的,并在 0.8.13 中修复。我们为该错误分配了“非常低”的严重性。哪些合约受影响?如果您使用 abi.encodeCall(f, (...)) 其中 f 接受 bytesNN 参数,并且您提供的该参数的值是十六进制字面量 (0x1234 或 hex"abcd") 或字符串字面量 ("abcd"),则可能会受到影响。如果您仅...
阅读更多用户定义的值类型错误
Solidity 团队于 2021 年 9 月 29 日发布
2021 年 9 月 28 日,Truffle 的 Harry Altman(@haltman-at)发现了用户定义的值类型中的一个错误。该错误对 Solidity 合约的正确性没有影响,但使用 Solidity 0.8.8 编译并使用新功能的合约会不必要地浪费资源,并且可能在工具或合约升级方面存在问题。该错误仅存在于 Solidity 0.8.8 中,并在 0.8.9 中修复。我们为该错误分配了“非常低”的严重性。用户定义的值类型的存储布局编译器没有正确计算存储布局...
阅读更多签名不变性错误
Solidity 团队于 2021 年 9 月 29 日发布
2021 年 9 月 28 日,Solidity 团队发现,对于小于 256 位的有符号整数类型的不变变量,其值的符号扩展(清理)并不总是正确执行。据我们所知,仅当使用内联汇编时,才能以其未清理状态访问该值。该错误从 Solidity 0.6.5 中引入不变性功能以来就存在,并在 0.8.9 中修复。我们为该错误分配了“非常低”的严重性。技术细节当在 Solidity 中构造期间分配不变变量时...
阅读更多Solidity ABI 解码器对于多维内存数组的错误
Solidity 团队于 2021 年 4 月 21 日发布
2021 年 4 月 5 日,Certora 开发团队的 John Toman 报告了 Solidity ABI 解码器 v2 中的一个错误。Certora 的错误披露帖子可以在这里找到:反序列化代码中的内存隔离违规。该错误已通过 2021 年 4 月 21 日发布的 Solidity 版本 0.8.4 修复。该错误存在于 ABI 编码器 v2 的所有先前版本中。我们为该错误分配了“非常低”的严重性级别,这主要是因为利用该错误非常困难。我们正在...
阅读更多Solidity 优化器 Keccak 缓存错误
Solidity 团队于 2021 年 3 月 23 日发布
2021 年 3 月 20 日,通过差异模糊测试发现了 Solidity 的字节码优化器中的一个错误。该错误已通过 2021 年 3 月 23 日发布的版本 0.8.3 修复。该错误存在于 Solidity 的所有先前版本中。我们为该错误分配了“中”的严重性级别。技术细节摘要:字节码优化器错误地重新使用了先前计算的 Keccak-256 哈希值。如果您没有在内联汇编中计算 Keccak-256 哈希值,则您不太可能受到影响。Solidity 的字节码优化器有一个步骤可以在以下情况下计算 Keccak-256 哈希值:如果...
阅读更多Solidity 空字节数组复制错误
Solidity 团队于 2020 年 10 月 19 日发布
2020 年 10 月 14 日,Certora 开发团队的 John Toman 报告了 Solidity 代码生成器中的一个错误。Certora 的错误披露帖子可以在这里找到。该错误已通过 2020 年 10 月 19 日发布的 Solidity 版本 0.7.4 修复。该错误存在于 Solidity 的所有先前版本中。我们为该错误分配了“中”的严重性级别。谁应该关注此错误可能导致存储中字节或字符串数组的新创建元素由非零值初始化。为了...
阅读更多Solidity 动态数组清理错误
Solidity 团队于 2020 年 10 月 7 日发布
2020 年 9 月 17 日,发现了一个 Solidity 代码生成器中的错误。该错误已通过 2020 年 10 月 7 日发布的版本 0.7.3 修复。该错误存在于 Solidity 的所有先前版本中。我们为该错误分配了“中”的严重性级别。错误的技术细节摘要:对于大小最多为 16 字节的类型的动态大小存储数组,需要删除槽的赋值没有正确清零已删除的槽。考虑存储中一个动态大小的数组,其基本类型足够小...
阅读更多Solidity 内存数组创建溢出错误
Solidity 团队于 2020 年 4 月 6 日发布
3 月 28 日,通过以太坊基金会赏金计划,Certora 的 John Toman 报告了 Solidity 代码生成器中的一个错误。该错误已通过 2020 年 4 月 6 日发布的版本 0.6.5 修复。该错误存在于 Solidity 的所有先前版本中。我们分配了“低”的严重性级别,因为我们发现该错误并不常见,并且难以利用。谁应该关注如果您已部署了一个分配用户提供的长度的内存数组的合约,但没有...
阅读更多Solidity 存储数组错误
Solidity 和安全团队于 2019 年 6 月 25 日发布
这篇文章最初发布在以太坊博客上。这篇博文是关于与存储数组相关的两个错误,这两个错误本身并不相关。两者在编译器中存在了很长时间,直到现在才被发现,尽管包含它们的合约很可能在测试中出现故障。来自 Curvegrid 的 Daenam Kim 在 Nguyen Pham 的帮助下发现了一个问题,即与有符号整数数组相关的无效数据存储。这个错误已经...
阅读更多Solidity 优化器和 ABIEncoderV2 错误
Solidity 和安全团队于 2019 年 3 月 26 日发布
这篇文章最初发布在以太坊博客上。通过以太坊漏洞赏金计划,我们收到了一份关于新实验性 ABI 编码器(称为 ABIEncoderV2)中的缺陷的报告。经过调查,发现该组件存在几种不同类型的相同错误。本公告的第一部分详细解释了此错误。新的 ABI 编码器仍然被标记为实验性,但我们仍然认为这值得发布一个突出的公告,因为...
阅读更多Solidity 错误修复版本
Solidity 团队于 2018 年 9 月 13 日发布
这篇文章最初发布在以太坊博客上。Solidity 的最新版本 0.4.25 修复了两个重要的 bug。另一个重要的 bug 已经在 0.4.22 版本中修复,但最近才发现该 bug 存在。请注意,以太坊基金会为 Solidity 的代码生成器部分运行了一个赏金计划。指数运算中的指数清理发生可能性:非常低可利用性:高测试可发现性:低修复版本:0.4.25摘要:在指数运算操作的指数中使用短类型可能会导致...
阅读更多Solidity 优化器 Bug
作者:Martin Swende 发布日期:2017年5月3日
这篇文章最初发布在以太坊博客上。Christoph Jentzsch 通过以太坊基金会赏金计划报告了 Solidity 优化器中的一个 bug。此 bug 已于 2017 年 5 月 3 日通过发布 Solidity 0.4.11 版本进行了修复。背景问题中的 bug 与优化器如何优化字节码中的常量有关。我们所说的“字节码常量”是指任何推送到堆栈上的内容(不要与 Solidity 常量混淆)。例如,如果值 0xfffffffffffffffffffffffffffffffffffffffffffffffe 被推送到堆栈上,...
阅读更多存储损坏 Bug 分析
作者:Christian Reitwiessner 发布日期:2016年11月9日
这篇文章最初发布在以太坊博客上。这篇博文提供了我们对上周发现的存储损坏 bug 的调查结果的更新。总之,该 bug 比我们最初认为的要轻微得多。我们发现的少量受影响的合约要么只能被所有者利用,要么漏洞只能导致用户界面中断,而不会影响实际的合约逻辑。我们审查的所有可利用合约/dApp 都可以修复...
阅读更多安全警报:变量可能被覆盖存储
作者:Christian Reitwiessner 发布日期:2016年11月1日
这篇文章最初发布在以太坊博客上。摘要:在某些情况下,变量可能会覆盖存储中的其他变量。*受影响的 Solidity 编译器版本:*0.1.6 至 0.4.3(包括 0.4.4 预发布版本)详细说明:小于 256 位的存储变量如果可以容纳,则会打包到同一个 256 位槽中。如果为第一个变量分配的值大于类型允许的值,则该值将覆盖第二个变量。这意味着如果攻击者可以导致...
阅读更多