Solidifyの紹介—スマートコントラクトのセキュリティリスクを自動的に検出して分類するツール

Solidifyの紹介—スマートコントラクトのセキュリティリスクを自動的に検出して分類するツール

プリンシパルブロックチェーンセキュリティエンジニア、PeterKacherginsky著

私たちのブロックチェーンセキュリティチームが2018年にいくつかのスマートコントラクトセキュリティレビューを開始したとき、2021年に何百ものレビューを行うとは思いもしませんでした。

オープンな金融システムを成長させるために、Coinbaseはサポートされている暗号通貨のリストを拡大することに取り組んでいます。 最近、私たちは アセットハブ 新規上場のためのデューデリジェンスプロセスを合理化するため。 私たちが検討する重要な要素の1つは、特に技術的な複雑さが大きく異なる可能性のあるイーサリアムベースのトークンに関して、スマートコントラクトのセキュリティです。 そのため、このプロセスの自動化、標準化、拡張を支援するSolidifyと呼ばれるスマートコントラクトセキュリティツールを作成しました。

手動のスマートコントラクト分析は、時間がかかり、エラーが発生しやすいプロセスです。 経験豊富なチームは、重大な金銭的損失につながる可能性のある時折の脆弱性を見逃しています。 お客様とCoinbaseを安全に保つために、トークンリストプロセスでは、すべてのスマートコントラクトに対してセキュリティレビューとリスク軽減の推奨事項が必要です。 この特殊なリスクの特定と推奨のプロセスを大規模に行う方法を理解するという私たちの課題を検討してください。 手動レビューを対象とした既存のスマートコントラクトセキュリティスキャナーを特定しました。 ただし、これらのツールは、完全に自動化された分析に必要な安全性の保証と標準化されたリスクスコアリングを提供していません。

この問題を解決するために、Coinbaseの顧客がトークンの保護に期待するようになった高いセキュリティ基準を下げることなく、新しい資産セキュリティレビューの割合を増やすSolidify(Solidityでのプレイ)と呼ばれるツールを開発しました。 Solidifyは、大規模な署名データベースとパターンマッチングエンジンを使用して、契約の特徴とそのリスクを確実に検出し、スマートコントラクトのリスクを標準化してスコアリングし、緩和戦略を提案し、Coinbaseが資産をリストするかどうかの決定に役立つ詳細なレポートを生成します。 Solidifyは、完全に自動的に、または追加の手動レビューが必要な固有の機能を特定することにより、何百ものスマートコントラクトのセキュリティリスクを評価します。

Solidifyのしくみ

ほとんどのスマートコントラクトリスクは、潜在的に危険な機能(フリーズ、アップグレードなど)またはテストが不十分な非標準機能の実装(カスタム撤回ロジックなど)を導入する資産発行者による運用設計の選択に起因します。 設計面では、OpenZeppelinのコントラクトライブラリなどの標準パターンを使用して、アセットの一時停止などの機能を実装するほとんどのアセット発行者を観察します。

contract Pausable is Ownable {
event Pause();
event Unpause();
  bool public paused = false;
  modifier whenNotPaused() {
require(!paused);
_;
}
  modifier whenPaused() {
require(paused);
_;
}
   function pause() onlyOwner whenNotPaused public {
paused = true;
Pause();
}
   function unpause() onlyOwner whenPaused public {
paused = false;
Unpause();
}
}

ソース: openzeppelin-contracts-1.3.0 / Contracts / lifecycle / Pausable.sol

上記のpause()関数を使用することにより、スマートコントラクトの所有者はすべての送受信操作を停止でき、場合によってはコントラクトユーティリティに悪影響を与える可能性があります。 一時停止ライブラリとそれを使用するそれぞれの伝達関数の存在により、一時停止のリスクがある契約を確実に分類できます。 Solidifyは、すべての既知のインスタンスと可能なバリエーションを集約することによってこれを行います。 一時停止() 機能し、現在分析されている契約にそれがあるかどうかを自動的にチェックします。 一意の署名は、AST(抽象構文木)構造を使用して生成され、構文のわずかな変化によって生成される重複を回避しながら、関数が実際に実行することの文法的な正確さを保証します。

上記のpause()関数のサンプルASTツリーは、他のスマートコントラクトと照合するための署名として使用される一意のハッシュを生成するために処理されます。

以下は、Solidifyによって生成された署名データベースのサンプルエントリです。 一時停止() 関数:

{
"Hash": 
"05654d81921af71079698aff1b4be500d1405ece9364a05915b738376c0250b5",
"Name": "pause()",
"Mutability": "nonpayable",
"ソース": ["signatures/openzeppelin/openzeppelin-contracts-1.10.0/contracts/lifecycle/Pausable.sol:666:90:0",  
"signatures/openzeppelin/openzeppelin-contracts-1.11.0/contracts/lifecycle/Pausable.sol:666:90:0",  
"signatures/openzeppelin/openzeppelin-contracts-1.9.0/contracts/lifecycle/Pausable.sol:666:90:0"
[.. redacted ..]
],
 "Doc": "@dev called by the owner to pause, triggers stopped stater",
"Features": [
"pausing"
 ]
},

