Skip to content

feat(tcfeed): say that the workflow verifies the hash, not just the pin - #135

Merged
ralyodio merged 1 commit into
masterfrom
worktree-tcfeed-say-integrity
Aug 14, 2026
Merged

feat(tcfeed): say that the workflow verifies the hash, not just the pin#135
ralyodio merged 1 commit into
masterfrom
worktree-tcfeed-say-integrity

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The integrity check shipped in #134 and profullstack/sh1pt#959. The request body never mentioned it — so the strongest supply-chain answer we have was invisible to exactly the people who asked for it.

That isn't cosmetic. Every decline on this workflow so far has been about the install, not the scanner:

  • SonarCloud failed a quality gate on githubactions:S8543
  • CodeRabbit scored a request Moderate for handing an unpinned scanner a write-scoped job
  • Haven's maintainer declined with: "whoever can publish that package can run code in this repository's CI from that point on, forever, without a further PR" — and named the remedy exactly: "pinning to an exact version + integrity hash would address that specific objection"

We now do both halves and were still describing only the first.

What the paragraph says now

The CLI is pinned to @profullstack/threatcrush@0.11.0, and the workflow does not install it on the registry's word. It downloads that tarball, hashes it, checks the SHA-512 against a value committed in the workflow file, and refuses to install on a mismatch. A pinned version says which release to fetch; it does not say the bytes are the ones that release was published with, and the party answering the first question is the party serving the bytes. You can check the pinned hash against the registry yourself with npm view @profullstack/threatcrush@0.11.0 dist.integrity.

The verification command is deliberate: a claim a reviewer can check in one line is worth more than one they have to take on trust — which is the entire argument the paragraph is making.

Scope

Does not touch the 45 requests already open. Their workflow files can be brought up to the current pack with check --fix; their bodies are prose sitting in somebody else's notification feed, and rewriting 45 of those is noise rather than a fix.

Verified by rendering a dry run.

🤖 Generated with Claude Code

The integrity check shipped in #134 and sh1pt#959. The request body never
mentioned it, so the strongest supply-chain answer we have was invisible
to the people who asked for it.

That is not a cosmetic gap. Every decline on this workflow so far has
been about the install, not the scanner: SonarCloud on githubactions:S8543,
CodeRabbit scoring a request Moderate for handing an unpinned scanner a
write-scoped job, and Haven's maintainer declining with

  whoever can publish that package can run code in this repository's CI
  from that point on, forever, without a further PR

and naming the remedy exactly — "pinning to an exact version + integrity
hash would address that specific objection". We now do both halves and
were still describing only the first.

The paragraph now says what actually happens: the tarball is downloaded,
hashed, checked against a value committed in the workflow file, and not
installed on a mismatch. It also gives the reader the command to check
that value against the registry themselves, because a claim a reviewer
can verify in one line is worth more than one they have to take on trust
— which is the whole argument the paragraph is making.

Does not touch the 45 requests already open. Their workflow files can be
brought up to the current pack with `check --fix`; their bodies are
prose in somebody else's notification feed and are left alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

67 finding(s)

HIGH/CRITICAL: 11 | MEDIUM: 55 | LOW: 1

Severity Rule Location
HIGH secret-aws-access-key prd/0003-detect-hardcoded-secrets-before-they-are-committed-or-served.md:126
HIGH sh-eval-expansion .githooks/pre-commit:26
HIGH sh-remote-script-execution apps/web/public/install.sh:272
HIGH sh-remote-script-execution apps/web/public/install.sh:320
HIGH secret-generic-credential modules/spend-guard/config/example.conf.toml:13
HIGH secret-generic-credential modules/spend-guard/README.md:84
HIGH secret-generic-credential PRD.md:268
HIGH tls-verification-disabled prd/0004-find-dangerous-code-patterns-without-pretending-to-be-a-compiler.md:121
HIGH tls-verification-disabled prd/0004-find-dangerous-code-patterns-without-pretending-to-be-a-compiler.md:122
HIGH sh-remote-script-execution scripts/smoke-test.sh:46
HIGH sh-remote-script-execution scripts/smoke-test.sh:47
MEDIUM insecure-temp-file .githooks/commit-msg:16
MEDIUM insecure-temp-file .githooks/post-commit:20
MEDIUM js-shell-exec-interpolation apps/cli/src/commands/init.ts:70
MEDIUM js-shell-exec-interpolation apps/cli/src/commands/init.ts:79
MEDIUM js-shell-exec-interpolation apps/cli/src/commands/service.ts:88
MEDIUM js-shell-exec-interpolation apps/cli/src/commands/service.ts:111
MEDIUM sql-template-interpolation apps/cli/src/core/state.ts:121
MEDIUM sql-template-interpolation apps/cli/src/core/state.ts:125
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:31
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:33
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:34
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:35
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:36
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:43
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:49
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:56
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:63
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:82
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:84
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:85
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:93
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:98
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:105
MEDIUM js-shell-exec-interpolation apps/cli/src/daemon/firewall/adapters.ts:112
MEDIUM js-shell-exec-interpolation apps/cli/src/index.ts:419
MEDIUM js-unescaped-html-sink apps/web/src/app/about/page.tsx:180
MEDIUM js-unescaped-html-sink apps/web/src/app/about/page.tsx:184
MEDIUM js-open-redirect apps/web/src/app/auth/login/page.tsx:50
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:125
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:153
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:157
MEDIUM js-unescaped-html-sink apps/web/src/app/get-whitepaper/page.tsx:346
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:211
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:215
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:219
MEDIUM js-unescaped-html-sink apps/web/src/app/page.tsx:120
MEDIUM js-unescaped-html-sink apps/web/src/app/store/[slug]/page.tsx:107
MEDIUM js-open-redirect apps/web/src/components/funding/FundingClient.tsx:97
MEDIUM manifest-install-lifecycle-script package.json:24

…and 17 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit 05a3b6d into master Aug 14, 2026
11 checks passed
@ralyodio
ralyodio deleted the worktree-tcfeed-say-integrity branch August 14, 2026 01:35
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