一般的なベストプラクティス
セキュリティが妥当であればクエリレスポンスを認証します
セキュリティ上の懸念事項
クエリコール へのレスポンスは(アップデートコールとは対照的に)、Canister / Subnet(サブネット)によって閾値署名されません。したがって、悪意のある単一のレプリカまたはバウンダリノードがデータを変更し、その真正性を侵害する可能性があります。これは、アップデートコールがクエリコールへのレスポンスに依存している場合、特に危険なことです。
推奨
-
真正性の保証が必要なセキュリティ関連のクエリレスポンスデータ(これは各 Dapp について評価する必要があります)は、すべて認証変数(certified variable)を使用して IC によって認証されるべきです。certified-map などの既存のデータ構造の利用を検討してください。データの認証は、フロントエンドで検証する必要があります。
-
あるいは、これらの呼び出しは呼び出し側でアップデートコールとして発行されなければなりませんが(例えば agent-js で)、これはパフォーマンスに影響を与えます(具体的には、数秒かかります)。すべてのクエリは呼び出し側でアップデート(コール)として発行できることに注意してください。
-
サンプルは Internet Identity 、NNS dApp や Internet Identityの Canister 署名実装 などのアセット認証です。
Internet Computer に特有ではないもの
このセクションのベストプラクティスは、非常に一般的なものであり、Internet Computer に特化したものではありません。このリストは決して完全なものではなく、過去に問題になった非常に具体的な懸念事項をいくつか挙げているに過ぎません。
脆弱性が知られているサードパーティ製コンポーネントを使用しない
セキュリティ上の懸念事項
脆弱で古いコンポーネントを使用することは、大きなセキュリティリスク です。
推奨
-
サードパーティ製コンポーネントは既知の脆弱性のデータベースと定期的に照合します。
-
Rust: cargo audit を使用します。
-
JavaScript / NPM: npm audit を使用します。
-
これはビルドプロセスに統合されるべき話ですが、既知の脆弱性がある場合、ビルドは失敗させるべきです。
-
メンテナンスされておらず、信頼できない可能性のあるリポジトリのフォーク版を使わないでください。
-
広く使われておらず、十分な(理想的には第三者による)レビューを受けていない可能性のあるサードパーティコンポーネントの使用は避けてください。
-
使用しているコンポーネントのバージョンを固定し、自動的に破損したアップデートに切り替わらないようにします。
暗号を自分で実装しない
推奨
-
オープンソースで、多くの人がレビューしているよく知られたライブラリを使用します。例えば、JavaScript では Web Crypto API 、Rust では sha256 などの crate を使用しましょう。
安全な暗号化スキームを使用する
セキュリティ上の懸念事項
暗号スキームには、解読されて利用不可なもの(古い TLS バージョン、MD5、SHA1、DES など)や、新しすぎてまだ適切に研究されていないものがあります。これらを使用すると、セキュリティ上の問題が発生します。
コードをテストする
セキュリティ上の懸念事項
テストのカバー範囲が小さいと、コードの変更が難しくなり、正しさやセキュリティの特性に違反し、バグが発生する可能性があるためリスクが高いです。レビュー(およびセキュリティレビュー)において、対応するテストがない場合、正しさやセキュリティ特性を検証することは困難です。
推奨
Cainister の実装とフロントエンドのコードに対して、特にセキュリティ関連のプロパティと不変条件に対するテストを書きましょう。
-
Effective Rust Canisters の中で特に: test upgrades(テストアップグレード) 、make code target-independent(コードをターゲット非依存にする)
-
DFINITY Rust guidelines on testing(テストに関する DFINITY Rust のガイドライン) を検討してください。
-
wasm レベルのユニットテストには、Motoko Matchers の利用を検討してください。
-
Motoko レベルのユニットテストには、the Canister Module を検討してみてください。ここ と ここ にはテスト例もあります。例として、invoice canister のエンドツーエンドテストとユニットテストもご覧ください。
-
長期的なテストシナリオについては、Motoko BigTest を検討してください。