同じことに注意してください 一時停止() 関数シグネチャは、OpenZeppelinライブラリの3つの異なるリリースと、そのコードを逐語的に含む他のトークンに存在します。 上記の署名には、資産のリスクを自動的に評価し、軽減策を提案できる「一時停止」などの機能のリストも含まれています(たとえば、所有者アカウントの堅牢なマルチシグニチャ)。 Solidifyは、すべての関数が検出されるか、署名データベースに追加されるまで、分析されたコントラクト内のすべての関数に対して同様の署名マッチングを実行するため、同じコードを2回分析する必要はありません。

Solidifyには現在、特定のスマートコントラクトに対するリスクを効率的に照合するために使用される約6,000の一意の署名があります。 2018年に最大2営業日かかった手動レビューは、2021年にはわずか数分で実行できます。セキュリティエンジニアが新しい署名を追加し、関連するリスクを記録するにつれて、Solidifyの機能と検出率は継続的に向上しています。

Solidifyの使用方法

サンプルのスマートコントラクトを分析して、動作中の署名マッチングエンジンを説明しましょう。 チェーンリンクトークン(LINK)を見て、で展開されているスマートコントラクトでSolidifyを実行することでどれほど安全かを見てみましょう。 0x514910771af9ca656af840dff83e8264ecf986ca

% ./solidify -a 0x514910771af9ca656af840dff83e8264ecf986ca
2021/05/20 15:16:22 Loaded 5777 function signatures
2021/05/20 15:16:22 Processing 0x514910771af9ca656af840dff83e8264ecf986ca
2021/05/20 15:16:23 Loading signatures from: contracts/LINK_0x514910771af9ca656af840dff83e8264ecf986ca/LinkToken.sol
2021/05/20 15:16:23 Generating AST for contracts/LINK_0x514910771af9ca656af840dff83e8264ecf986ca/LinkToken.sol
2021/05/20 15:16:24 Installing solidity version 0.4.21
2021/05/20 15:16:28 Set solc version to 0.4.21
2021/05/20 15:16:29 Detected 19 signatures
2021/05/20 15:16:29 Storing report in reports/LINK_0x514910771af9ca656af840dff83e8264ecf986ca/LINK.yml
2021/05/20 15:16:29 Storing report in reports/LINK_0x514910771af9ca656af840dff83e8264ecf986ca/ChainLink Token (LINK) Security Memo.md

Solidifyがコントラクトソースコードを自動的にダウンロードし、適切なSolidityバージョンを使用してASTを生成し、19の一意の関数シグネチャを検出して照合するのに、ほんの数秒しかかかりませんでした。 以下は、ツールによって生成されたマークダウンレポートのスニペットです。

ERC-20セキュリティ評価:ChainLinkトークン(LINK)

監査人: Peter Kacherginsky
Solidifyバージョン:1.2.3
契約ソース:0x514910771af9ca656af840dff83e8264ecf986ca

エグゼクティブサマリー

日付: 2021–05–20
残留セキュリティリスクスコア: 2
固有のセキュリティリスクスコア: 2

リスクスコア:2
リスクの説明:外部アドレス呼び出し

リスクスコア:1
リスクの説明:組み立て説明書の使用
**資産リスクは1〜5のスケールで計算され、5が最も深刻です。

この資産には緩和策は必要ありません。

リスクの詳細

ChainLinkトークンには次のリスクがあります。

2 | 外部アドレス呼び出し
コントラクトは、コントラクト自体で定義されていない機能をトリガーするために、別のスマートコントラクトで別の関数を呼び出す場合があります

外部アドレス呼び出しは、スマートコントラクトの複雑さとリスクを高めます。 外部からの呼び出しは、再入場の脆弱性の前提条件です。

次の機能がこのリスクを引き起こしました。

  • ContractFallback(アドレス、uint256、バイトメモリ)
  • transferAndCall(address、uint256、bytes memory)
  • transferAndCall(address、uint256、bytes memory)

1 | 組み立て説明書の使用
アセンブリ命令は、高レベルのSolidity言語を使用するのではなく、低レベルのインターフェイスを使用してイーサリアム仮想マシン(EVM)を直接操作します。 たとえば、インラインアセンブリは、他のコントラクトに対して低レベルの呼び出しを行い、ストレージスロットを直接操作し、高水準言語によって提供される開発者保護を回避することができます。

アセンブリ命令を使用すると、固有のコンパイラ保護の一部を回避しながら、スマートコントラクトの複雑さが増し、機能がわかりにくくなります。

次の機能がこのリスクを引き起こしました。

  • isContract(アドレス)

緩和策の詳細

