Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
スマートコントラクトに対する既知の攻撃とその対策 / bc.tokyo-21
Search
odanado
July 25, 2019
Programming
290
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スマートコントラクトに対する既知の攻撃とその対策 / bc.tokyo-21
odanado
July 25, 2019
More Decks by odanado
See All by odanado
Vitest Browser Mode への期待 / Vitest Browser Mode
odanado
3
5.6k
@nestjs/bull の活用について
odanado
0
1.6k
クラウド KMS の活用 / TOKYO BLOCKCHAIN TECH MEETUP 2022
odanado
0
1.3k
Vue.observable で状態管理 / vue-observable-state-management
odanado
4
2.1k
nuxtjs-axios-error-handling
odanado
0
410
ブロックチェーンアプリのトランザクションに対するデータ分析 / PyCon-JP-2019
odanado
0
460
最近のweb3.js事情 / bc.tokyo-19
odanado
2
570
YAPC::Tokyo 2019に スタッフ参加してみて / kichijojipm-18
odanado
1
2.4k
JavaScript + Dockerの知見 / knowledge-of-docker-in-javascript
odanado
9
55k
Other Decks in Programming
See All in Programming
Foundation Models frameworkで画像分析
ryodeveloper
1
130
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
150
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.7k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
150
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
210
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
500
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
41
2.6k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
Everyday Curiosity
cassininazir
0
260
Faster Mobile Websites
deanohume
310
32k
Amusing Abliteration
ianozsvald
1
240
Joys of Absence: A Defence of Solitary Play
codingconduct
1
420
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
Discover your Explorer Soul
emna__ayadi
2
1.2k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
Marketing to machines
jonoalderson
1
5.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Transcript
スマートコントラクトに対する 既知の攻撃とその対策 1 blockchain.tokyo#21 @odan3240
自己紹介 • Twitter: @odan3240 • エンジニア ◦ フロントエンド ◦ AWS
◦ ブロックチェーン • 会社: モバイルファクトリー ◦ チーム: ブロックチェーンチーム ◦ DApps を身近にする Uniqys Project をやっている 2
Uniqys Project • ミッション ◦ Uniqys Project ですべての人に DApps を身近にする
• Uniqys Kit ◦ Ethereum のサイドチェーンな DApps を 開発するための開発キット • Quragé ◦ モバイルウォレット • Quragé Link ◦ Metamask のないブラウザでも DApps のプレイを可能にするサービス 3
背景 4
スマートコントラクト • Ethereum の仮想マシンのコンテキストで決定論的に実 行される不変なコンピュータプログラム • コンテキスト ◦ ブロックチェーンに関する
限られた情報にしかアクセスできない • 決定論的 ◦ 実行時のコンテキストが同じなら 誰が実行しても結果は同じ • 不変 ◦ デプロイすると変更できない 5
コントラクトの難しさ • スマートコントラクトの実装は Web 開発とは異なる視点が必要 ◦ ハードウェアとか金融プログラミングに似ている ▪ 変更が困難 ▪
バグが発生したときのリスクが高い • 歴史が浅く様々な攻撃手法が発見されている ◦ The DAO 事件 ◦ Parity Multisig Wallet への攻撃 6
対策 • 哲学を知る • ベストプラクティスを知る • 実装パターンを知る • テストを書く •
監査ツールを使う • 監査組織に監査を依頼する • 既知の攻撃と対策を知る 7
対策 • 哲学を知る • ベストプラクティスを知る • 実装パターンを知る • テストを書く •
監査ツールを使う • 監査組織に監査を依頼する • 既知の攻撃と対策を知る ← この話をします 8
既知の攻撃 9
Reentrancy 10
Reentrancy • DAO 事件で有名 • 正常系 ◦ 残高を取得 ◦ 送金しながら外部のコントラクトを呼び出し
◦ 残高をクリア 11
Reentrancy • 異常系 ◦ 残高を取得 ◦ 送金しながら外部のコントラクトを呼び出し ◦ 外部のコントラクトで withdrawBalance
を呼び出し ◦ 送金しながら外部のコントラクトを呼び出し ◦ 外部のコントラクトで withdrawBalance を呼び出し ◦ 送金しながら外部のコントラクトを呼び出し ◦ 外部のコントラクトで withdrawBalance を呼び出し ◦ 送金しながら外部のコントラクトを呼び出し ◦ 外部のコントラクトで withdrawBalance を呼び出し ◦ (無限に送金してしまう) 12
Reentrancy • 対策 ◦ 極力外部のコントラクトを call しない ◦ call するなら内部状態を変更し終わった後にする
▪ withdrawBalance だと2行目と3行目を逆にする ◦ call.value()() の代わりに send() を使うなどして用途を限定する 13
Front-Running 14
Front-Running • トランザクションの取り込みの順番に起因する攻撃 • Bob は持っているトークンX売り出し それを Alice が購入するケースを考える 15
Front-Running 1. BobはトークンXに 10ETH の売値をつける 2. AliceはトークンXを購入する トランザクション T1を発行する 3.
Bobはそのトランザクション T1を見て トークンXの売値を 20ETH に変更する トランザクション T2を発行する 4. ブロックチェーンはT2, T1の順番でトランザクションを取り 込む (gas代を調整することで可能) 5. Aliceは 20ETH でトークンXを購入してしまう 16
Front-Running • 対策 ◦ gas代に上限を設定 ▪ Bob からの攻撃は防げる ▪ マイナーからの攻撃は防げない
◦ commit–reveal scheme ▪ 公開情報を乱数値と一緒にハッシュ化 ▪ 例 じゃんけん 1. ブロックチェーンでのじゃんけんは 手が丸見えなので後出しし放題 2. 乱数値とじゃんけんの手をハッシュ化 3. ハッシュ値を提出後、乱数値とじゃんけんの手を公開 4. 嘘をついていないかはハッシュ値によってわかる 17
Integer Overflow 18
Integer Overflow • int型やuint型の桁あふれのこと • uint 型に 2^256 + 1
を格納すると値は 0 • Overflow が発生しうる状況は20通り ◦ https://github.com/ethereum/solidity/issues/796#issuecomm ent-253578925 19
Integer Overflow • 対策 ◦ SafeMath を使う ▪ https://github.com/OpenZeppelin/openzeppelin-solidity/blob/ master/contracts/math/SafeMath.sol
▪ Overflow のチェックが入った算術演算子を 関数として提供しているライブラリ 20
DoS with (Unexpected) revert 21
DoS with (Unexpected) revert • 以下のようなコードで発生する ◦ 悪意のある入札者が現れると それ以降誰も入札できなくなる 22
DoS with (Unexpected) revert • 対策 ◦ 入札と払い戻しのロジックを分離する ◦ Pull
over Push パターン と呼ばれる ▪ 前のリーダーに返金する withdrawRefund 関数を用意 • bid 関数とは別に呼ぶ 23
DoS with Block Gas Limit 24
DoS with Block Gas Limit • トランザクションの実行に消費される gas が ブロックに設定されている
gas limit を超えると トランザクションは失敗する • 攻撃者によってトランザクションの実行に 必要な gas が増えてしまう問題 25
DoS with Block Gas Limit • 対策 ◦ 動的配列に対して for
文を回すことを避ける ◦ Pull over Push パターンで実装 ◦ gas を常に確認する (画像) 26
参考資料 27
参考資料 • Ethereum Smart Contract Best Practices ◦ https://consensys.github.io/smart-contract-best-practices/ •
Mastering Ethereum ◦ https://github.com/ethereumbook/ethereumbook • Solidity Patterns ◦ https://fravoll.github.io/solidity-patterns/ • スマートコントラクトのセキュリティ Part 1 – Loom Network JP – Medium ◦ https://link.medium.com/fvdoXrFBAY 28
参考資料 • Onward with Ethereum Smart Contract Security ◦ https://blog.openzeppelin.com/onward-with-ethereum-smart
-contract-security-97a827e47702/ • Solidity Security: Comprehensive list of known attack vectors and common anti-patterns ◦ https://blog.sigmaprime.io/solidity-security.html • Dapper Ethereum Smart Contract Wallet: Security Review ◦ https://blog.sigmaprime.io/dapper-wallet-review.html 29