Solidityを使ってスマートコントラクトを開発されているエンジニア向けのセッションです。
ブロックチェーンのセキュリティについて整理した本を出しています。
NRIではスマートコントラクト診断を日本初リリースしています
本番後にモニタリングして脆弱性を発見したら通知するサービス
ブロックチェーン=セキュアが真でも、スマートコントラクト=セキュアではない。
Webアプリ同様に脆弱性を埋め込みうる。
Webアプリ特有の脆弱性があるようにスマートコントラクトにも特有の脆弱性がある。
大きく分けて2つの脆弱性があると思います。
DAOでも利用されたやつ
左が攻撃されるスマコン、右が攻撃するスマコン。
クラウドファンディング的に、左にイーサを送金すると蓄積されていく。
失敗したらWhthdrawで引き出す想定。
攻撃者は被害者のwithdrawBalanceを呼び出す。
攻撃者は被害者側にデポジットしているのでチェックは通る
繰り返し呼ぶと、まだブロックチェーンのストレージは更新されていないのでまた引き出される。
全デポジットが尽きるまで送金される
スマコンスペシフィックといえる。どう見つけるか。ツールを使う方法がある。Mythrilでやってみましょう
Mythrilにコードをかけてみます
検知されました。WellKnownなものはこのように検知することが出来ます。
話をもとに戻しますが、
送金してから残高を更新しているから問題。
送金する前に0クリアする処理を入れると回避可能
先程の脆弱性は消えました。
割愛するが、他にもスマコンスペシフィックな脆弱性はある。
Ethereum Smart Contract Security Best Practicesを読んで腹に落としてリリースしましょう
Parityのマルチシグウォレットの脆弱性
誰でもアドレスを設定できた。アクセスコントロール=ビジネスロジック面の不備。
Mythrilなど、ツールでは検知できない。限界がある。ある程度はマニュアルが必要
利用者にお責任がある。
Zeppelinのコード自体に問題があることもあった。
多重継承できて、Zeppelinなどのライブラリに任せるとなかなか追いにくくなる。
npmパッケージsca2t
全依存関係をビジュアライズしてくれる
各コントラクトのファンクションやアクセス修飾子、modifireなどを一覧できる。
スマコン作る上でパリティの話もそうだが、公開しなくていい関数を公開してしまったり、only ownerを作ることがあると思うが、この一覧を見て、ビジネスロジックを理解した上でこれでいいのか、とみないといけない。
必ず中身をわかった開発者、セキュリティ診断担当者が見る必要がある。
リリース前の確認は当然。脆弱性が見つかるものだと思って確認する。また、リリースしてからそのようなことがあった時に対策を取れるようにする
Zeppelinにcontracts/livecycle/Pausable.solというのがあるのでこれを使うと良い。
sca2tはサブコマンドがいろいろ搭載されているので便利な機能あるのでぜひ見てみてください。
脆弱性を見つけ出すのは良いが、専門家の診断を受けることを強く推奨します。
なにかご質問があれば
Q: スマートコントラクトセキュリティも重要だと思うがスタートアップはAuditの費用が負担でもある。Mythrilで診断後に依頼するとコストが下がったりするのか。
A: 弊社の場合それは変わらないです。結局負荷は変わらないので、我々も診断前にMythrilは回しますし。