Skip to content

Verify package attestations and enforce provenance policies in pub get/upgrade - #4875

Draft
mosuem wants to merge 6 commits into
publish-with-attestationfrom
verify-sigstore-attestation
Draft

Verify package attestations and enforce provenance policies in pub get/upgrade#4875
mosuem wants to merge 6 commits into
publish-with-attestationfrom
verify-sigstore-attestation

Conversation

@mosuem

@mosuem mosuem commented Aug 19, 2026

Copy link
Copy Markdown
Member

Client-side Ingestion & Cryptographic Verification on pub get / upgrade

When downloading packages in HostedSource, queries the repository for GET /api/packages/<pkg>/versions/<ver>/attestation and runs PubAttestationVerifier against the cached or embedded Sigstore trusted_root.json:

  1. Lockfile & Downgrade Prevention: ProvenancePolicy.enforcePolicy() blocks downgrades from signed to unsigned packages and detects repository switches across versions.
  2. Archive SHA-256 Digest: Verifies downloaded .tar.gz SHA-256 hash matches the in-toto subject digest in the attestation.
  3. Package Name & Version: Verifies in-toto subject name matches the requested <package>-<version>.tar.gz.
  4. DSSE Envelope & PAE Signatures: Validates signatures over DSSE Pre-Authentication Encoding.
  5. Fulcio Root CA Verification: Validates leaf certificate against trusted_root.json Fulcio Root CAs.
  6. Rekor Transparency Log Proof: Verifies Rekor inclusion proof against active public keys in trusted_root.json.
  7. GitHub Actions OIDC Issuer: Enforces https://token.actions.githubusercontent.com issuer identity.
  8. Signer Workflow & Git Ref: Validates signer workflow ID, branch/tag ref, and commit SHA against SLSA provenance.
  9. Package Repository Binding: Verifies certificate repository matches pubspec.yaml's declared repository.

Tests

  • test/get/hosted/attestation_verification_test.dart
  • test/sigstore/verifier_test.dart
  • test/sigstore/trusted_root_test.dart
  • test/sigstore/lockfile_policy_test.dart

@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from ea5aaba to c218fa1 Compare August 19, 2026 15:19
@mosuem mosuem changed the title Support package attestations in client publish and get/upgrade Verify package attestations and enforce provenance policies in pub get/upgrade Aug 19, 2026
@mosuem
mosuem changed the base branch from master to publish-with-attestation August 19, 2026 15:20
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch 3 times, most recently from 79adede to 47dde5e Compare August 24, 2026 12:18
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 47dde5e to 28c09b4 Compare August 24, 2026 12:22
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 28c09b4 to dc37a88 Compare August 24, 2026 12:40
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch 3 times, most recently from b1dc5ea to 2d3e6e9 Compare August 24, 2026 12:59
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 2d3e6e9 to e397ce2 Compare August 24, 2026 13:04
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch 2 times, most recently from d3c6c4a to e0c3456 Compare August 24, 2026 15:05
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from e0c3456 to c33ac01 Compare August 24, 2026 15:40
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from c33ac01 to d6008e4 Compare August 24, 2026 15:46
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch 2 times, most recently from 547c547 to 2f0bd9e Compare August 24, 2026 15:53
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 4f20ae6 to 47ffef5 Compare August 25, 2026 16:11
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 47ffef5 to 08f7ffb Compare August 26, 2026 11:06
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 08f7ffb to 6363412 Compare August 27, 2026 08:07
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 6363412 to f888ac9 Compare August 27, 2026 08:17
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from f888ac9 to 3eb3deb Compare August 27, 2026 09:15
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 3eb3deb to 70d774f Compare August 27, 2026 12:07
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 70d774f to 90f3bf1 Compare August 27, 2026 12:21
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 90f3bf1 to 95f8ad3 Compare August 27, 2026 12:37
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch 2 times, most recently from c4ff175 to e61d51f Compare August 28, 2026 11:14
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from e61d51f to 8761f5d Compare August 28, 2026 12:13
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 8761f5d to 5e81745 Compare August 28, 2026 12:49
@mosuem
mosuem force-pushed the verify-sigstore-attestation branch from 5e81745 to c41eb61 Compare August 31, 2026 13:58
mosuem added 6 commits August 31, 2026 14:15
Adds loadTrustedRoot() and loadTrustedRootJson() in package:pub to resolve
the Sigstore root of trust from:
1. Explicit override paths passed to the loader.
2. The PUB_SIGSTORE_TRUST_ROOT environment variable.
3. The built Dart SDK distribution at lib/_internal/sigstore/trusted_root.json.
4. The Dart SDK repository checkout at third_party/sigstore/trusted_root.json.
…t/upgrade

- Adds `package:sigstore` dependency from labs monorepo.
- Implements `PubAttestationVerifier` wrapping Sigstore attestation verifier.
- Fetches and cryptographically verifies Sigstore attestations during hosted downloads in `pub get` and `pub upgrade`.
- Enforces lockfile downgrade protection, SLSA provenance, digest match, and certificate roots.
- Adds comprehensive unit and integration tests.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant