セキュリティ機能は各プロジェクトがインストールするすべてのパッケージを一覧化し、公開されているアドバイザリと照合します。そのため、脆弱なバージョンはpull requestに導入された際、および既に利用中のバージョンが新たなアドバイザリで指摘された際に検出されます。
インベントリ
デフォルトブランチの新しいヘッドごと、および少なくとも1日1回、CoroidはプロジェクトのロックファイルをOSV-Scannerで読み込み、特定のバージョンに固定して公開されているチェックサムと照合します。このスキャナーが参照するのは依存関係ファイルと、Coroidが生成する設定のみで、ネットワークアクセスや認証情報は使用しません。リポジトリ自体のosv-scanner.tomlには影響がありません。
「セキュリティ」→「依存関係」画面には各プロジェクトのインベントリが表示されます。これにはパッケージとそのインストール済みバージョン、各パッケージを宣言しているマニフェスト、脆弱なもの、各ファイルのカバレッジ、最後にアドバイザリデータが読み込まれた日時が含まれます。エクスポート CycloneDXを選択すると、インベントリがCycloneDX 1.5形式のファイルとしてダウンロードされます。このファイルにはすでに公開されている脆弱性のみが記載されます。詳細は非公開。
Coroidが完全に読み込む対象
カバレッジはリポジトリ単位ではなくロックファイル単位で計算されます。モノレポの場合、各ロックファイルは独自のグループとなり、それぞれのカバレッジが独立しているため、あるロックファイルの結果が完全であっても、別のマニフェストが不完全な場合があります。
| ファイル | エコシステム | 正確なバージョン | 完全な遷移的依存関係 | カバレッジ |
|---|---|---|---|---|
package-lock.json | npm | はい | はい | 完全 |
npm-shrinkwrap.json | npm | はい | はい | 完全 |
pnpm-lock.yaml | npm | はい | はい | 完全 |
yarn.lock | npm | はい | はい | 完全 |
requirements.txt | PyPI | はい | いいえ | 部分的 |
go.mod | Go | はい | いいえ | 部分的 |
この表はCoroid自身のテストでスキャナーを通して生成されたものであり、テスト内容が変更されない限り更新されません。
- npmワークスペース、pnpm、Yarn:ワークスペースの
package.jsonで独自のロックファイルがない場合は、ルートのロックファイルが適用されます。また、package.jsonがロックファイルと一致しなくなった場合は、ロックファイルが再生成されるまで部分的とみなされます。 - npmのロックファイルはバージョン2または3である必要があります。Git、ローカルファイル、パッチから取得されたpnpmおよびYarnのエントリは部分的とみなされます。
requirements.txtは「==。- その他の依存関係ファイル (
package.jsonロックファイルがない場合、pyproject.toml、poetry.lock、Pipfile、Cargo.lock、Gemfile.lock、pom.xml、Gradle、Composer、NuGetなど)は検出されて部分的と表示され、該当ファイル名が示されます。これにより、カバレッジが不完全なプロジェクトが完全にカバーされていると誤認されることはありません。
アドバイザリ
CoroidはOSVからアドバイザリを読み込みます。OSVにはGitHubのアドバイザリも含まれており、プロジェクトが利用する各エコシステムに対応します。1時間ごとに最新または変更されたアドバイザリを読み込み、1日1回はすべてのアドバイザリを読み込みます。照合処理には保存済みのインベントリが使用されるため、リポジトリへのアクセスは不要です。
Coroidの目標は、新しいアドバイザリの95%を読み込んだインベントリと60分以内に照合することであり、各照合にかかった時間も測定します。ただし、脆弱性が最初に公開された時点からの時間を保証するものではありません。これはアドバイザリが公開されるタイミングに依存するためです。
アドバイザリデータの読み込みが90分以上遅延した場合、または最後の読み込みが失敗した場合、「概要」および「依存関係」画面には「アドバイザリフィードが…以降に遅延しています」と表示され、この間はどのプロジェクトのカバレッジも完全とはみなされません。
アドバイザリが撤回された場合、Coroidは残存するアドバイザリから同じ脆弱性に該当するものを再計算します。該当するアドバイザリがなくなった場合のみ「もはや適用されない」として問題が解消され、「修正済み」とは判定されません。
プルリクエスト上で
このCoroid Securityチェックでは、pull requestが変更したロックファイルのベース版とヘッド版をスキャンし、変更によって新たに導入される脆弱なバージョンの数のみをカウントします:
- 確認:チェックは合格するか、または検出された内容を記載して中立的な結果を報告します。
- 強制適用:選択した重大度(デフォルトでは「高」)以上の既知の脆弱性が含まれるバージョンを導入する変更は、このチェックに失敗します。また、変更対象のロックファイルのカバレッジが不十分な場合もチェックに失敗し、その理由と再実行方法が示されます。
Coroid自身の修正用および機能追加用のプルリクエストが開かれる前にも、同じチェックが実行されます。このチェックの動作方法、要件の設定方法、および再実行方法については、GitHubの権限とCoroidのセキュリティチェック。
通知
リポジトリの最初の完全なインベントリはサイレントなベースラインとなり、その結果はセキュリティ画面に表示されるだけで通知は送信されません。その後、新たに検出された重大な依存関係の問題がある場合、組織のオーナーおよび管理者に一度だけ通知が送信されます。メールが有効な場合はメールで、Slackが接続されている場合はSlackで通知が届きます。公開済みのアドバイザリーの場合は、パッケージ名とアドバイザリー内容が通知に記載されます。まだ公開されていない場合は、重大な問題に注意が必要であることのみが通知されます。詳細は開示。