火星链 火星链
Ctrl+D收藏火星链
首页 > ICP > 正文

COD:Solidity Optimizer and ABIEncoderV2 Bug

作者:

时间:1900/1/1 0:00:00

通过以太坊漏洞赏金计划,我们收到了关于新的实验性ABI编码器(名为ABIEncoderV2)中的一个缺陷报告。经研究,我们发现该组件存在一些相同类型的不同变化。本公告的第一部分详细解释了这个错误。新的ABI编码器仍然标记为实验性的,但我们认为这值得强调,因为它已经在主网上使用。

此外,优化器中的两个低影响bug在过去两周内已经被确定,其中一个bug已经在Solidityv0.5.6修复。两者都是在0.5.5版本中引入的。详情请参阅本公告的第二部分。

在0.5.7版本中,本文中提到的所有bug与漏洞都已经被修复。

这里提到的所有bug都应该在涉及相关代码路径的测试中很容易看到,至少在使用0和非0值的所有组合运行时是这样。

感谢Melonport团队(TravisJacobs和JennaZenk)和MelonCouncil(NickMunoz-McDonald,MartinLundfall,MattdiFerrante和AdamKolar),他们通过以太坊漏洞赏金计划报告了这些!

Solana验证者运营商已于北京时间15:00成功完成主网Beta集群重启:10月1日,据官方消息,Solana 验证者运营商已于北京时间 15:00 成功完成主网 Beta 集群重启,网络运营商和 Dapp 将在接下来的几个小时内恢复客户服务。[2022/10/1 18:36:56]

谁应该关注

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

pragmaexperimentalABIEncoderV2;

此外,还有许多需要触发的bug。有关更多信息,请参阅下面的技术详细信息。

据我们所知,主网上有大约2500个合同使用实验ABIEncoderV2。尚不清楚其中有多少存在该bug。

如何检查合约是否受影响

分析:Solana并未遭到DDoS攻击,实际问题已在未发布的1.9版本中解决:12月12日消息,Rockaway Blockchain Fund(RBF)验证器和质押业务负责人Tomá? Eminger在推特上就有关“Solana最近遭到DDoS攻击导致TPS下降”一事表示:“这不是很多人说的DDoS网络攻击。自12月9日以来,Solana网络并没有失去共识,也没有停止运行,只是四次放缓至1000 TPS。看起来,Raydium机器人试图将大型交易打包到区块中,这消耗了大量的计算能力,这是通过BPF(Berkley Packet Filter)计算单位来衡量的(Solana不将其计入打包区块逻辑),导致了节点上的缓慢重放,然后问题级联至网络中,导致slot确认时间过长和slot leaders丢失区块。从AcceleRaytor页面看,12月9日和10日进行IDO的是Realy。Raydium是否能够就此予以确认?”

Eminger还称:“此问题已在未发布的1.9软件版本中解决,Solana区块链联合创始人Anatoly Yakovenko和他的团队正在努力将其backport到1.8.9版本中,很快就会在主网上测试和批准。正如我之前提到的,Solana还处于Mainnet-beta阶段,所以软件并不是很完美,但是很高兴看到团队如何响应问题并努力工作来升级软件。”[2021/12/12 7:34:09]

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

去中心化多链钱包Coinhub上线Solana网络:据官方消息,去中心化多链钱包 Coinhub 宣布现已上线 Solana网络,用户能够通过 Coinhub 访问 Sonala 生态应用,以及存储和交易 SPL 标准代币。

据悉,去中心化钱包Coinhub是一个支持多平台的多链钱包,集成钱包、数据、理财、挖矿、交易等多种功能,现在已支持 BTC、ETH、HECO、BSC、Solana、MATIC、AVAX、FTM等20+公链,已合作800+dapp,用户分布全球50+国家以及地区。[2021/10/24 6:09:57]

