スマートコントラクトの開発は言わずもがな、バグが命取りです。億単位のハッキング事例がたくさんありますよね。
本講座では、絶対に学ぶべき脆弱性をご紹介します。
今回取り上げるのはオーバーフローとアンダーフローについて。これはプログラム書く人なら大体みんな知っている話だと思いますが。
事例としてはhttps://medium.com/@ebanisadr/how-800k-evaporated-from-the-powh-coin-ponzi-scheme-overnight-1b025c33b530 が挙げられます。(ある種のジョークで?)金融詐欺をしようとしたみたいだけど、作者がオーバーフロー、アンダーフローをみたことがなくて866ETHやっちまったらしいです。怖いですね。
オーバーフロー&アンダーフロー
例えばuint8は0以上255以下の数値を扱える型です。uint8 x = 0の時、xから1を引くとどうなるのでしょうか。-1になるのではなく、255になります。これが、アンダーフローです。
オーバーフローは逆に255に1をたして0になってしまうものです。
コード例: https://solidity-by-example.org/hacks/overflow/
increaseLockTime関数を利用してLockTimeをオーバーフローさせてロックを無力化。結局いつでも引き出せてしまう、ということだと思います。
対策方法
- オーバーフロー&アンダーフローを意識して、if文等を入れることで事前に防ぐ(当たり前)
- safeMathを使う。これはSolidityの計算演算にオーバーフローのチェックを入れてくれる。
- Solidityの0.8以上のバージョンを使う。ありがたいことに0.8以降デフォルトでオーバーフロー、アンダーフローが発生したらリバートさせてくれるようになったらしい。