Solidity安全警告——变量可能在存储中被改写!

月亮🌛   |     |   1265 次阅读

原文:https://blog.ethereum.org/2016/11/01/security-alert-solidity-variables-can-overwritten-storage/
作者:Christian Reitwiessner
发布时间:2016.11.1
译者:托娅

概要:在某些情况中, 存储的变量可能被其他其他变量改写。

被影响的Solidity编译器版本:0.1.6 to 0.4.3 (包括 0.4.4 预发布版本)

描述:

小于256比特的存储变量如果可以就会被塞进同一个256比特大小的数据槽里面。如果第一个变量被赋予一个超出它所属变量类型允许范围的值,这个值会改写同一数据槽中的第二个变量。

这意味着如果一个攻击者能够使第一个变量的值溢出,那么改变第二个变量就成为了可能。目前可以通过加减法或者直接从呼叫数据中传递一个值来使第一个变量值溢出。

如果合约仅仅使用以下这几个类型,那么合约将不会收到影响。Arrays,mappings以及structs(基于以下几种类型的)也不会受到影响。

  • signed integers,包括大小小于256比特的
  • bytesNN,包括大小小于256比特的
  • 大小为256比特的unsigned integers

合约中小于256比特类型的变量永远不会被放置在一起的不会受到影响。

以太坊多签名钱包合约不会受到影响。

注意地址大小上限160比特,因此只使用地址和256比特类型的合约是安全的。另外,地址和booleans在实践中几乎从来不会通过加减法来改变,因此只包括地址,booleans,以及256比特类型的合约应该是安全的。

以下合约可能会有受到影响:

合约中包括两个或以上相邻的状态变量,并且它们加起来的大小小于156比特,第一个状态变量不是一个signed integer 也不是bytesNN类型的合约会受到影响。

Types smaller than 256 bits include:
小于256比特的类型包括:
bool, enums, uint8, …, uint248, int8, …, int248, address, any contract type

建议:

用Solidity0.4.4重新去编译一下尚未部署合约(不是预发布或者nightly版本)
对于已部署的合约,请停用,转移资金或者升级。

这个问题是由 github.com/catageek: https://github.com/ethereum/solidity/issues/1306 提出

 
0 人喜欢