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
PRO
July 25, 2019
Programming
290
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スマートコントラクトに対する既知の攻撃とその対策 / bc.tokyo-21
odanado
PRO
July 25, 2019
More Decks by odanado
See All by odanado
Vitest Browser Mode への期待 / Vitest Browser Mode
odanado
PRO
3
5.5k
@nestjs/bull の活用について
odanado
PRO
0
1.6k
クラウド KMS の活用 / TOKYO BLOCKCHAIN TECH MEETUP 2022
odanado
PRO
0
1.3k
Vue.observable で状態管理 / vue-observable-state-management
odanado
PRO
4
2.1k
nuxtjs-axios-error-handling
odanado
PRO
0
410
ブロックチェーンアプリのトランザクションに対するデータ分析 / PyCon-JP-2019
odanado
PRO
0
460
最近のweb3.js事情 / bc.tokyo-19
odanado
PRO
2
560
YAPC::Tokyo 2019に スタッフ参加してみて / kichijojipm-18
odanado
PRO
1
2.4k
JavaScript + Dockerの知見 / knowledge-of-docker-in-javascript
odanado
PRO
9
55k
Other Decks in Programming
See All in Programming
Inside Stream API
skrb
1
730
スマートグラスで並列バイブコーディング
hyshu
0
150
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
540
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
280
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
240
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
200
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
200
Claspは野良GASの夢をみるか
takter00
0
200
ふつうのFeature Flag実践入門
irof
7
4k
Contextとはなにか
chiroruxx
1
330
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Side Projects
sachag
455
43k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
Designing Powerful Visuals for Engaging Learning
tmiket
1
420
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
440
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Making Projects Easy
brettharned
120
6.7k
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