涉及到数组或结构的存储数据直接发送到外部函数调用,发送到abi.encode或发送到eventdata,而无需事先分配给本地变量AND

数组包含大小小于32字节的元素,或者一个结构具有共享存储槽的元素或类型bytesNN小于32字节的成员。

LBank蓝贝壳于4月28日20:00上线 SOL:据官方公告,4月28日20:00,LBank蓝贝壳上线SOL(Solana),开放USDT交易,4月28日19:00开放充值,4月30日18:00开放提现。资料显示,Solana由前高通,英特尔和Dropbox工程师于2017年底创立,是一种单链委托权益证明协议,其重点是在不降低分散性或安全性的前提下提供可扩展性。Solana扩展解决方案的核心是名为“历史证明(PoH)”的分散式时钟,旨在解决分布式网络中没有单个可信赖时间源的时间问题。[2021/4/28 21:06:43]

除此之外,在以下情况下,您的代码不受影响:

如果所有结构或数组仅使用uint256或int256类型

如果您只使用整数类型并且一次只编码一个数组

如果您只返回此类数据但不使用abi.encode,在外部调用或事件数据中。

动态 | 加拿大区块链公司与Soluna合作 助其创建风力发电厂提供廉价挖矿能源:据Business Wire消息,加拿大区块链公司DMG与Soluna达成合作。据悉,DMG将为Soluna提供硬件采购,数据中心设计,采矿设置,远程硬件和系统监控以及所有必要的支持服务。据此前报道,Soluna计划在摩洛哥撒哈拉沙漠中建造一个风力发电场,将会加密矿商提供约0.2元/度的廉价电力。[2018/9/15]

如果您的合约符合这些条件,并且想要验证合约是否确实存在漏洞,您可以通过与我们联系。

如何防止

为了保守起见,实验性ABI编码器只有在明确启用时才可用,允许人们与它进行交互并测试它,而不会在它被认为稳定之前对它过分信任。

我们尽最大努力确保高质量,并且最近开始研究OSS-Fuzz上某些部分的“语义”模糊测试。

对于开发人员-使用漏洞检测器等工具很难检测Solidity编译器中的,因为对源代码或抽象语法树表示进行操作的工具不会检测仅引入编译字节码的缺陷。

防止这些缺陷的最佳方法是为您的合约进行一系列严格的端到端测试,因为编译器中的错误很可能不是“静默”而是表现为无效数据。

危害

当然,根据程序控制流程,任何bug都会产生各种各样的后果,但我们预计这更容易导致故障而不是可利用性。

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

时间线

2019年3月16日:

通过漏洞赏金计划进行报告,关于直接从存储到ABI编码器的布尔数组中读取时所导致的损坏。

2019年03月16日至2019年03月21日:

调查根本原因,分析受影响的合约。在主网上部署了大量使用实验性编码器编译的合约,其中许多合约没有经过一致性校验的源代码。

对bug的调查发现了更多触发bug的方法,例如使用结构。此外,在同一程序中还发现了一个数组溢出错误。

检查了在Github上发现的一些合约,没有发现任何合约受到影响。

对ABI编码器进行了错误修正。

2019年03月20日:

决定公开信息。

推理:检测所有易受攻击的合同并及时与所有作者联系是不可行的,最好防止主网上的不安全合约进一步扩散。

2019年3月26日:

新的编译器版本,版本0.5.7。

这篇文章发布了。

技术细节

背景

合约ABI是一种规范如何与来自外部的合约或合约之间的交互来交换数据的规范。它支持各种类型的数据,包括数字,字节和字符串等简单值,以及更复杂的数据类型,包括数组和结构。

当合同收到输入数据时,它必须解码,并且在返回数据或将数据发送到另一个合同之前,它必须对其进行编码。Solidity编译器为合约中的每个已定义函数生成这两段代码。在Solidity编译器中,生成编码器和解码器的子系统称为“ABI编码器”。

