Surfaced by the expert-panel security review on #53 (CWE-494/CWE-829, MAJ).
The verify workflow SHA-pins its GitHub Actions but installs Python/npm verification dependencies with version pins only:
pip install cryptography==49.0.0 msgpack==1.2.1 lz4==4.4.5 — no --require-hashes, transitive deps (cffi, pycparser) fully unpinned, sdist fallback allowed.
npm install --ignore-scripts @noble/hashes@2.2.0 — no lockfile/integrity (mitigated by --ignore-scripts and zero transitive deps).
Blast radius is capped by permissions: contents: read + persist-credentials: false: a poisoned release can falsify the verify signal (this repo's ratification gate for a fleet-wide crypto contract), not write to the repo. Low likelihood, but the posture explicitly aims higher — the actions are already SHA-pinned.
Fix (repo-wide, pre-existing — predates #53, which only appended lz4 to the existing unpinned line):
tools/verify-requirements.txt with --require-hashes + --only-binary :all: (transitives included), used by the optional-deps step.
- Committed
package-lock.json + npm ci for the JS cross-check step.
- Check Renovate interplay so the pins stay maintained.
Surfaced by the expert-panel security review on #53 (CWE-494/CWE-829, MAJ).
The verify workflow SHA-pins its GitHub Actions but installs Python/npm verification dependencies with version pins only:
pip install cryptography==49.0.0 msgpack==1.2.1 lz4==4.4.5— no--require-hashes, transitive deps (cffi, pycparser) fully unpinned, sdist fallback allowed.npm install --ignore-scripts @noble/hashes@2.2.0— no lockfile/integrity (mitigated by--ignore-scriptsand zero transitive deps).Blast radius is capped by
permissions: contents: read+persist-credentials: false: a poisoned release can falsify the verify signal (this repo's ratification gate for a fleet-wide crypto contract), not write to the repo. Low likelihood, but the posture explicitly aims higher — the actions are already SHA-pinned.Fix (repo-wide, pre-existing — predates #53, which only appended
lz4to the existing unpinned line):tools/verify-requirements.txtwith--require-hashes+--only-binary :all:(transitives included), used by the optional-deps step.package-lock.json+npm cifor the JS cross-check step.