ブロックチェーン記事の概要

ブロックチェーンスマートコントラクトのセキュリティに関するコンテンツの概要

近年のこの問題の解決策としては、以下の3つの解決策が考えられますが、もちろんこれら3つの方法に限定されるものではありません、 1.ソース
コードをテキストコンテンツとして入力し、(NLP)(N-gramやNLP)の技術モデルを利用する2.抽象構文
ツリーである AST を使用し、AST からさまざまな呼び出しパスを抽出してシーケンス サンプルを学習します。 3.
GNN モデルを使用してソース コードをグラフに変換します (このグラフはグラフ理論です)画像の代わりにプロットが使用されています)

具体的な方法について話した後、抽象的な方法について話しましょう;
1. 静的分析方法: スマートコントラクトのソースコードの静的分析を通じて、その抜け穴を検出します。この手法は主に、プログラム アナライザーやシンボリック エグゼキュータなどの自動化ツールによる脆弱性の特定などのコード分析に基づいていますが、動的に生成されたコントラクトを検出したり、コントラクトのコンテキストや相互作用を考慮したりすることはできません。
2. 動的分析方法; スマートコントラクトの動的動作テストを通じて、その抜け穴を検出します。この手法は主に、攻撃環境をシミュレートし、脆弱性を発見するためにさまざまなトランザクションや操作シーケンスを生成するなどのインタラクティブなテストに基づいていますが、この手法は大量のコンピューティング リソースを消費し、考えられるすべてのインタラクション状況を完全にカバーすることはできません。
3. ハイブリッド分析手法; 静的分析手法と動的分析手法を組み合わせて、包括的な分析を通じてスマートコントラクトの抜け穴を検出します。この方法は、スマートコントラクトの静的および動的特性を包括的に考慮して脆弱性をより正確に検出できますが、より多くのコンピューティングリソースを消費する必要もあります。
4. 手動レビュー方法: 専門の監査チームを通じてスマートコントラクトを手動でレビューし、抜け穴を特定します。この方法ではさまざまな種類の抜け穴を見つけることができますが、多くの人的コストと時間的コストを投資する必要があります。

まず、私がこの側面に触れたときに最初に読んだ論文を紹介しますと、当然ですが、これは静的解析(シンボリック実行)の手法に基づいて実装されている DEFECTCHECKER: Automated Smart Contract Defect Detection by Analyzing EVM Bytecode,この分野でJAVAで書かれた脆弱性検出手法が登場した背景には、スマートコントラクトがチューリング完全系であることがあり、これまでと異なるコードの最大の特徴は、暗号通貨を保持できることである。攻撃者に攻撃の動機を与えます。一方で、コントラクトのバイトコードは許可-楽山市と
ネットワーク上で公開されているため、攻撃者もそのような脆弱性があるかどうかを検知することができ、データセットは作者自身が用意したDefining Smart Contract Defectsと比較します。 Oyente、mythril、securify などのイーサリアム上の他の検出ツールは、各コントラクトの F スコアと検出時間を改善しました。
主な貢献: より正確かつ最速の
イーサリアム仮想マシン; イーサリアム仮想マシンはスタックベースのステートマシンです トランザクションを実行する必要があるとき、バイトコードは最初にバイトに分割され、各バイトはオペコードを表し、各オペコードには表す一意の 16 進数。
ここに画像の説明を挿入

全体的なスキーム設計。
ここに画像の説明を挿入
全体的な設計には主に入力器、CFG 構造、特徴検出器、
欠陥分類器の左端の 4 つのモジュールが含まれます。まず、geth を使用してバイトコードをオペコードに変換し、次にオペコードを基本ブロックに変換します。シンボルは各ブロックに命令セットがあり、DC は CFG を生成し、すべてのスタック イベント (?) を記録します。シンボリック実行中に、機能検出器は 3 つの機能、つまり Money Call Loop ブロックと Payable 関数を検出します。したがって、DC 識別子は 8 つを使用します。脆弱性の種類を特定するためのさまざまなルール (もちろんエキスパート定義モジュールも使用)
Basic Block Builder の基本ブロックの構築:
ここに画像の説明を挿入

