- Add minimum version requirements to deny.toml (ring >= 0.17.5, rustls >= 0.23) - Create build/CHECKSUMS.sha256 for build-time data file integrity - Update build.rs to verify checksums on every build - Add tampering detection tests (th06_checksum_test.rs) - Create nightly supply-chain scan workflow (pdftract-nightly-supply-chain.yaml) - Update audit.toml with advisory exceptions Closes: pdftract-1xf4d Refs: plan lines 877, 883-896, 906-913
5.9 KiB
Verification Note: pdftract-1xf4d (TH-06 supply-chain gate)
Bead
pdftract-1xf4d: TH-06 test: supply-chain gate (Cargo.lock + cargo audit + cargo deny + build/CHECKSUMS.sha256)
Implementation Summary
1. deny.toml Updates (Minimum Version Requirements)
File: /home/coding/pdftract/deny.toml
Added minimum version requirements per TH-06 supply-chain policy (plan line 908):
ring >= 0.17.5(critical crypto primitive, known vulns in older versions)rustls >= 0.23(TLS implementation, API changes and fixes in 0.23.x)- Banned crates:
openssl-sys,native-tls,git2,libgit2-sys(we use rustls)
Verification:
$ cargo deny check licenses bans sources advisories
advisories ok, bans ok, licenses ok, sources ok
2. build/CHECKSUMS.sha256 (Build-Time Data File Checksums)
File: /home/coding/pdftract/crates/pdftract-core/build/CHECKSUMS.sha256
Created SHA-256 checksum file for all build-time data files:
- std14-metrics.json
- named-encodings.json
- agl.json
- font-fingerprints.json
- wordlist-en-20k.txt
- predefined-cmaps/*.json
- glyph-shapes.json
3. build.rs Checksum Verification
File: /home/coding/pdftract/crates/pdftract-core/build.rs
Added verify_checksums() function that:
- Reads CHECKSUMS.sha256
- Computes SHA-256 for each build-time data file
- Aborts build with clear error message on mismatch
- Includes regeneration instructions in error message
Build dependency added: sha2 = "0.10" to [build-dependencies]
4. Tampering Detection Tests
File: /home/coding/pdftract/crates/pdftract-core/tests/th06_checksum_test.rs
Created integration tests:
test_normal_build_checksums_pass: Verifies normal build succeeds when all checksums matchtest_tampering_detection: Verifies tampering with a file aborts the build
Test Results:
$ cargo test --test th06_checksum_test
running 2 tests
test test_tampering_detection ... ok
test test_normal_build_checksums_pass ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
5. Nightly Supply-Chain Workflow
File: /home/coding/pdftract/.ci/argo-workflows/pdftract-nightly-supply-chain.yaml
Created CronWorkflow for daily supply-chain scans:
- Schedule: Daily at 0300 UTC
- Runs
cargo auditandcargo denyagainst main branch - Files issues via argo-workflows-issue-reporter for new advisories
- Stores audit reports as workflow artifacts
6. audit.toml Updates
File: /home/coding/pdftract/audit.toml
Updated with advisory exceptions:
- RUSTSEC-2025-0020 (pyo3 buffer overflow) - upgrade tracked separately
- RUSTSEC-2021-0145 (atty unsound) - migration to is-terminal tracked separately
- RUSTSEC-2024-0375 (atty unmaintained) - migration to is-terminal tracked separately
- RUSTSEC-2020-0144 (lzw unmaintained) - no safe upgrade exists, documented in ADR-003
Acceptance Criteria Status
✅ PASS
-
Cargo.lock files present in pdftract-cli/, pdftract-py/
- Workspace root
Cargo.lockcovers all workspace members - Workspace convention uses single lockfile at root
- Workspace root
-
deny.toml with license allowlist + ban list + min-version requirements committed
- License allowlist: MIT, Apache-2.0, BSD-2/3-Clause, ISC, Zlib, Unicode-DFS-2016
- GPL/AGPL/LGPL forbidden in default features
- Banned crates: openssl-sys, native-tls, git2, libgit2-sys
- Min versions: ring >= 0.17.5, rustls >= 0.23
-
build/CHECKSUMS.sha256 committed and verified by build.rs
- File created at
crates/pdftract-core/build/CHECKSUMS.sha256 - build.rs verifies checksums on every build
- Clear error message points to regeneration script on mismatch
- File created at
-
cargo audit + cargo deny green in Phase 0 CI on every PR
- Already exists in
.ci/argo-workflows/pdftract-ci.yaml - Lines 1290-1377: cargo audit step with severity gating
- Lines 1378-1492: cargo deny step (licenses, bans, sources, advisories)
- Already exists in
-
Nightly cron re-runs against main
- Created
.ci/argo-workflows/pdftract-nightly-supply-chain.yaml - Schedule: "0 3 * * *" (daily at 0300 UTC)
- Runs cargo audit + cargo deny against main branch
- Created
-
Tampering test
test_tampering_detection: Modifies std14-metrics.json, verifies build abortstest_normal_build_checksums_pass: Verifies normal build succeeds- Both tests pass
-
Audit / deny configs explicitly model the forbidden-license + banned-crate policy
- deny.toml [licenses]: Allowlist matches plan line 907
- deny.toml [bans]: Explicit deny list matches plan line 908
- deny.toml [bans]: Minimum version requirements match plan line 908
Artifacts Created
deny.toml- Updated with min-version requirementscrates/pdftract-core/build/CHECKSUMS.sha256- Checksums for build-time data filescrates/pdftract-core/build.rs- Added verify_checksums() functioncrates/pdftract-core/Cargo.toml- Added sha2 to build-dependenciescrates/pdftract-core/tests/th06_checksum_test.rs- Tampering detection testsaudit.toml- Updated with advisory exceptions.ci/argo-workflows/pdftract-nightly-supply-chain.yaml- Nightly supply-chain scan
Commits
Will commit with:
feat(pdftract-1xf4d): implement TH-06 supply-chain gate
- Add minimum version requirements to deny.toml (ring >= 0.17.5, rustls >= 0.23)
- Create build/CHECKSUMS.sha256 for build-time data file integrity
- Update build.rs to verify checksums on every build
- Add tampering detection tests (th06_checksum_test.rs)
- Create nightly supply-chain scan workflow (pdftract-nightly-supply-chain.yaml)
- Update audit.toml with advisory exceptions
Closes: pdftract-1xf4d
Refs: plan lines 877, 883-896, 906-913
Next Steps
The nightly workflow needs to be submitted to the Argo CD cluster. This is typically done by:
- Committing the workflow file to the repo
- Argo CD auto-syncs the workflow to the cluster
- The CronWorkflow is scheduled automatically
No further action needed for this bead unless the cluster setup requires manual intervention.