[レポート]SMARTIAN:静的・動的データフロー分析によるスマートコントラクトのファジング強化 – CODE BLUE 2022 #codeblue_jp

CODE BLUE 2022で行われた「SMARTIAN:静的・動的データフロー分析によるスマートコントラクトのファジング強化」というセッションのレポートです。
2022.10.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

今回はCODE BLUE 2022で行われた以下のセッションのレポートです。

SMARTIAN:静的・動的データフロー分析によるスマートコントラクトのファジング強化

従来のソフトウェアとは異なり、スマートコントラクトは、一連のトランザクションが永続的な状態を共有するというユニークな構成を持っている。残念ながら、このような特性により、既存のファザーは重要なトランザクションシーケンスを発見することが困難となっている。 この課題に取り組むため、われわれはスマートコントラクトのファジングに静的解析と動的解析の両方を採用している。まず、スマートコントラクトのバイトコードを静的に解析し、どのトランザクションシーケンスが効果的なテストにつながるかを予測し、各トランザクションが満たすべき特定の制約があるかどうかを把握する。このような情報は、ファジングの段階に渡され、最初のシード値を構築するために使用される。ファジング中は、軽量な動的データフロー解析を行い、ファジングを効果的に導くためのデータフローに基づくフィードバックを収集する。 われわれは、SMARTIANと名付けられた実用的なオープンソースファザーで我々のアイデアを実装する。SMARTIANは、ソースコードを必要とせず、実世界のスマートコントラクトのバグを発見することができる。われわれの実験結果は、SMARTIANが実世界の契約から既知のCVEを発見する上で、既存の最先端ツールよりも効果的であることを示す。また、SMARTIANはコードカバレッジの点でも他のツールより優れている。

Presented by : キム・デュオン - Doyeon Kim

レポート

  • これは大学院だったときに始めた研究
  • 今もスマートコントラクトFuzzingについて研究を続けている
  • Ethereum Smart Contract
    • 特にEthereumのスマートコントラクトについて扱っている
    • ブロックチェーンの上で処理される
    • デジタルキャッシュを使う
    • EVM
  • スマートコントラクトの特徴
    • 一般的にコントラクトコードは関数を定義しそれを提供する
    • コントラクトの状態変数を読み書きできる
    • Cのグローバル変数に似ている
    • 関数が実行された後も変数は持続する
    • 状態変数はコントラクトの状態を保存するのに便利
    • 例えば銀行系で各顧客の口座状況を反映できる
  • スマートコントラクトはバグがあると壊滅的な損失を受ける
    • DAOの問題など有名な事象がある
    • スマートコントラクトをテストすることが重要
  • 静的分析
    • プログラムの挙動を実行せず予想する
    • 例えばBuffer Overflowが起きることを予測できるか
  • 対極はFuzz Testing(Fuzzing)
    • 繰り返しランダムな値で実行してクラッシュさせる
    • プログラムのプラクティスを見つけるのに有効
  • Fuzzingチャレンジ
    • スマートコントラクトのステートレスな性質が大事
    • 関数の実行順序を気にする
    • 従来のカバレッジベースのFuzzingではどの順序に意味があるか把握することができない
    • この問題を解決するためにいくつかアプローチがある
      • 他の事例では機械学習を使うものがある
  • 静的分析を補完するアプローチを検討
    • 静的解析でどの関数の呼び出しシーケンスでその様になるか検討する
    • 静的解析とFuzzingをあわせる
  • Smartianを紹介
    • 静的解析してシードプールをFuzzerにわたす
    • 静的解析モジュール
      • スマートコントラクトは高水準のコードからバイトコードに変換される
      • ソースコードを入手できなくても解析できることを想定しているためバイトコードを受け取って分析する
    • なぜバイナリを使うか
      • スマートコントラクトにバイトコードで展開されるから
      • ソースコードが無いことがある
      • 手に入れやすい
    • Fuzzingモジュール
      • バイトコードはEVM上で実行される
      • Stackはオペランドを保持
      • Memoryはマッピング
      • 永続記録Storageで状態変数を変更
      • バイトコードのどのオペランドが使われるか
      • すべての命令のセマンティクスを分析
    • ハイレベルの静的解析
      • EVMの実行状況を推測する
      • どの状態変数が処理されたか
    • シード初期化
      • Funcs
      • Defs
      • Users
      • DataFlowGain
  • Dynamic Data-Flow Analysis
    • イニシャルシードを変更しない
    • まず中間シードを認識する
  • Bug Oracle
    • 13のクラスで実装
    • Assertion Failure
    • Arbitrary Write
    • Requirement Violation
    • Block State Dependency
    • Control-Flow Hijack
    • Ether Leak
      • コントラクトから自由に
    • Freezing Ether
    • Mishandled Exception
    • Multiple Send
      • DoSの特有ケース
    • Integer Bug
    • Reentrancy
    • Suicidal Contract
    • Transaction Origin Use
  • Implementation
    • Static analysis B2R2
  • 評価結果
    • 詳細は論文みてね
    • Fuzzingの有効性が改善したのか
    • Smartian
    • 2つのFuzzer
    • 他のツールより2倍多いCVEを発見

感想

スマートコントラクト特有の問題へのアプローチはすごく大事ですね。

Smartianを是非チェックしましょう。