ウェブサイトリンク: https://paper.seebug.org/790/ 具体的な基本ブロックの構築方法があるので、ここでは詳しく説明しません。

シンボリック実行:
Ethereum 仮想マシンは、以前のスタックベースのステート マシンとは異なります。evm バイトコードのジャンプ位置はシンボリック実行中に計算する必要があるため、DC は evmopcode 内の各オペコードをシンボリックに実行し、それを取得する必要があります。 CFG. ここでの以前の質問に対する答えは、スタック イベントとは何かということです (すべてのシンボルが実行された後の evm スタックの状態を記録します) このグラフは、上で投稿したグラフである CFG に構築されます

ここに画像の説明を挿入

特徴検出器
1 マネーコール

リエントランシーの脆弱性を検出するには、ここで転送操作があるかどうか、つまり、address.send、address.transfer、address.call.value があるかどうかを確認する必要があります。これらの転送メソッドはすべて CALL 命令などを生成します。 。ただし、CALL 命令をチェックするだけでは十分ではありません。この記事では、CALL 命令が転送イーサによって生成された場合、CALLmoney-call を呼び出します。それ以外の場合は no-money-call です。call は 7 つのスタック内の命令を読み取ります。最初の 3 つはガス制限、受信者アドレスです。 .transfer 金額、transfer-amounts>0 の場合、コールがマネー コールであることを確認できます。この時点では、
送信も転送もリエントリーを引き起こすことができないため、マネー コールを考慮するだけではまだ十分ではありません。したがって、送信と転送のみが evm スタックに特定の番号 2300 をプッシュするため、現時点ではまだ特定の値 2300 に注意する必要があります。
これは最大のガス消費量を表しており、この 2 点が確認されて初めて call.value 2 LOOP BLOCKかどうかがわかります
CFG を構築した後、どのブロックがループの始まりであるか、どのブロックがループであるかに注意する必要がありますループ本体を構成します。この問題では、最初に DFS を介して CFG のすべてのパスをたどり、次に訪問したパスをマークする必要があります。最後に、訪問したブロックに到達した場合、このブロックが開始点であり、他のブロックはループ本体
3 有料関数
関数が ether を受け入れるかどうかを確認するには、関数は payable キーワードが含まれている場合にのみ ether を受け入れます。それを確認するには、各関数の最初のブロックをチェックします。CALLVALUE 命令を使用して、受け入れられた ether の量を表示します。ether を受け入れる場合は、 callvalue はゼロ以外の値であり、コマンド ISZERO で確認できます。

DCの具体的な検査方法は以下の通りです
ここに画像の説明を挿入

この図は、その脆弱性を確認するためにどのような特定の条件が必要かを示しています DC の短所: NC DuEI を検出するときに、偽陽性と偽陰性が発生する可能性があります。
これらのタイプの脆弱性の検出原理については、現在の背景では、
TSD は tx.origin 攻撃とも呼ばれるトランザクション状態依存であり、主に tx.origin と msg.sender の間の定義の混同を利用します
。 .origin は ORIGIN 命令を生成するため、シンボリック実行を使用してバイトコードを解析する場合は、ORIGIN 命令に特別な注意を払う必要があります。次に、ORIGIN の後に読み取られた EQ 命令があるかどうかを確認する必要があります。この eq 命令があると、2 つのアドレスの値を比較します。