次のリスク軽減策の実装により、残存セキュリティリスクスコアが向上します。N/ A

モニタリング

スラックモニタリング:N / A
SlackとPagerdutyの監視:N / A

マッチング関数シグネチャ

062afb9e84bbfded288268dcd3860be4fac7576697e563970dbfedd29dd9f5ff — add(uint256,uint256)
0f5d6c18af8bfe45551aea6c08ee36f2388d40721a399a99210754fb5b5d4fcc — isContract(address)
27711ded0a7898d7ac3feca9c539c7660909efcc5bf12c8e8b8612d522be6ac4 — contractFallback(address,uint256,bytes memory)
2d299e0f7d2ea990e5ca714c04fbac5ae68615d9404bf447f42234f28891fcd5 — transferFrom(address,address,uint256)
3ee09ec574744840001f024d57db0a57f4986733e71f8355bf8cd7af08e03ef4 — transferAndCall(address,uint256,bytes memory)
504201695c6fb08bebd3aaa9ccc252afd104cedddc5a5db8785ff1ec93e3255d -
[.. REDACTED ..]

マッチング関数ソース:

signatures/openzeppelin/openzeppelin-contracts-1.1.0/contracts/token/BasicToken.sol
signatures/openzeppelin/openzeppelin-contracts-1.1.0/contracts/token/StandardToken.sol
signatures/openzeppelin/openzeppelin-contracts-1.10.0/contracts/math/SafeMath.sol
signatures/openzeppelin/openzeppelin-contracts-1.11.0/contracts/math/SafeMath.sol
signatures/openzeppelin/openzeppelin-contracts-1.3.0/contracts/math/SafeMath.sol
[.. REDACTED ..]

コントラクトのほとんどは、標準のOpenZeppelinライブラリまたはその他の既知のスマートコントラクトから取得されたため、関数のマッチングが容易になります。 カスタムアセンブリコードの使用と外部関数呼び出しの作成に関連する情報は2つしかありませんでした。 ただし、これらはそれ自体でセキュリティリスクをもたらすことはありません。 上記の出力に基づいて、トークンは(2)のリスクスコアで評価されます。これは、セキュリティの観点から低リスクと見なされます。

制限事項

Solidifyは、ERC-20および同様のトークンを迅速かつ安全にレビューする必要性に対処するために構築されたものです。 標準化されたトークンインターフェイスと、アカウントの管理に必要な比較的制限された機能を持つことは、そこにある契約の大部分に一致する署名データベースを構築するのに最適です。 ただし、AMMやその他のDeFiアプリケーションなどのより複雑なアセットでは、カスタムコードの割合が高いため、追加の手動分析が必要です。 ただし、Solidifyは、DeFiクローンを分析する場合、または分析者がカスタムロジックに集中できるように、手動レビュースコープから標準ライブラリを削除する場合にも、これらのアプリケーションにとって有益です。

Solidifyは現在イーサリアムブロックチェーンとSolidityに限定されていますが、ツールを他のEVMベースのプラットフォームに拡張し、Vyperなどの追加言語をサポートする計画があります。

Solidifyのすべてのデータはアナリストによって手動で入力されるため、署名の機能を見逃したり誤分類したりして、誤った評価が行われるリスクもあります。 悪意のあるコンストラクター、コードの難読化、ツール自体の悪用、およびその他の手法によってバックドアを隠そうとするデプロイされたコントラクトが懸念されます。 シグニチャを検証し、異常や悪意のある動作を検出するために、追加のコントロールが内部で構築されています。

将来の開発

Solidifyは今年後半にオープンソース化する予定です。 それまでの間、追加の開発は以下に焦点を当てています。

  • シグニチャの生成と検出ロジックの精度の向上
  • フォーマル検証手法を統合して、手動分析の必要性を減らします

結論

このブログでは、スマートコントラクトのリスクを自動的に検出して分類するために使用される新しいツールと手法を共有しました。 Solidifyは、スマートコントラクト監査人、資産発行者、およびその他の取引所がデジタル資産エコシステムをより安全にするために使用できる、強力で高度に構成可能なツールです。 暗号経済が成長するにつれて、Solidifyのようなツールはますます重要になります。

あなたが金融の未来を確保することに興味があるなら、 Coinbaseは採用しています


Solidifyの紹介—スマートコントラクトのセキュリティリスクを自動的に検出して分類するツール もともとで公開されました Coinbaseブログ ミディアムでは、人々はこの物語を強調してそれに反応することによって会話を続けています。

Share:

Share on facebook
Facebook
Share on twitter
Twitter
Share on pinterest
Pinterest
Share on linkedin
LinkedIn

Related Posts

2021年に暗号波に乗った有名人

過去数年間の栄光を覆い隠していた暗号エコシステムは、2021年を通して1年間のスポットライトを維持することができました。 主流の採用 ビットコインのBTC)、ミームコイン狂乱 駆動 柴犬(SHIB)とドージコイン(ドージ