flawopen.com/リファレンス/Cosign の検証回避
Cosign GHSA-fx35-mq7g-6g98:旧形式 Bundle の検証回避
会場の入口でチケットと公的身分証の氏名を照合する場面を想像してください。脆弱な旧形式 Bundle の処理では、裸の鍵を身分証と取り違え、氏名確認を省いてチケットを受理する可能性がありました。署名は数学的に正しくても、必要なワークフロー ID は証明されていません。
Cosign の Blob 検証で起きたこと
GHSA-fx35-mq7g-6g98 は、旧形式 JSON `--bundle` を使い、ID と Issuer のフラグ(または正規表現版)を指定して keyless 検証する `cosign verify-blob` と `cosign verify-blob-attestation` に影響します。Bundle の `cert` フィールドを X.509 証明書として解析できない場合、影響を受けるバージョンは公開鍵として読み込むフォールバックを行いました。これにより内部の署名検証器が設定され、後続処理で証明書チェーン検証と `CheckCertificatePolicy` が省略され、ID と Issuer の制約が適用されませんでした。埋め込まれた鍵で署名が有効なら検証が成功する可能性があります。また Bundle 内の鍵が明示した `--key` を上書きする場合もありました。アドバイザリによると、コンテナイメージ検証と標準化された Sigstore protobuf Bundle の経路は影響を受けません。既知の CVE はなく、上流アドバイザリは High、CVSS 7.4、CWE-295、CWE-347 と評価しています。
検証回避の流れ
CI ジョブが成果物と旧形式 JSON Bundle を受け取る
成果物と Bundle はリリースワークフロー、キャッシュ、ミラーなどから届く可能性があります。ポリシー検査が終わるまでは、どちらも信頼できない入力として扱います。
脆弱なパーサーが証明書の代わりに鍵を受け入れる
影響を受けるバージョンでは X.509 の解析失敗を受けて公開鍵へのフォールバックが発生しました。署名検証器が設定され、keyless 検証の証明書ポリシーが省略されました。
必要なワークフロー ID を証明せずに署名検証が通る
固定した証明書 ID と OIDC Issuer を確認せずに検証が成功する可能性があります。終了コードだけを見るパイプラインは、未承認の成果物を使うおそれがあります。
修正済み Cosign と署名者 ID を固定する
両方の例で同じ GitHub Actions の正確な ID と OIDC Issuer を固定しています。脆弱なコマンドは影響を受ける Cosign を使用し、旧形式 JSON Bundle では検証を回避される可能性がありました。強化例は修正版と正規表現ではなく完全一致のオプションを使います。CI では確認済みのバージョンと digest で Cosign を固定してください。コマンドは成果物を検証し、悪意ある Bundle は作成も実演もしません。
# Risk: affected versions accept legacy JSON bundles in this path
# cosign v2.6.4 or earlier, or v3.1.2 or earlier
cosign verify-blob release.tar.gz \
--bundle release.sigstore.json \
--certificate-identity-regexp "^https://github\.com/acme/service/\.github/workflows/release\.yml@refs/heads/main$" \
--certificate-oidc-issuer-regexp "^https://token\.actions\.githubusercontent\.com$"
# Require Cosign v2.6.5+ or v3.1.3+ in the pinned CI toolchain
cosign verify-blob release.tar.gz \
--bundle release.sigstore.json \
--certificate-identity "https://github.com/acme/service/.github/workflows/release.yml@refs/heads/main" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
修正と展開のチェックリスト
- ✓`cosign verify-blob` または `cosign verify-blob-attestation` を実行する CI ジョブを棚卸しし、ダウンロード版やコンテナ内も含めて実際のバージョンを確認します。
- ✓影響を受ける v2 は v2.6.5 以降、v3 は v3.1.3 以降へ更新します。サポート中の版を選び、出所と digest を固定します。
- ✓想定する署名ワークフローに対して `--certificate-identity` と `--certificate-oidc-issuer` を正確に指定します。無関係な ID も許可する `.*` は避けます。
- ✓可能であれば旧形式 JSON Bundle を標準 Sigstore Bundle 形式へ移行します。アドバイザリでは同形式の検証経路は影響を受けないとされています。展開時にツールと版の挙動を確認します。
- ✓成果物と Bundle の provenance を対応付け、検証エラー時は失敗させ、同じ管理下のジョブで検証に成功した場合だけ公開します。
- ✓影響バージョンで検証後に公開・デプロイされた成果物がないか確認します。保存済み成果物を修正版 Cosign と所定の ID ポリシーで再検証し、provenance の不一致を調べます。
- Sigstore Cosign security advisory GHSA-fx35-mq7g-6g98
- Cosign fix PR #5040 — removal of raw-key fallback
- Sigstore CI Quickstart — keyless signing and verification
- Cosign releases — patched versions