外部影響による動作
スマートコントラクトにこの種の脆弱性が含まれている場合、スマートコントラクトは命令セット内のMoney CALLの戻り値を検出し、現在のループ呼び出しを停止しますが、この抜け穴を検出するにはループに関連する部分を見つける必要があります。次に、Money CALL を含むブロックがあるかどうか、および現在のブロックが条件付きであるかどうかを確認します。この場合、ブロックは戻り値を確認する必要があるためです。すると、このブロックは端子台にジャンプします。
他にも読者に読んでいただく内容がいくつかあるため、ここではあまり詳しく説明しません;
要約: この記事は明らかに静的分析のケースであるため、実際のイベントやバリアントの一部を分析する方法はありません。脆弱性を正確に特定。偽陽性、偽陰性などの結果が生じる可能性がありますが、依然としてオペコードの比較的古典的な操作方法です。心を広げる

さて、2 番目の記事
「再入可能脆弱性の検出とローカリゼーション: ディープ ラーニング ベースの 2 フェーズ アプローチ」を紹介します。この記事は「独特: 重要なデータ フロー グラフと事前トレーニング技術に基づくスマート コントラクトの脆弱性検出」に似ています。この記事は似ています。「従来の検出
」このメソッドは特定の脆弱性の場所を特定できません。この記事ではそれを実行しますが、検出できるのは再入可能脆弱性のみです。要約説明: ReVulDL は、脆弱性の検出と脆弱性の位置を統合するフレームワークであり、グラフベースの事前トレーニング モデルを使用して、コントラクト内の変数間の複雑な関係の伝播チェーンを学習します。脆弱性の位置については、ReVulDL は、解釈可能なマシンを使用して、契約内の疑わしい記述の特定の位置を学習して特定し、DL 手法、つまり NLP を使用します。
具体的な検出プロセスは次のとおりです。
データ前処理
この記事では、まずブロックチェーン コントラクトのデータ前処理が実行され、対応する制御フロー グラフに変換されます。制御フロー グラフは、プログラムの実行中に取り得るすべてのパスを表す有向グラフです。

モデルのトレーニング
データの前処理が完了した後、この記事では深層学習に基づく分類器を使用して、コントラクトにリエントラントの脆弱性があるかどうかを判断します。分類器は、畳み込みニューラル ネットワークと長期短期記憶ネットワークを使用して、入力された制御フロー グラフを学習することにより、対応する分類結果を出力します。

アテンション メカニズム
分類子の出力コントラクトにリエントラントの脆弱性がある場合、この記事ではアテンション メカニズムを使用して、脆弱性が存在するコード行を特定します。アテンション メカニズムにより、脆弱性がある可能性が最も高いコード行へのコントラクトにモデルの注意を集中させることができるため、位置特定の精度が向上します。

モデルの評価
最後に、この記事では、正解率、再現率、F1 値など、さまざまな指標を使用してメソッドを評価します。実験結果は、この方法がリエントラント脆弱性の検出と位置特定において高い精度と信頼性を備えていることを示しています。

要約すると、この記事の原則は、ディープ ラーニング テクノロジを使用してコントラクトを分類し、リエントラントな脆弱性があるかどうかを判断し、アテンション メカニズムを使用して脆弱性が存在するコード行を特定し、最終的に検出および検出するという目標を達成することです。リエントラントな脆弱性を特定する。

従来の動的および静的検出手法と比較して、最大の変更点は手動で作成されたヒューリスティック (手動で作成されたヒューリスティック) が使用できないことであり、近年出てきた DL ベースの手法には多くの利点があります...特定の脆弱性の位置は完全ではありません。さらに、脆弱性の検出と位置特定は 2 つの対話型タスクです。一般的に、位置特定は脆弱性の特性を利用します。したがって、この記事の枠組みはこのような背景の下で提案されています。

脆弱性検出段階では、
特にスマート コントラクト SC を考慮して、ReVulDl は最初に CHsc の伝播チェーンを構築します。つまり、呼び出しチェーンは SC のソース コードのデータ フロー グラフを使用し、次にグラフベースのプレ呼び出しのチェーン間の複雑な関係 (データ依存関係など) を学習するためのトレーニング モデル。最後に、トレーニング済みのモデルを使用して、現在のスマート コントラクトに再入可能脆弱性が含まれているかどうかを判断します。

