Skip to content

fix(threatcrush-scan): pin the CLI to 0.11.2, which has the false-positive fix - #966

Merged
ralyodio merged 1 commit into
masterfrom
fix/threatcrush-pin-0-11-2
Aug 16, 2026
Merged

fix(threatcrush-scan): pin the CLI to 0.11.2, which has the false-positive fix#966
ralyodio merged 1 commit into
masterfrom
fix/threatcrush-pin-0-11-2

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Why

The pin protects consumers from a bad publish. It equally withholds a good one — and that side of it just bit.

Pack 1.6.0 pins @profullstack/threatcrush@0.11.0, which predates the false-positive work released in 0.11.2. So a repository on the newer pack gets the noisier scanner, while an older install tracking @latest gets the fixed one. That inversion is the whole reason this is worth a PR rather than a chore.

On qryptchat-web, measured:

findings HIGH
0.11.0 (what 1.6.0 pins) 91 5
0.11.2 (this PR) 13 0

All five HIGHs were false. Three flagged TOKEN="${TOKEN:-}" — a shell script reading a token out of the environment, i.e. the remediation reported as the defect. The one genuine finding in the original 91, a nested quantifier in a URL validator, is still reported.

The hash

Verified against the published tarball using the same pipeline the workflow runs, rather than trusting npm view alone:

npm pack @profullstack/threatcrush@0.11.2
openssl dgst -sha512 -binary profullstack-threatcrush-0.11.2.tgz | openssl base64 -A

Computed and registry-reported values match:

sha512-8N3jqCQixK0Onc+/bvuJaNCSvGZlJYZcSAGsd1nEfRZ4kOu1Ifom7Bd1t2muYJAmAxBTPmz1iseWSay/0gg3Gw==

Guard against the next one

threatcrushPackageSpec and threatcrushIntegrity must move together — a hash left behind from the previous version fails closed, which is the right direction to fail and a thoroughly confusing one to debug from a job log.

Added a test that both are present and well-formed, and that the README's inputs table quotes the same version the manifest pins. A stale table is exactly how someone bumps the spec while reading the old version's hash. I confirmed the test fails when the spec is moved on its own, so it isn't vacuous.

The README also now documents that a pinned pack does not receive scanner fixes until this pin moves — a scanner release isn't finished until it does.

Verification

  • pnpm vitest run packages/actions85 passed.
  • pnpm --filter @profullstack/sh1pt-action-packs typecheck — clean.

Pack version 1.6.01.6.1 so the fleet re-syncs consumers.

🤖 Generated with Claude Code

…itive fix

The pin protects consumers from a bad publish. It equally withholds a
good one, and that side of it just bit: pack 1.6.0 pinned 0.11.0, which
predates the false-positive work released in 0.11.2. A consumer on the
newer pack got the noisier scanner while an older install tracking
@latest got the fixed one.

On qryptchat-web that is 91 findings versus 13, and five spurious HIGHs
versus none. All five were false — three flagged TOKEN="${TOKEN:-}", a
shell reading a token from the environment, which is the remediation
reported as the defect.

Verified the hash against the published tarball with the same pipeline
the workflow uses, rather than copying it from `npm view` alone:

  npm pack @profullstack/threatcrush@0.11.2
  openssl dgst -sha512 -binary *.tgz | openssl base64 -A

Both match sha512-8N3jqCQixK0Onc+/bvuJaNCSvGZlJYZcSAGsd1nEfRZ4kOu1Ifom
7Bd1t2muYJAmAxBTPmz1iseWSay/0gg3Gw==.

Adds a test that the spec and the hash cannot drift apart, and that the
README quotes the same version the manifest pins — a stale table is how
someone bumps the spec while reading the previous version's hash, and a
mismatched hash fails closed with a job log that does not say why.
Confirmed the test fails when the spec is moved on its own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

84 finding(s)

HIGH/CRITICAL: 24 | MEDIUM: 51 | LOW: 9

Severity Rule Location
HIGH secret-generic-api-key packages/affiliates/sovrn/src/index.ts:28
HIGH js-nosql-injection packages/ai/amazon-bedrock/src/index.test.ts:121
HIGH secret-generic-credential packages/ai/amazon-bedrock/src/index.ts:9
HIGH secret-generic-credential packages/ai/amazon-bedrock/src/index.ts:10
HIGH secret-generic-credential packages/ai/amazon-bedrock/src/index.ts:11
HIGH js-host-header-trust packages/bots/wechat/src/index.ts:405
HIGH secret-generic-credential packages/bridges/matrix/src/index.ts:58
HIGH secret-generic-credential packages/bridges/matrix/src/index.ts:59
HIGH secret-generic-credential packages/captcha/captchasolver/src/index.ts:34
HIGH secret-generic-credential packages/cli/src/commands/secrets.ts:176
HIGH secret-generic-credential packages/cloud/linode/src/index.ts:15
HIGH secret-generic-credential packages/observability/sentry/src/index.ts:15
HIGH secret-generic-credential packages/outreach/producthunt/src/index.ts:103
HIGH secret-generic-credential packages/promo/posthog/src/index.ts:23
HIGH secret-generic-credential packages/security/snyk/src/index.ts:26
HIGH secret-generic-credential packages/social/hashnode/src/index.ts:4
HIGH secret-generic-credential packages/social/linkedin/src/index.ts:3
HIGH secret-generic-credential packages/social/linkedin/src/index.ts:4
HIGH secret-generic-credential packages/social/medium/src/index.ts:4
HIGH secret-generic-credential packages/social/snapchat/src/index.ts:5
HIGH secret-generic-credential packages/social/tiktok/src/index.ts:5
HIGH secret-generic-credential packages/targets/registry-ans/src/index.ts:49
HIGH secret-generic-credential sites/sh1pt.com/supabase/config.toml:303
HIGH secret-generic-credential sites/sh1pt.com/supabase/config.toml:335
MEDIUM redos-nested-quantifier packages/actions-fleet-core/src/action-pack/schema.ts:3
MEDIUM insecure-temp-file packages/agent-providers/opencode/src/__tests__/opencode.test.ts:19
MEDIUM insecure-temp-file packages/agent-providers/opencode/src/__tests__/opencode.test.ts:42
MEDIUM insecure-temp-file packages/agent-providers/opencode/src/__tests__/opencode.test.ts:45
MEDIUM insecure-temp-file packages/bridges/signal/src/index.test.ts:92
MEDIUM insecure-temp-file packages/bridges/signal/src/index.test.ts:118
MEDIUM insecure-temp-file packages/cli/src/input.test.ts:84
MEDIUM redos-nested-quantifier packages/core/src/setup-helpers.ts:583
MEDIUM insecure-temp-file packages/core/src/testing/harness.ts:15
MEDIUM insecure-temp-file packages/core/src/testing/harness.ts:16
MEDIUM insecure-temp-file packages/core/src/testing/harness.ts:30
MEDIUM insecure-temp-file packages/core/src/testing/harness.ts:42
MEDIUM insecure-temp-file packages/merch/printful/src/index.test.ts:9
MEDIUM insecure-temp-file packages/merch/printify/src/index.test.ts:11
MEDIUM insecure-temp-file packages/policy/src/linter.test.ts:8
MEDIUM redos-nested-quantifier packages/policy/src/rules/bundle-id.ts:3
MEDIUM insecure-temp-file packages/secrets/env-updater/src/index.test.ts:106
MEDIUM insecure-temp-file packages/social/facebook/src/index.test.ts:95
MEDIUM insecure-temp-file packages/social/instagram/src/index.test.ts:177
MEDIUM insecure-temp-file packages/social/pinterest/src/index.test.ts:91
MEDIUM insecure-temp-file packages/social/pinterest/src/index.test.ts:146
MEDIUM insecure-temp-file packages/social/threads/src/index.test.ts:108
MEDIUM insecure-temp-file packages/social/vimeo/src/index.test.ts:137
MEDIUM insecure-temp-file packages/social/x/src/index.test.ts:72
MEDIUM insecure-temp-file packages/social/x/src/index.test.ts:116
MEDIUM insecure-temp-file packages/targets/browser-safari/src/index.test.ts:22

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

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit 645fdd5 into master Aug 16, 2026
8 checks passed
ralyodio added a commit that referenced this pull request Aug 16, 2026
#966 landed the same version bump from the other direction — 0.11.0 -> 0.11.2
with the identical integrity hash — while this branch was open. The only
conflict was the pack version line, and it is a conflict about arithmetic
rather than about content: master said 1.6.1 for the pin, this says 1.7.0 for
removing a file the pack installs. Removing an installed file is the larger
change, so 1.7.0 stands and subsumes the patch bump.

Nothing else disagreed. Both sides wrote the same spec and the same hash,
which is the reassuring outcome — two people reading `npm view` got the same
answer.
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