メインコンテンツへスキップ

スマートコントラクトのセキュリティ・チェックリスト

スマートコントラクトセキュリティSolidity
中級
✍️Trailofbits
📚セキュアなコントラクトの開発(opens in a new tab)
📆 2020年9月7日
⏱️6 分の読書 minute read

スマートコントラクトの開発チェックリスト

スマートコントラクトを作成する際には、以下に挙げる大まかなプロセスに従って行うことをお勧めします。

既知のセキュリティ関連の問題点について確認します:

  • Slither(opens in a new tab)で、コントラクトをレビューする。 Slither には、40 種類以上のよくある脆弱性を対象とする検出機能が搭載されています。 新しいコードが追加されるたびにレビューを実行して、クリーンな報告になるようにします(特定の問題を無視する必要がある場合は、トリアージモードを使用します)。
  • Crytic(opens in a new tab)で、コントラクトをレビューする。 Crytic では、Slither では検出できな 50 種類の問題点を確認できます。 さらに、GitHub のプルリクエストに含まれるセキュリティ関連の問題点を簡単に発見できるので、チーム内の問題把握に役立ちます。

あなたのコントラクトに含まれる特別な機能について検討する:

  • コントラクトがアップグレード可能かどうか: slither-check-upgradeability(opens in a new tab)またはCrytic(opens in a new tab)を使って、アップグレード可能性に関するコードに欠陥がないか確認します。 当チームでは、アップグレードの失敗につながる 17 のケースを文書化しています。
  • コントラクトは、ERC 準拠を謳っていますか? slither-check-erc(opens in a new tab)で確認してください。 このツールでは、6 種類の一般的な仕様に準拠していない場合、ただちに指摘されます。
  • Truffle の単体テストを活用していますか? slither-prop(opens in a new tab)を使って、単体テストを含めてください。 あなたが作成したコードに基づき、ERC-20 の各機能につき、セキュリティに関する一連の堅牢な属性を自動的に生成します。
  • サードパーティのトークンと統合予定ですか? 外部コントラクトを利用する事前に、このトークン統合チェックリストでレビューしてください。

コードにおける重要なセキュリティ関連の機能を、視覚的にチェックします。

  • Slither のinheritance-graph (opens in a new tab)プリンターをレビューします。 不注意によるシャドーイングや C3 linearization にまつわる問題を回避してください。
  • Slither で、機能サマリー(opens in a new tab)のプリンター(表示)をレビューします。 機能の可視性およびアクセス管理のレポートが作成されます。
  • Slither のvars-and-auth(opens in a new tab)プリンタをレビューします。 状態変数に対するアクセス管理のレポートが作成されます。

セキュリティ関連の重要な属性を文書化し、自動化されたテスト生成機能を用いて評価します:

  • コードにおけるセキュリティ属性を文書化する方法について学びます。 最初は大変ですが、最良の結果を得る上で最も重要な作業です。 また、このチュートリアルのより高度なテクニックを活用する上でも、必須の作業です。
  • Echidna(opens in a new tab)およびManticore(opens in a new tab)で使用するために、Solidity でセキュリティ関連の属性を定義します。 状態マシン、アクセス管理、算術演算、外部とのやりとり、および標準の遵守に焦点を当ててください。
  • Slither の Python APIで、セキュリティ関連のプロパティを定義します。 継承、変数の依存関係、アクセス管理、およびその他の構造上の問題に焦点を当ててください。
  • Crytic(opens in a new tab)を使用して、コミットごとにプロパティテストを実行します。 Crytic では、セキュリティ属性に関するテストを実行、評価できるため、チーム全員が GitHub で合格したかどうか簡単に確認できます。 テストが不合格だった場合、コミットをブロックできます。

最後に、自動化ツールでは容易に特定できない以下のような問題についても注意してください:

  • プライバシーの欠如:トランザクションがプールでキューに入った場合、すべてのユーザーがトランザクションを確認できなければなりません。
  • トランザクションのフロントランニング
  • 秘匿化された操作
  • 外部 DeFi コンポーネントとの危険なやりとり

ヘルプを求めましょう

毎週火曜日の午後に、イーサリアム・オフィス・アワー(opens in a new tab)が開かれています。 この 1 対 1 の 1 時間のセッションで、セキュリティに関する質問をしたり、ツールを使ってトラブルシューティングをしたり、現在のアプローチについて専門家からフィードバックを得ることができます。 私たちが、このガイドに基づいてサポートします。

ぜひ、私たちのスタックであるEmpire Hacking(opens in a new tab)に参加してください。 質問があれば、いつでも#crytic チャンネルと#ethereum チャンネルにお問い合わせください。

最終編集者: @HiroyukiNaito(opens in a new tab), Invalid DateTime

このチュートリアルは役に立ちましたか?