2017年中旬,Solidity团队开始研究名为“ABI编码器V2”的全新实现,目标是提供更灵活,安全,高性能和可审计的代码生成器。这个实验性代码生成器在明确启用后,自2017年底开始向用户提供0.4.19版本。

缺陷

实验性ABI编码器不能正确处理短于32个字节的非整数值。这适用于bytesNN类型,bool,enum和其它类型的,当它们是数组或结构的一部分并直接从存储中编码时。这意味着这些存储引用必须直接在内部使用abi.encode(...),作为外部函数调用或事件数据中的参数,而无需事先分配给局部变量。使用return不会触发错误。类型bytesNN和bool将导致数据损坏,但enum可能导致无效revert。

此外,即使基础类型是整数类型,也可能无法正确处理元素短于32字节的数组。如果编码的元素数量不是适合单个存储槽的元素数量的倍数,那么按照上面描述的方式编码这样的数组会导致编码中的其他数据被覆盖。如果编码中的数组后面没有任何内容,或者如果只编码单个数组,则不会覆盖其他数据。

两个无关的bug

与上面解释的ABI编码器问题无关,在优化器中发现了两个错误。两者都引入了0.5.5。除非使用内联汇编,否则它们不太可能出现在编译器生成的代码中。

通过最近为OSS-Fuzz添加Solidity来识别这两个错误-这是一个用于查找各种项目中的差异或问题的安全工具包。对于Solidity,我们已经包含了多个不同的模糊测试器,用于测试编译器的不同方面。

优化器将操作码序列转换((x<<a)<<b))转换为(x<<(ab))时不会正确处理加法中的溢出。

如果将常量31用作第二个参数,则优化器会错误地处理byte操作码。在对bytesNN编译时常量值为31的类型执行索引访问或在内联汇编中使用字节操作码时,可能会发生这种情况。

这篇文章由@axic,@chriseth,@holiman联合撰写

标签:DITLIDCODCODEJustLiquiditySolidblockCODECODEX价格

ICP热门资讯
AIN:西安奔驰女车主哭诉维权背后, 区块链究竟能否还消费者以尊严?

作者|复杂美区块链责编|Aholiab出品|区块链大本营最近备受关注的“西安奔驰女车主哭诉维权”新闻久居热搜不下,每一步进展都聚焦着大众的目光.

1900/1/1 0:00:00
ATL:Atlas创始人回应IEO始末,区块链+旅游如何落地

|作者:区块律动BlockBeats0x30|欢迎添加作者微信qkldlinda与他进行交流!未经授权禁止转载!随着IEO的热度持续升高,参与IEO的项目也涵盖了各个热门赛道.

1900/1/1 0:00:00
TPS:Gate.io 已经支持点卡抵扣现货和杠杆手续费公告

Gate.io已经于2019年5月6日凌晨0-2点完成系统升级,目前已经支持点卡抵扣现货和杠杆手续费,用户无需特殊操作,只要账号中有点卡,系统就会在您现货和杠杆交易过程中优先使用点卡抵扣手续费.

1900/1/1 0:00:00
RON:Discord深度挖掘还原,wojak究竟如何转走2600万TRX 的?

随着新一天的调查,更多证据被各方挖掘出来,本次事件的真相正在逐渐浮出水面,戏剧化程度堪比一场年度大戏。文末还附上了wojak的财富密码.

1900/1/1 0:00:00
ALLIN:去做假设,而不要做预测

去做假设,而不要做预测来自币市小姐姐00:0013:332018年马上就要过去,这一年你们收获了什么.

1900/1/1 0:00:00
FIN:纽约总检察长:Bitfinex应披露Tether相关交易文件

据coindesk.com报道,纽约总检察长已向加密货币交易所服务商Bitfinex发起反击。其对当地一家法院称该公司应该交出文件,详细说明由稳定币发行人Tether提供的近9亿美元信贷额度的情.

1900/1/1 0:00:00