スマートコントラクト脆弱性とは?コードの欠陥が招く流出

犯行スキーム
スマートコントラクト脆弱性とは?ざっくりと3行で
  • スマートコントラクト脆弱性とは、ブロックチェーン上で自動実行されるプログラム(スマートコントラクト)のコードに潜むバグや設計ミスのことで、攻撃者に悪用されると巨額の資産が流出する。
  • 一度デプロイされたコードは原則変更できない不変性ゆえ、リエントランシー攻撃や整数オーバーフローなどの脆弱性が一つあるだけでプロトコル全体が麻痺し預けられた資産が根こそぎ奪われてしまう
  • 仕組みを知っておけば、第三者監査の有無を確認し未監査プロジェクトに資産を預けない判断ができて、コードの欠陥による損失リスクを下げられる。

【深掘り】これだけは知っておけ

スマートコントラクト脆弱性のこわさは、コードが不変であるため、バグが見つかっても後から修正できない点です。欠陥のあるコードに資産を預けていると、攻撃された瞬間に取り返しがつきません。

スマートコントラクトは、ブロックチェーン上で自動実行される契約プログラムです。仲介者なしで信頼を担保できる革新的な技術ですが、その複雑さゆえに脆弱性を抱えることがあります。2016年以降、スマートコントラクトの脆弱性による確認された損失額は140億ドルを上回っています。代表的な事件が2016年のThe DAO事件で、投資家が資金を切り離して新DAOを作る「スプリット」機能に、資金移動が完了する前に何度も処理を繰り返せるバグ(リエントランシー=再入可能性)があり、約360万ETH、当時の価格で約52億円相当が盗まれました。この事件はEthereumのハードフォーク(分岐)にまで発展しました。

主な脆弱性のパターンには、リエントランシー攻撃(処理完了前に関数を再呼び出しして資金を多重引き出しする)、整数オーバーフロー(数値計算の上限を超えて異常な値になる)、アクセス制御の不備(権限のない者が重要な関数を実行できる)などがあります。多くのスマートコントラクトはSolidityという特殊な言語で書かれており、微細なミスが検出困難な点が課題です。不十分なコード監査、性急なデプロイ、検証不足がリスクを高めます。一度デプロイされたコードは不変であるため、脆弱性が見つかっても、所有者はコントラクトを廃止して資金を新コントラクトに移すしか対処法がなく、その作業は極めて煩雑です。

個人ができる最も実効的な対策は、第三者監査(CertiK、SlowMist、PeckShieldなど)を受けているプロジェクトを選ぶことです。ただし監査済みでも100%安全ではありません。形式的検証や複数監査を受けた実績の長いプロトコルほど信頼性が高いと考えてください。

実践的な対策として、DeFiプロトコルに資産を預ける前に、監査レポートが公開されているかを確認すること。監査会社が実在し信頼できるかを調べること。新規・未監査のプロジェクトには大金を預けないこと。一つのプロトコルに資産を集中させず分散すること。バグバウンティ(脆弱性報奨金)プログラムを実施しているかも信頼性の指標になります。技術が成熟し、形式的検証や監査基準の向上で壊滅的な攻撃は減少傾向にありますが、脆弱性は依然として解決すべき課題です。「監査済み」「実績が長い」「コードが公開されている」という条件を確認することが、コードの欠陥による損失を避ける現実的な方法です。

主なスマートコントラクト脆弱性

脆弱性仕組み代表事例
リエントランシー処理完了前に関数を再呼び出しして多重引き出しThe DAO事件(約52億円)
整数オーバーフロー数値計算が上限を超えて異常値になる各種トークン発行バグ
アクセス制御の不備権限のない者が重要な関数を実行各種DeFiプロトコル攻撃

典型的なフレーズ・文脈

リエントランシー脆弱性を悪用するハッカーのイラストアイコン
詐欺師

(攻撃コード実行中)このDeFiプロトコルの引き出し関数にリエントランシー脆弱性を発見。残高更新の前に再度引き出し関数を呼び出すループを仕込めば、預けた額の何倍も引き出せる。プール資金が空になるまで実行する。

リエントランシー脆弱性を悪用し、残高が更新される前に引き出し関数を繰り返し呼び出して資金を多重に引き出す、典型的な攻撃の流れです。

スマートコントラクト脆弱性による被害を報じるニュースキャスターのイラストアイコン
キャスター

