Revive^cc
revive^CC 、開発者がクリーンで安全なスマートコントラクトを書くのを支援するために、ブロックチェーン関連のセキュリティの脆弱性を検出することを目的としたHyperledger Fabric Smart Contracts(チェーンコード)の静的分析ツールです。 revive^CC 、Hyperledger Fabricチェーンコードの2つの既存の静的分析ツールの1つであり、他のツールはChainsecurityのチェーンコードスキャナーであり、特定の要件を満たすチェーンコードファイルを分析できます。 revive^CC特別なものにしているのは、このツールがセキュリティ分析のアクセシビリティを任意のチェーンコードファイルにもたらしたことです。これは今まで利用できなかったものです。
このツールは、オープンソースGO Static Analysis Tool Reviveの拡張であり、Reviveのフレームワークを使用して構築されました。したがって、開発者がClean Goコードを書くのを支援するために、Reviveのすべての利点とチェックが含まれています。 revive^CCシェフィールド大学での「スマートコントラクトの分析」に関する論文プロジェクトの一環として構築されました。
インストール
1. Place folder in the your $GOPATH/src/github.com/youraccount
2. Go into directory sivachokkapu/revive-cc
3. $ make install
4. $ make build
5. Move the revive file into $GOPATH/bin
6. You should now be able to use revive commands
使用法
$ revive {chaincodefilename.go} - will analyse the file
$ revive -formatter stylish {chaincodefilename.go} - better output format
$ revive - on a directory will analyse all files if from the same package

ディレクトリで$ Reviveを使用します
パフォーマンス

Revive^CCのパフォーマンスを評価するために、それぞれに脆弱性が含まれていたさまざまな実際のケースチェーンコードファイルが見つかりました。 GitHubリポジトリからの評価のために、合計20のパブリックチェーンコードファイルが取得されました。これらすべてのファイルが検証され、次の脆弱性が報告されました。その後、パフォーマンスをChainsecurityのチェーンコードスキャナーと比較しました。チェーンコードスキャナーでは、20個のファイルのうち13個のみを検証できました。全体として、Revive^CCはより多くの脆弱性を検出することができました(Revive^CCはより多くの真の陽性を検出できるので、それはわずかに誤検知を検出できます)。
検出可能な脆弱性
ブラックリストチェーンコードのインポート

チェーンコードのブラックリストチェーンコードインポートの脆弱性の例
特定のライブラリをインポートすると、ピア間のコンセンサスが不足する可能性があります。これは、特定のライブラリが外の世界との通信を許可し、ファイルアクセスを付与し、非決定的な動作をチェーンコードに導入できるためです。これらはすべて、ピア間の一貫性のない計算につながり、コンセンサスの欠如につながる可能性があります。ブラックリストに登録されたライブラリの1つは、「時間」ライブラリです。このライブラリにより、ピアは特定の時間に現在のタイムスタンプを取得することができますが、各ピアがピア間の矛盾につながる取引中に同じタイムスタンプを作成する可能性は低いです。これにより、ピア間の非決定的な行動が生じる可能性があり、一貫性のない計算につながる可能性があります。
グローバル状態変数

チェーンコードのグローバル状態変数の脆弱性の例
グローバル変数は、台座ではグローバル変数が追跡されないため、グローバル変数は単一のピアからのみグローバルです。ピアは必ずしもすべてのトランザクションを実行することはありません。グローバル変数のスコープは単一のピアに限定されているため、州は分岐する可能性があります。読み取りまたは書き込まれているデータは、これらのグローバルな状態変数に依存する必要がありません。この非整合的な計算により、ピア間のコンセンサスが不足しているため、すべてのトランザクションが無効であるとマークされます。
ゴルチン

チェーンコードのゴルチンの脆弱性の例
Goroutinesは、チェーンコードに同時性を導入します。それは非決定的な行動をもたらすことができます。これにより、ピアが同じ読み取りセットを計算しないため、ピア間の一貫性のない計算につながる可能性があります。これにより、ネットワーク上のピア間のコンセンサスがなく、すべてのトランザクションが無効であるとマークされます。したがって、ゴルチンを使用することは非常に落胆しています。
元帳のファントムリード

チェーンコードの元帳の脆弱性のPhantom読み取りの例
GethistoryofkeyまたはgetQueryResultを使用して元帳からデータを取得しても、システムのバージョン制御に合格しません。これは、これらのメソッドを使用して取得したデータを使用して、新しいデータを書き留めたり、元帳上にデータを更新したりしないでください。これは、予期しない動作につながり、トランザクションの実行に影響を与え、意図しない結果を引き起こす可能性があります。
マップ上の範囲

チェーンコードのマップ脆弱性上の範囲の例
範囲キーワードを使用すると、GOのさまざまなデータ構造のすべての要素を反復する機能を可能にします。ただし、範囲がマップに適用されると、反復順序はGOでランダム化されます。これは、範囲を使用してマップの要素を介して反復することは、すべての実行間で反復順序が変化する可能性があるため、決定論的ではないことを意味します。したがって、ピア間の計算は一貫性がなく、ネットワークのピアがコンセンサスに達することは不可能になります。
書き込み後に読んでください

チェーンコードで脆弱性を書き込む後の読み取りの例
元帳声明への書き込みを有効にするには、最初にトランザクションをコミットし、元帳に書く必要があります。それまでは、書かれてきた価値はその古い価値を保持します。つまり、元帳からこの値を読むと、チェーンコードが意図しているものではない可能性が高い古い値を返すだけです。これにより、予期せぬ動作につながり、トランザクションの実行に影響を与え、意図しない結果を引き起こす可能性があります。
ライセンス
mit