脆弱性の特定段階では、
SC で再入可能脆弱性が検出された場合は、IML を使用してその脆弱性を特定します。具体的には、最初に ReVulDl を使用します (スマート コントラクトの特定の情報を検出する準備をします。たとえば、トレーニングされたモデルは、コントラクトがコントラクトかどうかを決定します)抜け穴があるかどうか) ) とテスト データセット内の SC の伝播チェーン。次に、事後解釈可能性メソッドを使用して、スマート コントラクト コール チェーンの最小の脆弱性関連サブチェーンを見つけます。使用原則は、エッジ eSC が CHSC の脆弱性の検出に重要である場合、eSC を minCHsc に含める必要があることです。そして最後に、重要な変数とその伝達チェーンを使用して、minCHsc の脆弱性を潜在的に引き起こす可能性のある疑わしいステートメントを特定します;
主な貢献;
1. このフレームワークを提案します
2. 脆弱性を検出するだけでなく、特定の場所を特定することもできます
3. 実験は大規模なデータセットのスケールが大きく、実験結果は非常に良好です

基本知識.
解釈可能な機械学習
この記事では、事後解釈可能性、つまりイベント後の解釈可能性を使用します; その目標は、基礎となるモデルを変更することなく、取得された内容に関する知識を提供し、モデル内の学習された表現や特徴を説明することです。の一部は予測結果の理解に責任を負います。

伝播チェーン - 伝播チェーン
伝播チェーンとは、特定の数の指定されたプログラム コード フラグメントの間にコード シーケンスが存在することを指します。このシーケンスでは、隣接する 2 つのコード フラグメント間に直接的または間接的なデータ/制御依存関係があります。この論文では、データ フロー関係を使用して伝播チェーンを構築します。伝播チェーンは、同じソース コードの異なる抽象構文の下で同じセマンティクスであり、ディープ ラーニング モデルによる学習が容易であるためです。たとえば、c = a + b のデータ フロー グラフを構築すると、c の値が a と b に依存することが明確にわかり、変数 c のセマンティクスを理解するための新しい視点が得られます。したがって、ReVulDL は、スマート コントラクトの伝播チェーン内の関係を活用し、グラフベースの事前トレーニング済みモデルを使用して関係を学習し、再入可能性の脆弱性を検出します。

データの準備 データの準備
ReVulDL は、まずデータ (スマート コントラクト コードの特性と送信チェーン) を準備する必要があります。スマート コントラクトの場合、REVULDL は次の 2 つの手順を通じてさまざまなタイプのデータを抽出します: 1. スマート コントラクトのソース コードの表現 re は、一連のトークンの形式でスマート コントラクトのソース コードのコンテンツをキャプチャします。いいえ、ソース コードの単語が収集され、シーケンスにシャッフルされます。ReVulDL はノイズの影響を避けるために文字のサブトークンを削除します。具体的には、契約書 A があり、A から始まり、ソースコードの集合が C = {c1, c2, …, cmc}、変数の集合が V = {v1, v2, …, vmv} であるとします。次に、2 つのセットをシーケンス I = {[CLS], C, [SEP], V } に結合します。ここで、[CLS] は 2 つのセットの前にある特別なマーク、[SEP] は特別なシンボル ソース コードです。セット C と変数セット V を分割するため。A を表現するために、シーケンス I が入力ベクトルに変換されます。ここで、各トークンはトークン自体とその位置の埋め込みによって表されます。

