リエントランシー攻撃(再入攻撃)とは何か?なぜ危険なのでしょうか?
リエントランシーは最もクラシックで危険なスマートコントラクトの脆弱性の一つです。引き出し関数:ユーザーが引き出し呼び出し→コントラクトが資金を転送→その後残高を更新します。攻撃者は転送後・残高更新前のウィンドウで再び引き出しを呼び出し、帳簿には残高があるように見えながらコントラクトを繰り返し枯渇させます。2016年のDAOハックはリエントランシーで約360万ETHを盗み、ETHとETCへのハードフォークを引き起こしました。
DeFiプロトコルのスマートコントラクトが安全かどうかをどう評価するか?
公開で確認できる指標があります。第1に監査の数と質:OpenZeppelin、Trail of Bits、Certik、Sherlockなどからの独立監査があるか、いくつあり最新はいつか。第2にTVLと実績:数億ドル以上の持続的な高いTVLと攻撃なしが最良の時間プレッシャーテストです。第3に管理者の制御:Timelock(アップグレードに24〜72時間の待機が必要)とマルチシグ(少なくとも3/5または4/7)があるか。第4にバグバウンティ:Immunefiでの高額バウンティはセキュリティへの真剣さを示します。
監査報告が「重大な脆弱性なし」と言っていても、なぜハッキングが起きるのか?
いくつかの理由から「監査済み」は「必ず安全」を意味しません。第1に、監査は特定の時点での特定バージョンの静的なスナップショットです;アップグレード後に再監査されなければ以前の監査は無効です。第2に、監査者も人間であり、複雑なビジネスロジックの脆弱性はトップクラスの機関でも見落とされることがあります。第3に、複合性(Composability)が新たな攻撃面を生みます:個別に監査されたコントラクトは問題ないかもしれませんが、組み合わせると脆弱性が生じえます――フラッシュローン攻撃は複数のプロトコルにまたがる予期しない動作を悪用します。監査は必要条件であり十分条件ではありません。最も堅固な保護は「長期にわたる攻撃なしの実績」と「ホワイトハットが盗むより報告する方が得になる高額バグバウンティ」の組み合わせです。
上級:「形式的検証(Formal Verification)」は監査より厳格なセキュリティ手段ですか?
はい、ただし限界があります。形式的検証は数学的手法でコードのロジックがすべての可能な入力条件下で仕様通りに動作することを厳密に証明します。「いくつかのケースをテストして問題を見つけなかった」ではなく「どんな状況でも問題が起きないことを数学的に証明した」というものです。コスト面:非常に高価で最上位のDeFiプロトコルのみが負担できます。また仕様が間違っていれば検証も役に立ちません。DAI/USDSのコアコントラクトとAaveの一部のコンポーネントが形式的検証を使用していますが、人間による監査とバグバウンティの補完ツールにすぎません。
2023年3月のEuler Financeのハッキング:リザーブへのdonation機能のロジックバグとフラッシュローンを組み合わせて約1.97億ドルが流出しました。Eulerには評判の良い監査がありました。特定のエッジケースは完全にカバーされていませんでした。長い交渉の後、攻撃者は約95%の資金を返還しましたが、ユーザーは数週間資産にアクセスできませんでした。
スマートコントラクトリスクのコアトレードオフ:人間の仲介者を一切信頼する必要がない(コードが法律)↔ コードが失敗した時、誰も損失を止められず通常は不可逆
スマートコントラクトの核心的な価値提案は「脱仲介化」です——銀行、弁護士、いかなる機関も信頼する必要がなく、コードのロジックがルールです。しかしこの両刃の剣のもう一方の刃:コードにバグがある時、誰も一時停止ボタンを押せず、カスタマーサービスは取引を凍結できず、裁判所命令で即座に止めることもできません。2023年のEuler Financeの事件では、6行のコードの脆弱性が悪用されてから数分以内に1億9700万ドルが消えました。コントラクトが複雑なほど潜在的な脆弱性が多く、統合が広いほど1つの脆弱性の増幅倍数が大きくなります。より分散型でより自動実行するプロトコルほど事後修正が難しく、より保守的でより適切なガバナンスを持つプロトコルほどセキュリティインシデントへの対応が速くなります。
Missing Link:多くの人はスマートコントラクトリスク=「ハッキング」と思いますが、最もコストの高い多くのエクスプロイトは、コントラクトコードが論理的に完全に正しいにもかかわらず、ある境界条件で予期しない動作を引き起こすものから来ます。Euler Financeの攻撃者は何の暗号も「解読」しませんでした——コード作成者が予期していなかった正規の呼び出しシーケンスを見つけただけです。つまり最高クラスの監査を通過したコントラクトでも、「監査時には知られていなかった攻撃ベクター」が存在する可能性があります。攻撃者には無限の時間がありますが、監査者には数週間しかありません。