ブロックチェーン技術の進化とともに、分散型アプリケーション(DApps)が注目を集めています。
特にイーサリアム(ETH)などのプラットフォームでは、「スマートコントラクト」と呼ばれる自己実行型のプログラムが中核的な役割を果たしています。
しかし、その革新性と引き換えにスマートコントラクトはしばしば重大なセキュリティリスクの温床ともなっています。
この記事では、スマートコントラクトの代表的な脆弱性とその実際の被害事例、さらにDAppsを安全に利用するための具体的なセキュリティ対策について、開発者とユーザーの両方の視点から解説していきます。
スマートコントラクトとは?
スマートコントラクトとは、ブロックチェーン上で事前に決められた条件を満たす事象が発生した場合に、自動的に手続きが完了する仕組みです。
例えば、海外では不動産売買にスマートコントラクトを利用した事例があり、契約締結・支払い・登記の取得などをスマートコントラクトによって効率化が図れます。
スマートコントラクトには中央管理者が存在せず、コードがそのまま「契約」として機能するので、信頼を必要としない取引が可能となる一方で、コードの脆弱性が致命的な結果を招く可能性もあります。
DAppsの攻撃被害事例性と対策
スマートコントラクトには、さまざまなセキュリティリスクが内在し、DAppsが攻撃されて多額の被害が発生した事例がいくつかあります。
- リエントランシー攻撃:The DAO(2016年)
- アクセス制御の不備:Parity Wallet(2017年)
- フロントランニング:bZxプロトコル攻撃(2020年)
リエントランシー攻撃:The DAO(2016年)
リエントランシー攻撃とは、外部コントラクトの呼び出し中にコントラクトが再び呼び出されることで、意図しない複数回の処理が実行される脆弱性です。
2016年に、世界で初めてスマートコントラクトが攻撃された「The DAO」事件では、約6000万ドル相当のイーサリアム(ETH)が不正に引き出されました。
事例
- 攻撃者がThe DAOから資金を引き出すために「split(分割)」関数を呼ぶ
- 送金先として指定したコントラクト内で、fallback関数を利用し、再帰的にDAOの「split(分割)」関数を再実行。
- DAOコントラクトは送金を先に実行し、残高の更新を後にしていたため、何度も送金処理が通ってしまった。
リエントランシー攻撃への対策
- 状態の更新は送金よりも前に行う
- ReentrancyGuardの導入
- Pull型送金への切り替え
スマートコントラクトの状態の更新は送金よりも前に行わないと、悪意ある相手から連続的に資産を騙し取られる可能性があります。
また、多重呼び出しを防ぐための「ミューテックス(排他制御)」を導入したり、Pull型送金への切り替えも有効でしょう。
アクセス制御の不備:Parity Wallet(2017年)
管理者権限や特権操作に制限がない、もしくは制限が甘い場合、誰でも重要な関数を実行できてしまうリスクがあります。
アクセス制御の不備によって、2017年、Parity Walletで資金凍結状態になった事例がありました。
事例
- Parity社が提供していたマルチシグウォレットのライブラリに、アクセス制御の初期化ミスが存在
- 攻撃者がselfdestruct関数を呼び出しでコントラクトを削除
- そのライブラリを使っていた全ウォレットが機能停止し資金(約150万ETH)が凍結
アクセス制御の不備に対する対策
- 明確な権限設定
- 安全なコードとツールの活用
本事例から、ライブラリや初期化関数にも厳格なアクセス権限が必要なことが分かりました。
フロントランニング:bZxプロトコル攻撃(2020年)
フロントランニング攻撃とは、取引が未確定な状態にある間は誰でも確認できるため、トランザクションがブロックに記録される前に、攻撃者が手数料を上乗せして先に処理を完了させる攻撃です。
特にDEX(分散型取引所)などで問題視されており、有名な事例として2020年に起きたbZxプロトコル攻撃が挙げられるでしょう。
事例
- フロントエンドを通じて、攻撃者が悪意あるコントラクトを接続
- 承認された権限を利用して、ユーザー資産をbZxプロトコルから抜き取った
フロントランニングに対する対策
- commit-revealスキームの導入
- 機密情報を公開前に暗号化
フロントランニング対策として、「ハッシュ化された値(commit)」を送信し、その後に「元の値(reveal)」を送る2段階プロセスを踏む必要があるでしょう。
また、機密情報を公開前に暗号化するなどの対策も有効です。
DApps利用者が取るべきセキュリティ対策
スマートコントラクトの詐欺に対しては、開発者だけでなくDAppsを使うユーザー側も注意が必要です。
- ウォレットの安全な管理
- DAppsとの接続・承認に関する注意
- DAppsそのものに対するリスクヘッジ
ウォレットの安全な管理
- 秘密鍵・シークレットフレーズの管理
- ハードウェアウォレットの使用
- 複数のウォレットを使い分ける
まず、秘密鍵やシークレットフレーズが他人に漏れないように厳重管理しなければいけません。
管理手段として、ハードウェアウォレットを使うなどの方法があるでしょう。
また、資産が大きくなればなるほど一つのウォレットで管理するのは危険なので、複数のウォレットを使い分けるなどの分散管理が大切です。
DAppsとの接続・承認に関する注意
- アクセス前にプロジェクトの正当性を確認
- トランザクション内容を確認
- unlimited approveを避ける
現状、偽サイトやフィッシングDAppsが頻発しているので、アクセス前にSNSやDiscordでプロジェクトの正当性を自分の目で確認してください。
また、「承認(approve)」系の署名には注意が必要なので、トランザクションの内容も確認が必要です。
さらに、DAppsを使用するにあたって、多くのDAppsがトークンを無制限に使える(unlimited approve)ように要求してきますが、資産流出の原因になりかねないので避けた方が無難です。
DAppsそのものに対するリスクヘッジ
- 監査済みDAppsの利用を優先する
- 新興DApps・不明プロジェクトはテスト用ウォレットで試す
- DeFi/NFTプロジェクトのコードやホワイトペーパーに目を通す
DAppsを利用する場合は、「OpenZeppelin」や「Trail of Bits」などの監査済みで信頼のおけるDAppsの利用を優先しましょう。
ただし、新興DApps・不明プロジェクトに参加したい場合は、テスト用ウォレットで利用するなどリスクヘッジを忘れないでください。
また、DeFi/NFTプロジェクトのコードやホワイトペーパーに目を通すとともに、難しければDiscordなどでの情報収集もおすすめです。
スマートコントラクトは革新的な技術だがセキュリティ対策も必要
スマートコントラクトは、ブロックチェーンの中でも特に強力な機能を持ち、DAppsの中核を担う存在です。
しかし、その自動性と分散性が、時に大規模なセキュリティ事故に繋がる可能性があります。
開発者は安全なコーディングと厳格なセキュリティ対策を徹底し、ユーザーはDAppsの信頼性を自ら判断し、ウォレットや承認の管理に注意を払う必要があります。
スマートコントラクトとDAppsを安全に活用するためには、技術的な理解とリテラシーの両立が不可欠です。
本記事が、安全で信頼できるブロックチェーンの利用に繋がる一助となれば幸いです。