伝播チェーンの構築
ReVulDL は、まずスマート コントラクトのソース コードを解析して抽象構文ツリー (AST) にし、次に AST からデータ フロー関係を抽出し、最後にデータ フロー関係から伝播チェーンを構築します。具体的には、ReVulDL は、treesitter (ソース コードを AST に変換するツール github に直接呼び出すことができるソース コードが用意されています) を使用して、ソース コード セット C = {c1, c2, …, cmc } を AST (ソース コードからの AST) に変換します。 C にはコントラクト ソース コードの構文情報が含まれ、ターミナル (リーフ) は変数セット V = {v1, v2, …, vmv } を取得するために使用されます。変数セット V = {v1, v2, …, vmv} 内の各変数 (vi で示される) に対して、vi から vj までの直線エッジ ε = vi, vj を作成します。これは、j 番目の変数の値またはから計算される値を示します。 i 番目の変数。

再入可能 Vul 検出プロセス
ここに画像の説明を挿入

これは、入力ユニット、結合層、マスクされたマルチヘッド アテンション層、層正規化層、n 変換層、線形層の 6 つの部分で構成されます。Data Preparation によって構築された ReVulDL には、トークン シーケンス、変数シーケンス、トークン位置シーケンス、変数位置シーケンス、伝播チェーン、キー情報の 6 つの入力ユニットがあります。具体的な検出プロセスについては、このブログのプロセスのリンクを参照してください。

再入可能脆弱性のローカリゼーション
ここに画像の説明を挿入

重要なことは、この部分で PC から minPC への変換を実現する必要があり、同時にポストイベント インタープリタを使用して脆弱性の特定の場所を特定することです。
具体的な総合結果は以下の通りです。
ここに画像の説明を挿入

この論文の実験は再現可能であり、具体的な操作は著者が作成した readMe ファイルに記載されています。ここでは紹介しない詳細な技術実装もいくつかあります(筆者も理解していませんでした)。

実験部分
評価指標: 適合率、再現率、および f1 スコアの使用
ここに画像の説明を挿入
ここに画像の説明を挿入

拡張できる部分は、他の脆弱性の検出です。
この記事の洞察は、脆弱なコードのローカリゼーションを実現することです。3
番目の記事「グラフ ニューラル ネットワークを使用したスマート コントラクトの脆弱性検出」は、近年の GNN を使用した代表的な脆弱性検出フレームワークです。記事では、3 種類の脆弱性の検出は、再入可能、タイムスタンプ、無制限ループです。これら 3 種類の脆弱性の検出がこの記事の主な目的です。要約。スマート コントラクトの脆弱性を検出するための既存の作業方法は、修正されたものに大きく依存しています
。エキスパート モードはエキスパート ルールでもあるため、誤検知と誤検知が多くなり、脆弱性の亜種を検出できなくなります。具体的な技術実装は、DR-GCN と TMP を使用して、必要な特定のツールを実装することです。

ここでは具体的な方法を簡単に紹介します。まず、スマートコントラクトのソースコードをグラフに変換しますが、プロジェクトステートメント間のデータフローや制御フローに応じて、ソースコードを直接使用したり、途中の記事でオペコードを使用したりするのとは異なります。各ノードはキーを表し、関数呼び出しまたは変数を表します。同時に、サイドワードはそれらの実行順序を表します。ほとんどの GNN は情報伝播において本質的に平面的である (つまり、各ノードが GNN によって平等に扱われる) ため、グラフを縮小し、正規化プロセスを使用してグラフを縮小する必要があります。次に、GCN を DR-GCN に拡張して正規化プロセスを解決します。さて、今度は副次的な問題を検討する必要があります。さまざまなプロジェクト要素間のさまざまな役割とタイミング関係を考慮し、新しいタイミング伝播ネットワーク (TMP) を提案する必要があります。

ここに画像の説明を挿入

方法の概要は
3 つの異なる段階に分かれています: 1、つまり、ソース コードから制御フローとデータ フローのセマンティクスを抽出し、フォールバック メカニズムをクリアするグラフの生成段階、2、グラフの正規化操作K-partite グラフ k-partite グラフを受信しました; 3. 新しいメッセージ伝播シーケンスはモデルと脆弱性検出に役立ちます

