一般的なベストプラクティス

セキュリティが妥当であればクエリレスポンスを認証します

セキュリティ上の懸念事項

クエリコール へのレスポンスは(アップデートコールとは対照的に)、Canister / Subnet(サブネット)によって閾値署名されません。したがって、悪意のある単一のレプリカまたはバウンダリノードがデータを変更し、その真正性を侵害する可能性があります。これは、アップデートコールがクエリコールへのレスポンスに依存している場合、特に危険なことです。

推奨

  • 真正性の保証が必要なセキュリティ関連のクエリレスポンスデータ(これは各 Dapp について評価する必要があります)は、すべて認証変数(certified variable)を使用して IC によって認証されるべきです。certified-map などの既存のデータ構造の利用を検討してください。データの認証は、フロントエンドで検証する必要があります。

  • あるいは、これらの呼び出しは呼び出し側でアップデートコールとして発行されなければなりませんが(例えば agent-js で)、これはパフォーマンスに影響を与えます(具体的には、数秒かかります)。すべてのクエリは呼び出し側でアップデート(コール)として発行できることに注意してください。

  • サンプルは Internet IdentityNNS dAppInternet Identityの Canister 署名実装 などのアセット認証です。

Internet Computer に特有ではないもの

このセクションのベストプラクティスは、非常に一般的なものであり、Internet Computer に特化したものではありません。このリストは決して完全なものではなく、過去に問題になった非常に具体的な懸念事項をいくつか挙げているに過ぎません。

脆弱性が知られているサードパーティ製コンポーネントを使用しない

セキュリティ上の懸念事項

脆弱で古いコンポーネントを使用することは、大きなセキュリティリスク です。

推奨

  • サードパーティ製コンポーネントは既知の脆弱性のデータベースと定期的に照合します。

  • Rust: cargo audit を使用します。

  • JavaScript / NPM: npm audit を使用します。

  • これはビルドプロセスに統合されるべき話ですが、既知の脆弱性がある場合、ビルドは失敗させるべきです。

  • メンテナンスされておらず、信頼できない可能性のあるリポジトリのフォーク版を使わないでください。

  • 広く使われておらず、十分な(理想的には第三者による)レビューを受けていない可能性のあるサードパーティコンポーネントの使用は避けてください。

  • 使用しているコンポーネントのバージョンを固定し、自動的に破損したアップデートに切り替わらないようにします。

暗号を自分で実装しない

セキュリティ上の懸念事項

暗号アルゴリズムの実装ではミスが発生しやすく、セキュリティバグが発生しやすいです。

推奨

  • オープンソースで、多くの人がレビューしているよく知られたライブラリを使用します。例えば、JavaScript では Web Crypto API 、Rust では sha256 などの crate を使用しましょう。

安全な暗号化スキームを使用する

セキュリティ上の懸念事項

暗号スキームには、解読されて利用不可なもの(古い TLS バージョン、MD5、SHA1、DES など)や、新しすぎてまだ適切に研究されていないものがあります。これらを使用すると、セキュリティ上の問題が発生します。

推奨

暗号を使用する必要がある場合は、解読されておらず、既知の問題がない暗号スキームのみを使用することです。NIST や IETF などで標準化されたアルゴリズムを使用するのが理想的です。

参照:

コードをテストする

セキュリティ上の懸念事項

テストのカバー範囲が小さいと、コードの変更が難しくなり、正しさやセキュリティの特性に違反し、バグが発生する可能性があるためリスクが高いです。レビュー(およびセキュリティレビュー)において、対応するテストがない場合、正しさやセキュリティ特性を検証することは困難です。

推奨

Cainister の実装とフロントエンドのコードに対して、特にセキュリティ関連のプロパティと不変条件に対するテストを書きましょう。

本番環境でのテストコードや開発コードの使用を避ける

セキュリティ上の懸念事項

開発用やテスト用のセットアップにしか使われていないコードパスを本番用のコードに含めるのは危険です。何か問題が発生した場合(時に発生します!)、本番環境にセキュリティバグを持ち込む可能性があるからです。

例えば、認証を確認するための公開鍵が信頼されていないソースから取得された問題の報告があります。

推奨

可能な限り、プロダクションコードにテストコードや開発コードが含まれないようにしましょう。