Slide 1

Slide 1 text

Ethereum Smart Contract Best Practices ― 既知の攻撃 ― 2018/11/15 @avcdsld

Slide 2

Slide 2 text

再入性(Reentrancy) ● fallback 関数で何度も呼び出されることで、 コントラクトの残高がなくなる or GAS が尽きるまで送金され続ける ● 回避方法 ○ 状態変更したあとに外部関数を呼び出す ○ call.value()() の代わりに send() を使う(GAS 上限がある) 攻撃用コントラクトの fallback 関数

Slide 3

Slide 3 text

再入性対策の落とし穴 ● 「外部関数を呼ぶ関数」を呼ぶ箇所すべてに対策が必要! 攻撃用コントラクトの fallback 関数

Slide 4

Slide 4 text

Tx 順序の操作(フロント・ランニング) ● マイナーは、ブロック内の Tx の順番を操作できる ● 例えば、トークンを購入する Tx をみて、先に別の Tx を取り込むとか ● 回避策:バッチオークションの実装、事前コミット方式にする

Slide 5

Slide 5 text

タイムスタンプの操作 ● マイナーは、ブロックのタイムスタンプを操作できる ● 例えば、ギャンブルで勝敗を決める乱数にタイムスタンプを使っている場合 は要注意

Slide 6

Slide 6 text

オーバーフローとアンダーフロー ● Solidity は 256ビットの数値まで扱える ● 符号なし整数で 2²⁵⁶-1 を超えると 0 になり、0 を下回ると最大値になる ● 対策:OpenZeppelin の SafeMath ライブラリを使う

Slide 7

Slide 7 text

オーバーフローとアンダーフロー いくつかの ERC20 トークンで見つかった BatchOverFlow 脆弱性 _value に非常に大きな数を渡すと、 合計値 amount が桁溢れで小さくなり、 送信者の残高のチェックをすり抜けて、 ありもしない金額が送金されたことになる

Slide 8

Slide 8 text

意図的な Revert による攻撃 ● 例えば、オークションの最高入札者を、返金とともに更新する処理 → fallback 関数で revert するようにしておくと、更新できなくなる ● 回避策:pull 型で入札者からお金を取りに来てもらうようにする 攻撃用コントラクトの fallback 関数

Slide 9

Slide 9 text

GAS 上限を狙った攻撃 ● 例えば、クラウドファンディングのコントラクトで、 アドレスに一つずつ返金する処理がある場合 → 悪意ある人が、大量のアドレスで少額ずつ募金すると、繰り返し処理の途 中で GAS 切れが発生し途中で処理を失敗させられる ● 対策:どこまで処理を進めたか変数に記録する (未知のサイズの配列をループする必要が本当にある場合に限る)

Slide 10

Slide 10 text

コントラクトへの強制送金 ● selfdestruct(address) = コントラクトを削除する関数 ○ 引数で指定したアドレスに、コントラクトの残高が送金される ○ 仕様上、このとき指定アドレスの fallback 関数は呼び出されない(!) → fallback 関数でコントラクトへの送金を失敗させるコードを書いてい ても、強制的に送金されうる ● 意図しない挙動を防ぐため、コントラクトの残高がないことを require で確 認するようなコードは書いてはならない

Slide 11

Slide 11 text

可視性とデリゲートコール ● 可視性 ○ Parity ウォレットのハック事件:意図しない関数が public だった ○ 外部のやりとりが必要でない限り、関数は private または internal にす ること ● デリゲートコール(delegatecall,委譲呼び出し) ○ delegatecall() 実行元のコントラクトを A、呼び出し先のコントラクト を B としたとき、B が指す Storage 領域は A のものになる ○ 詳しくは・・・ ■ https://blog.zeppelin.solutions/on-the-parity-wallet-multisig-hack-405a8c12e8f7 ■ https://zoom-blc.com/how-to-develop-upgradable-contracts ■ http://sakataharumi.hatenablog.jp/entry/2018/10/09/224806

Slide 12

Slide 12 text

さいごに Solidity で Ethereum スマートコントラクトを書くなら Ethereum Smart Contract Best Practices https://consensys.github.io/smart-contract-best-practices/ は絶対に読まないとだめ!

Slide 13

Slide 13 text

参考 ● Known Attacks - Ethereum Smart Contract Best Practices https://consensys.github.io/smart-contract-best-practices/known_attacks/ ● 既知の攻撃方法 - Ethereum Smart Contract Best Practices(日本語訳) https://msykd.github.io/smart-contract-best-practices/known_attacks/ ● スマートコントラクトのセキュリティ Part 1 – Loom Network JP – Medium https://medium.com/loom-network-japanese/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3 %83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E 3%82%A3-part-1-817472e0fe4e ● スマートコントラクトのセキュリティ Part 2 – Loom Network JP – Medium https://medium.com/loom-network-japanese/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3 %83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E 3%82%A3-part-2-6ef700df00af ● 【Ethereum】ERC20トークンで発生した脆弱性「batchOverflow」について - Paoの技術力を磨くブログ http://pao2.hatenablog.com/entry/2018/04/27/005224