寄付窓口はこちら

Smart contract vulnerabilities & other auditing tools #hicon2018 A-2

f:id:niwatako:20181110113641j:plain

Solidityを使ってスマートコントラクトを開発されているエンジニア向けのセッションです。

f:id:niwatako:20181110113712j:plain

ブロックチェーンのセキュリティについて整理した本を出しています。

f:id:niwatako:20181110113732j:plain

NRIではスマートコントラクト診断を日本初リリースしています

f:id:niwatako:20181110113744j:plain

f:id:niwatako:20181110113759j:plain

本番後にモニタリングして脆弱性を発見したら通知するサービス

f:id:niwatako:20181110113822j:plain

ブロックチェーン=セキュアが真でも、スマートコントラクト=セキュアではない。

Webアプリ同様に脆弱性を埋め込みうる。

Webアプリ特有の脆弱性があるようにスマートコントラクトにも特有の脆弱性がある。

大きく分けて2つの脆弱性があると思います。

f:id:niwatako:20181110113908j:plain

DAOでも利用されたやつ

f:id:niwatako:20181110113926j:plain

左が攻撃されるスマコン、右が攻撃するスマコン。

クラウドファンディング的に、左にイーサを送金すると蓄積されていく。

失敗したらWhthdrawで引き出す想定。

f:id:niwatako:20181110114019j:plain

攻撃者は被害者のwithdrawBalanceを呼び出す。

攻撃者は被害者側にデポジットしているのでチェックは通る

f:id:niwatako:20181110114053j:plain

繰り返し呼ぶと、まだブロックチェーンのストレージは更新されていないのでまた引き出される。

f:id:niwatako:20181110114150j:plain

デポジットが尽きるまで送金される

スマコンスペシフィックといえる。どう見つけるか。ツールを使う方法がある。Mythrilでやってみましょう

f:id:niwatako:20181110114256j:plain

f:id:niwatako:20181110114304j:plain

Mythrilにコードをかけてみます

f:id:niwatako:20181110114321j:plain

検知されました。WellKnownなものはこのように検知することが出来ます。

話をもとに戻しますが、

f:id:niwatako:20181110114351j:plain

送金してから残高を更新しているから問題。

送金する前に0クリアする処理を入れると回避可能

f:id:niwatako:20181110114430j:plain

先程の脆弱性は消えました。

割愛するが、他にもスマコンスペシフィックな脆弱性はある。

f:id:niwatako:20181110114553j:plain

Ethereum Smart Contract Security Best Practicesを読んで腹に落としてリリースしましょう

f:id:niwatako:20181110114613j:plain

Parityのマルチシグウォレットの脆弱性

f:id:niwatako:20181110114644j:plain

f:id:niwatako:20181110114706j:plain

f:id:niwatako:20181110114715j:plain

誰でもアドレスを設定できた。アクセスコントロールビジネスロジック面の不備。

Mythrilなど、ツールでは検知できない。限界がある。ある程度はマニュアルが必要

f:id:niwatako:20181110114815j:plain

利用者にお責任がある。

Zeppelinのコード自体に問題があることもあった。

多重継承できて、Zeppelinなどのライブラリに任せるとなかなか追いにくくなる。

npmパッケージsca2t

www.npmjs.com

f:id:niwatako:20181110114929j:plain

f:id:niwatako:20181110115039j:plain

全依存関係をビジュアライズしてくれる

f:id:niwatako:20181110115120j:plain

コントラクトのファンクションやアクセス修飾子、modifireなどを一覧できる。

スマコン作る上でパリティの話もそうだが、公開しなくていい関数を公開してしまったり、only ownerを作ることがあると思うが、この一覧を見て、ビジネスロジックを理解した上でこれでいいのか、とみないといけない。

必ず中身をわかった開発者、セキュリティ診断担当者が見る必要がある。

f:id:niwatako:20181110115251j:plain

リリース前の確認は当然。脆弱性が見つかるものだと思って確認する。また、リリースしてからそのようなことがあった時に対策を取れるようにする

f:id:niwatako:20181110115344j:plain

Zeppelinにcontracts/livecycle/Pausable.solというのがあるのでこれを使うと良い。

f:id:niwatako:20181110115445j:plain

sca2tはサブコマンドがいろいろ搭載されているので便利な機能あるのでぜひ見てみてください。

脆弱性を見つけ出すのは良いが、専門家の診断を受けることを強く推奨します。

なにかご質問があれば

f:id:niwatako:20181110115616j:plain

Q: スマートコントラクトセキュリティも重要だと思うがスタートアップはAuditの費用が負担でもある。Mythrilで診断後に依頼するとコストが下がったりするのか。

A: 弊社の場合それは変わらないです。結局負荷は変わらないので、我々も診断前にMythrilは回しますし。