スマートコントラクトは特殊なソフトウェアです。資金を直接保有し、誰でも調べられる公開の場で動き、一度デプロイされると変更が難しいか、不可能です。見落とされた1行が、攻撃者に1回のトランザクションでプロトコルの資金を抜き取らせることもあります。監査は、ローンチ前の主要な防御策です。攻撃者より先に、専門家がコードを読むのです。
監査人が見る点
- ロジックのエラー:書かれたとおりには動くものの、意図どおりには動かないコード。たとえば、報酬を二重に支払ってしまう計算式など。
- アクセス制御:本来は管理者に限定すべきなのに、誰でも呼び出せてしまう関数。
- リエントランシー:外部呼び出しによって、最初の呼び出しが終わる前に攻撃者が関数に再び入り込めてしまう問題。2016年の The DAO ハッキングの原因となったバグです。
- 価格操作:1回のトランザクション内で動かせる価格を信頼してしまうロジック。多くの場合、脆弱なオラクルを介して起こります。
- 経済設計:すべての行が書かれたとおりに動いていても、資金力のある参加者が悪用できてしまうインセンティブ。
監査人は、手作業のレビューと自動化ツールを組み合わせ、さらに近年では形式検証も取り入れています。形式検証とは、コードが書面の仕様を満たしていることを数学的に証明する手法です。
2つの監査モデル
従来型の監査会社による監査では、少人数のセキュリティエンジニアのチームが決められた期間にわたってコードベースを調べ、報告書を提出します。コンペティション型の監査では、多数の独立したリサーチャーが同時に同じコードをレビューし、見つけた問題に応じて報酬を受け取ります。2つのモデルは異なる種類の問題を見つけやすいため、プロトコルは両方を使うことがよくあります。
監査報告書の読み方
まず対象範囲を見ましょう。どのコントラクトか、どのバージョンのコードか、どの期間か。バージョン1の監査は、バージョン2についてはほとんど何も語りません。次に、指摘事項を深刻度ごとに読みます。Critical と High の指摘は資金の損失につながる可能性があり、Medium は通常、特定の条件が必要で、Low と Informational はコードの衛生面に関するものです。それぞれの指摘について、修正済み、認識済み、異議ありのいずれとされているか、そして修正内容が改めてレビューされたかを確認してください。
シンプルな例
ある報告書に、High の指摘が1件挙がっています。端数処理のエラーによって、ユーザーが入れた額よりもわずかに多く出金でき、それを何千回ものトランザクションで繰り返せばボールトの資金を抜き取れる、というものです。チームはローンチ前に修正し、監査人が修正を確認します。外部の誰も、そのバグについて耳にすることはありません。これが監査が役目を果たしたということであり、表紙のロゴよりも指摘事項のセクションのほうが重要な理由です。
リスクと限界
監査はスナップショットです。レビュー後にコードは変わり、新しいコントラクトがそれとやり取りし、攻撃手法は進化します。DeFi で大きな被害を出したエクスプロイトの中には、監査済みのプロトコルを襲ったものもあり、多くは対象範囲外のコードや、複数のプロトコルの相互作用を突いたものでした。また、監査では、鍵の管理方法や準備金の中身といった、システムのオフチェーン部分を評価できません。だからこそ、監査はいくつかある層のひとつとして使うときに真価を発揮します。ローンチ後もリサーチャーに報酬を出し続けるバグバウンティ、稼働中のトランザクションを見守るランタイム監視、そして資産そのものについての準備金証明です。
Tori Finance での使われ方
Tori Finance のスマートコントラクトは、Sherlock と Nethermind による監査を受けています。監査はセキュリティの層のひとつであり、Hypernative によるランタイム監視、Accountable による準備金証明と組み合わされています。
よくある質問
監査済みのプロトコルでもハッキングされることはありますか?
はい。監査が対象とするのは、特定の時点の特定のコードです。その後の変更、対象範囲外のコード、ほかのプロトコルとの相互作用、新しい攻撃手法は、いずれも損失につながる可能性があります。
監査の Critical、High、Medium、Low とは何を意味しますか?
指摘事項を影響の大きさと起こりやすさで格付けしたものです。Critical と High の問題は資金の損失やプロトコルの機能不全につながる可能性があり、Medium の問題は特定の条件を必要とし、Low と Informational の指摘は軽微なものか、コードの品質に関するものです。
スマートコントラクト監査にはどのくらいの期間がかかりますか?
コードの規模と複雑さによります。小さなコントラクトなら数日、大規模なプロトコルなら数週間かかることもあり、通常はそのあとに修正内容の短いレビューが続きます。
関連用語
バグバウンティ
バグバウンティプログラムとは、セキュリティリサーチャーが脆弱性を悪用する代わりに責任ある形で報告した場合に、問題の深刻度に応じた報酬を支払う制度です。監査が終わったあとも長く、プロトコルのコードがレビューされ続ける状態を保ちます。
ランタイム監視
ランタイム監視とは、プロトコルの稼働中のオンチェーン活動を継続的に見守り、不審なトランザクションが起きたその場で検知し、場合によっては阻止することです。ある時点のコードをレビューする監査を補い、コードが実際に何をしているかを見守ります。
準備金証明
準備金証明とは、トークンやプラットフォームの裏側にある資産が実際に存在することを独立した立場で確認するもので、理想的には誰でも検証できるよう継続的に公開されます。示すのはバランスシートの資産側であり、それだけで負債を証明したり、あらゆるリスクをカバーしたりするものではありません。
出典
- ethereum.org: Smart contract securityethereum.org
- ethereum.org: Formal verification of smart contractsethereum.org
- BIS Quarterly Review: DeFi risks and the decentralisation illusionwww.bis.org
Tori Finance チームが執筆しました。投資助言ではありません。利回りは変動し、元本を失うおそれがあります。