Solidityにセキュリティアラート イーサリアムファンデーション公式発表(by Christian Reiteiessner)
概要
場合によっては、変数がストレージの他の変数を上書きする事があり、Solidity(EVM上で使用するプログラミング言語)コンパイラバージョン:0.16から0.4.3(0.4.4のプリリリースバージョンを含む)
更に詳しい説明
256bitより小さいストレージの変数は、もし適合する場合に同じ256bitのスロットに一緒にパッケージされ、もし初期変数に割当られた型によって許可された数値が大きい場合、その数値は2つめの変数へと上書きされます。
これはもしアタッカーが最初の変数の値のオーバーフローを起こすことができ、更に2つ目の変数を変更できるなら、初期変数を利用したオーバーフローは算術を使用することが可能、または直接呼び出しデータ()から数値を通すことができるということです。(呼び出しデータの数値は32バイトに合わせ、パディングは確認も強制もされません)
影響されないコントラクト
下記にある状態変数しか使用していないコントラクトは影響を受けません
配列、マッピングと構造体(下記のものをベースとするもの)も影響を受けません
・符号あり整数、サイズを含み256bitより小さいもの
・bitNNの型、サイズを含み256bitより小さいもの
・256bitの符号なし整数(ユニット)
隣接することのない256bitより小さい型とのコントラクト(*状態変数のベースコントラクトは”引きつけられる”)はお互いに影響することはなく、
イーサリアムのマルチシグウォレットコントラクトは影響ありません
*アドレスは160bitを取ることに注意、アドレスを使用するコントラクトと256bitの型は安全です
更にアドレスとブーリアン型は算術演算を通して操作されることは実際にはほとんどないと言っていいでしょう、そしてアドレスだけを使用するコントラクト、ブーリアン型と256bit型も安全であるでしょう。
影響を受けるであろうコントラクト
合計サイズが256bit以下のものと最初の状態変数が符号なし整数とbitNN型ではない2つまたはそれ以上のコンフィギュレーション状態変数により作られたコントラクト
256bitより小さい型のものを含む:
bool型、列挙型、unit8からunit248、int8からint248、アドレス、任意のコントラクト型
オススメする対処方
・少なくとも0.4.4(プリリリースまたはナイトリーバージョンではないもの)のSolidityを仕様したまたデプロイしていないかコントラクトを再度コンパイルする
・ディアクティベート(動作の停止)、資金の取り除きまたはすでにデプロイされたコントラクトをアップグレード
以上が公式での発表となります。
追加説明
Solifityの型システムは主におおよそEVM(イーサリアムバーチャルマシーン)の256bitワードサイズとなる。このため4つのメジャーな型があり、それぞれが特に256bitの幅(単精度で8オクテット)
・uint:256bit符号なしの整数、ビット単位と符号なしの算術演算で動作をする
・int:256bit符号ありの整数、ビット単位と符号ありの算術演算で動作をする
・real:256bit符号ありの固定小数点数、127bit 小数点のLeft関数、128bitのRight関数
・bytes32:32バイトのシーケンス(合計で256bit)
それに加え、特定のアカウントを識別する固有の address 型と真か偽を格納するbool型
・address:アカウント識別名、160bit
・bool:2つの状態値
結論と考察
ぶっちゃけイーサリアム(ETH)保持ユーザーには一ミリも関係ないし意味もわかりませんでしょう。。。
ただ前回のミストのセキュリティエラーといいスパムアタックといいどんどんイーサリアムの根本に問題が出てきますね。BKJ500所持者に限定公開してるコミュニティの反応ではよくあること!だそうです(by H氏とS氏)
スマートコントラクトを組んでる方は特に注意です。ビットコインの上昇(80k前)とZcashによりイーサは右肩下がりで注目を浴びてない状態。。。この多くのバグやエラーを改善し更に強固な物になると信じるしかありませんね
まだ見てない方は↓からどうぞ
このブログは下記サイトへと移転しています。