Supply-Chain Lockdown

claude-jacked release audit

Date: 2026-09-03 Mode: baseline audit Branch: master Worktree: primary checkout

Score and posture

67
Critical gaps remain

Measured coverage: 6 of 11 applicable categories (55%). Missing scanners cap confidence below Hardened.

Category breakdown

Supply-chain control status
CategoryStatusEvidence
Lockfile integritydangeruv.lock is current and all 61 registry packages are hashed, but publish build tools are installed outside the lock.
Dependency CVEsunknownpip-audit and osv-scanner are unavailable.
Malware / typosquatunknownSocket is unavailable; registry provenance for the full closure was not independently checked.
CI / Actions hardeningokAll third-party Actions use 40-character SHAs with version comments. Permissions are explicit, checkout credentials are not persisted, and Harden Runner is present.
Secrets hygieneunknownRedacted heuristic scan found no production secret literal and .gitignore covers common secret files. Gitleaks is unavailable.
Provenance and signingokPyPI Trusted Publishing uses job-scoped OIDC; the pinned publisher produces attestations. The build uploads a CycloneDX SBOM.
Container hardeningn/aNo container build is present.
Pre-commit and ScorecardwarnPre-commit includes Gitleaks, actionlint, and zizmor. Scorecard is unavailable and CVE scanning is not a required CI job.

Ecosystem inventory

Detected ecosystems and checks
EcosystemInputsResult
Python / uvpyproject.toml, uv.lockuv lock --check passed; 1,457 SHA-256 entries; zero unhashed registry packages.
GitHub Actionstests.yml, publish.ymlSHA-pinned actions, least-privilege permissions, Harden Runner, frozen test execution, Trusted Publishing.
Dependency automationdependabot.ymlWeekly updates with a 7-day default cooldown.
Local gates.pre-commit-config.yamlSecret and workflow checks configured; local tool availability not assumed.

Findings

CRITICAL SCSC-2026-001: publish build dependencies bypass the committed lock

Evidence: .github/workflows/publish.yml:32-33 upgrades pip and installs build hatchling cyclonedx-bom twine from the live registry without exact versions or a frozen, hashed requirements set.

Risk: an attacker who compromises any selected build-tool release can execute code in the artifact-building job and alter the wheel that the separate OIDC job publishes.

Remediation: declare the release toolchain in a locked dependency group, run it with uv run --frozen, and keep the build and OIDC publish jobs separated. This audit did not change the publish workflow.

HIGH SCSC-2026-002: Starlette has no upper bound

Evidence: pyproject.toml:35 declares starlette>=0.48, while the other production dependencies use upper bounds.

Risk: an attacker who publishes a malicious or incompatible future major release could be selected by downstream fresh resolution even though this repository's current lock is safe.

Remediation: choose and test an upper bound in a dedicated dependency update. Lockdown never changes dependency manifests automatically.

MEDIUM SCSC-2026-003: no required CVE scanner runs in CI

Evidence: the two workflows run tests and publish, but neither runs pip-audit or osv-scanner. The local pre-commit configuration covers secrets and workflow lint only.

Risk: a known vulnerable transitive dependency can remain in the release lock until a human notices it.

Remediation: add a locked, blocking CVE scan over uv.lock on pull requests and a scheduled cadence.

Remediation plan

Manual verification

Not evaluated: AI model deserialization and IDE extension supply chains.