2016年のThe DAO事件では、スマートコントラクトのリエントランシー脆弱性が悪用され約52億円相当が流出しました。専門家は、コードが不変なため一度の欠陥が致命的になるとして、第三者監査の確認を呼びかけています。

The DAO事件とスマートコントラクト脆弱性の危険性を解説する報道番組のキャスターを想定した表現です。

第三者監査の確認を助言するブロックチェーンエンジニアのイラストアイコン
専門家

DeFiに資産を預ける前は、CertiKやSlowMistなどの第三者監査レポートを確認してください。未監査プロジェクトには大金を預けないこと。一つに集中させず分散も重要です。被害は#9110へ。

ブロックチェーンエンジニアが、スマートコントラクト脆弱性への防御策として監査確認の重要性を助言する場面を想定しています。

困ったときの相談窓口

スマートコントラクト脆弱性に起因する被害が疑われる場合は、以下の窓口に相談できます。

窓口名電話番号受付時間対応内容
警察相談専用電話#9110平日 8:30〜17:15(各都道府県で異なる)不正アクセス・サイバー犯罪の相談
金融サービス利用者相談室0570-016811平日 10:00〜17:00暗号資産取引に関する相談
IPA安心相談窓口03-5978-7509平日 10:00〜12:00、13:30〜17:00サイバー犯罪の相談

【まとめ】3つのポイント

  • 正体は自動実行コードに潜む欠陥:リエントランシーや整数オーバーフローなどのバグが巨額流出を招きます。
  • 不変性ゆえに修正できない:一度デプロイされたコードは変更できず、脆弱性が致命的になります。
  • 第三者監査の確認が防御の基本:未監査プロジェクトを避け、実績の長いプロトコルに分散して預けましょう。

よくある質問

Q
監査済みのスマートコントラクトなら安全ですか?
A

監査は最低限の安全確認ですが、100%の保証ではありません。監査は特定の時点でのコードを検査するもので、すべての脆弱性を発見できるわけではありません。監査後にコードが変更されたり、監査会社が見落としたりするケースもあります。複数の監査を受けている、実績が長い、バグバウンティを実施している、コードが公開されているといった複数の条件を満たすプロトコルほど信頼性が高いと考えてください。未監査のプロジェクトは論外です。

Q
リエントランシー攻撃とは具体的にどういうものですか?
A

引き出し処理で、残高を減算する前に送金を実行してしまう設計ミスを突く攻撃です。攻撃者は送金を受け取った瞬間に、残高がまだ減っていない状態で再度引き出し関数を呼び出します。これを繰り返すことで、実際に預けた額の何倍もの資金を引き出せてしまいます。The DAO事件がこの典型例です。対策として「Checks-Effects-Interactions」パターン(先に残高を更新してから送金する)が標準化されていますが、複雑なコントラクトでは依然リスクがあります。

Q
脆弱性が見つかったら開発者が修正してくれますか?
A

簡単には修正できません。スマートコントラクトはデプロイ後に不変であることが原則のため、コードそのものを書き換えることはできません。脆弱性に対処するには、開発者が脆弱なコントラクトを廃止し、資金を新しいコントラクトに移して再デプロイする必要があります。この作業は煩雑で、攻撃が先に起これば手遅れです。一部のプロトコルは「アップグレード可能な設計」を採用していますが、それ自体が別の攻撃リスクを生むこともあります。

Q
スマートコントラクト脆弱性とブリッジハックの違いは何ですか?
A

包含関係に近いです。スマートコントラクト脆弱性は、あらゆるスマートコントラクトのコードに潜む欠陥全般を指す広い概念です。ブリッジハックは、異なるブロックチェーンをつなぐクロスチェーンブリッジが攻撃される事象を指し、その原因の一部がスマートコントラクト脆弱性です。ただしブリッジハックには、バリデータの秘密鍵漏洩など、コード以外の原因も含まれます。スマートコントラクト脆弱性が原因の一つとして、ブリッジハックなど様々な被害を引き起こすと理解してください。

コメント

※本記事の内容については、できる限り正確な情報を掲載するよう努めておりますが、完全に正確であるという保証はありません。一部の内容に誤りや適切でない表現がある可能性があります。ご了承の上、参考程度にとどめていただければ幸いです。なお、記事の改善点などがございましたら、ぜひコメントにてご指摘ください。
犯行スキーム詐欺辞典
\この記事をシェアする/
\賠償罪子のSNSに遊びにいく/
タイトルとURLをコピーしました