Graph Generation
では、データ抽出時に異なるプロジェクト要素間の意味関係を保持できるという以前の記事を受け取りましたが、ポイントの構造がメジャー、セカンダリ、フォールバックに分かれており、3 種類のノードを使用していることがポイントです。再入可能脆弱性については、重要なノードを選択する方法。プライマリ ノードは、特定の脆弱性を検出するために重要なカスタム関数または組み込み関数の呼び出しをシンボル化します。ノードのモデリングは、伝達関数または call.value が埋め込まれた関数の呼び出しを指します。これら 2 つの点は、リエントラントを検出するために非常に重要です。

セカンダリ ノード構造。メイン ノードは重要な通話を表し、セカンダリ ノードはユーザー バランスやボーナス フラグなどの主要な変数をモデル化するために使用されます。正式には、キー変数はセカンダリ ノード S1、S2、...として定義されます。. . など

フォールバック ノードのビルド。さらに、テスト対象の機能と対話できる、攻撃コントラクトのフォールバック機能を刺激するフォールバック ノード F を構築します。フォールバック機能はスマートコントラクトにおける特殊な設計であり、多くのセキュリティホールの原因となっています。
ここに画像の説明を挿入

エッジを利用して、異なるノード間の豊富なセマンティック情報を表現します。各エッジは現在のコントラクト呼び出しのパスを表し、エッジの順序も保持されます。エッジをタプル (Vs、Ve、o、t) に変えることができます。ここで、o はエッジの数である時間の順序を表し、t はエッジのタイプを表します。

Contract Graph Normalization では
主に重要なノードのみが保存され、他のノード S と F は削除されます。マージの際には、マージされたノードの特性が隣接するメイン ノードに伝播される必要があることに注意してください。各ノードは To を必要とすることに注意してください。隣接するノードに伝播します。
マージされたマスターノードには自己特徴、S-in、S-outの3つのノードがあり、グラフ構築後は検出処理となるが、具体的な技術としてはKipfが提案するDR-GCNが挙げられる。および
Welling 構造化グラフ データ用の新しい畳み込みニューラル ネットワーク。
ここに画像の説明を挿入

A_hat = A + IA は I 回の隣接行列自己循環、Xl は層 l の特徴行列、Wl はトレーニング用の重み行列です。この式では、対角ノード次数行列 D_hat を使用して A を正規化します。 A 上記で作成したグラフです。

TMP
ここで使用するTMPネットワークはリードインフェーズとリードアウトフェーズから構成され、TMPはエッジに沿ってそれぞれの順序に従って情報を伝送します。TMP は、グラフ全体のノード集約のラベル label を計算します。
ここに画像の説明を挿入

特定のメッセージ伝播プロセスでは、メッセージはすべてのエッジに沿って、単位時間あたり 1 ステップで伝播します。タイム ステップ step0 で、隠れ状態 h_i0 は各ノード Vi の Vi ノードの特性を初期化し、タイム ステップ Kth、つまり k 番目のエッジが伝播する eK で隠れ状態 Vek (これは k 番目のエッジを意味します) を変更します。ターミナルノード V)。特に、メッセージ Mk の計算は hsk、つまり k 番目のエッジの開始ノードの隠れ状態情報に基づいて行われ、具体的な計算式は次のとおりです。
ここに画像の説明を挿入

特定の非表示状態の更新式は次のとおりです。
ここに画像の説明を挿入

読み出しステージは、特定のメッセージの出力ステージでもあります。
ここに画像の説明を挿入
ここに画像の説明を挿入

具体的な実験結果:

IDEA は以前の GCN を改良し、TMP メカニズムを混合してノードの特性を融合し、実験結果は比較的最適化された結果を達成しました。

おすすめ

転載: blog.csdn.net/weixin_47988292/article/details/129958423