Phalconデバッグによるトランザクションの調査方法

Phalconは、トランザクションのデバッグをサポートしており、これは複雑なトランザクションの分析効率を大幅に向上させることができる強力な機能です。

Phalconデバッグによるトランザクションの調査方法

Phalconは、複雑なトランザクションの分析効率を大幅に向上させることができる強力な機能であるトランザクションのデバッグをサポートしています。以下では、この機能を紹介するために、Eulerプロトコルの悪用のトランザクションを使用します。

このトランザクションへのリンクはこちらです: https://phalcon.blocksec.com/explorer/tx/eth/0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d

デバッグモードへの入り方

デバッグモードに入るには2つの方法があります。1つ目は、呼び出しフロービューの特定の行からデバッグモードに入ること、2つ目は、デバッグボタンをクリックすることです。

方法I:実行トレース経由

PhalconのInvocation Flowは、ユーザーが悪用されたトランザクション全体像を把握し、潜在的な悪用箇所を特定できるビューを提供します。これは、トランザクションに多数の外部呼び出しやイベントが含まれている場合に役立ちます。 トランザクション

呼び出しフローで行を選択してデバッグモードを開く

Eulerプロトコルの悪用の場合、ハックトランザクションは、Aaveからのフラッシュローン借り入れEulerプロトコルへのDaiの預け入れなど、多くのステップで構成されています。しかし、ステップの1つで、悪用者はdonateToReserves()を呼び出してEulerプロトコルに巨額の資金を「寄付」しましたが、これは注意が必要です。この場合、デバッグアイコンをクリックすることで、このステップから直接トランザクションをデバッグできます。

方法II:デバッグボタン経由

デバッグモードに入るもう1つの方法は、右上隅にあるデバッグボタンをクリックすることです。

デバッグビューのレイアウト

デバッグモードに入ると、以下の画面が表示されます。

デバッグビューのレイアウト

この画面には5つのパネルがあり、それぞれ以下の通りです。

  • 呼び出しトレースパネル: 外部呼び出しとイベントのトレースを表示します。
  • ソースコードパネル: コントラクトのソースコードと、関数の呼び出しサイトを参照している現在の行(ハイライト表示)を提供します。
  • デバッグコンソール: 呼び出しレベルのシングルステップデバッグコンソールです。
  • デバッグトレースパネル: 内部呼び出しと外部呼び出しの組み合わせによる、現在のコントラクトのコールスタックを表示します。
  • パラメータと戻り値パネル: 呼び出しパラメータと戻り値を表示します。

ソースコードパネルにコードが表示されない場合があります。これは、パネルがデフォルトで関数の呼び出しサイトを表示するためです。ハッキングコントラクトが検証されていない(ソースコードが公開されていない)ため、ソースコードを表示できません。

eDaiコントラクトは検証されているため、ステップインしてdonateToReserves()の具体的な実装を確認できます。ステップインをクリックすると、現在の行はeDaiコントラクト内の呼び出しサイトになります。これはプロキシコントラクトであり、コードは以下の通りです。

コントラクトが検証されている場合のデバッグモード

再度ステップインすると、donateToReserves()の具体的な実装を確認できます。

donateToReserves()のデバッグ

デバッグコンソールの使い方

デバッグコンソールは、内部関数呼び出しを含む詳細な呼び出しトレースを理解するのに役立ちます(行の先頭にあるJumpは、それが内部呼び出しであることを示します)。呼び出しトレースパネルには内部呼び出しトレースがないことに注意してください。

デバッグビューのレイアウト

詳細な実行を移動するために、Phalconはデバッグコンソールに4つのボタンを提供しており、次へ前へは2つの色でわずかに異なるロジックを持っています。

  • 次へ(赤ボタン):コールトレース全体で次の呼び出しサイトに移動します。
  • 次へ(青ボタン):現在の関数の次の呼び出しサイトに移動します。
  • 前へ(赤ボタン):コールトレース全体で前の呼び出しサイトに移動します。
  • 前へ(青ボタン):現在の関数の前の呼び出しサイトに移動します。
  • ステップイン:呼び出し先関数に移動します。
  • ステップアウト:現在の関数の呼び出しサイトに戻ります。

例えば、次へボタンをクリックしてdonateToReserves()の実装を分析できます。ハッカーが1億eDAIを寄付したことがわかり、eDAIがdDAIより少なくなり、清算対象となったことがわかります。したがって、根本原因はdonateToReserves()に清算対象となるための流動性チェックが欠けていたことであり、悪用者は自身を清算して3800万eDAIを引き出しました。

Euler悪用の根本原因

デバッグビューの共有

トランザクションのデバッグは、URLを介して直接共有できます。このURLにはトレースの行番号が含まれています。他の人がリンクを開くと、同じデバッグビューが表示されます。これは、分析結果を他の人と共有したい場合に役立ちます。チームメンバーはこれを使用して共同で分析し、議論することができます!

要約すると、Phalcon Debugeを使用してハックトランザクションを分析する典型的なワークフローは次のとおりです。

  • Invocation Flowで潜在的な問題を特定し、そこからデバッグを開始します。
  • ソースコードをデバッグし、内部呼び出しのパラメータと戻り値を確認します。
  • 分析ビューをチームメンバー(または公開読者)と共有して共同作業を行います。

その他の機能

Phalcon Debugには、効率を向上させるための多くの機能があります。

  • 以下のスイッチをオンにすると、呼び出しトレースビューで完全なパラメータを表示できます。
パラメータスイッチ
  • 外部呼び出しの場合、「Rawdata」をクリックすると、生の呼び出しパラメータを確認できます。

BlockSecについてさらに詳しく:ウェブサイト | ドキュメント | Twitter | Medium | TGグループ

Sign up for the latest updates