Skip to content

fix: Correct and bound the GO-2026-5932 osv-scanner suppression - #1393

Merged
noahbjohnson merged 2 commits into
mainfrom
fix/osv-scanner-suppression-review
Oct 14, 2026
Merged

noahbjohnson merged 2 commits into
mainfrom
fix/osv-scanner-suppression-review

Conversation

@isaacschepp

Copy link
Copy Markdown
Collaborator

What and why

A review of osv-scanner.toml found seven problems with the GO-2026-5932 suppression and the tooling around it. The suppression itself still holds: no golang.org/x/crypto/openpgp package is in the build graph, including test imports on linux, darwin and windows.

  • Wrong reason. The entry said x/crypto is reached "only through go-git, which uses hkdf". The graph actually uses ssh, ssh/agent, ssh/knownhosts, bcrypt_pbkdf/blowfish (go-git SSH transport, skeema/knownhosts, xanzy/ssh-agent), cast5, argon2, sha3, hkdf (ProtonMail/go-crypto/openpgp), and cryptobyte, curve25519, chacha20, blake2b and internals. The reason now lists these with their importers.
  • No expiry. Added ignoreUntil = 2027-04-14 so renewal (and re-verification) is forced.
  • ID-only match. osv-scanner can't scope an ignore to a Go package. The toml and SECURITY-POSTURE.md now record this limit, name govulncheck as the backstop, and say to re-read the advisory's package list before renewing.
  • Weak re-verify command. It is now go list -deps -test ./... across GOOS linux/darwin/windows.
  • Undocumented consumer. The header now names scripts/filter-govulncheck-sarif.py. The filter honours ignoreUntil, using osv-scanner's same-day expiry, and exits with an error on keys it doesn't implement (e.g. [[PackageOverrides]]) and on entries without id, instead of silently diverging or raising a KeyError.
  • Duplicated rationale. SECURITY-POSTURE.md no longer repeats the entry's reasoning. It states the expiry rule and points at the toml.
  • ci-tools scope. osv-scanner applies a config only to manifests in its own directory, so the root file covers ./go.mod alone. The header says ci-tools/go.mod is scanned unsuppressed (it doesn't depend on x/crypto) and where a future suppression for it would go.

Related issues

None. Follow-up to a code review of osv-scanner.toml (introduced in #1262, extended to govulncheck in #1341).

Review focus

Correctness of the dependency attribution in the reason, and the filter's expiry/validation semantics.

Testing

  • go list -deps -test ./... for linux/darwin/windows: no x/crypto/openpgp. Per-package importers checked with go list -f.
  • Ran the filter against a synthetic SARIF with the real config (module-level note dropped, warning kept), an expired entry (nothing dropped), a datetime ignoreUntil, an entry with no id, a [[PackageOverrides]] block and a non-date ignoreUntil. The last three exit 1 with a clear message.
  • make check-links passes.

Breaking changes

None.

🤖 Generated with Claude Code

The suppression reason claimed golang.org/x/crypto is reached only through
go-git's use of hkdf; the build graph also uses ssh, ssh/agent,
ssh/knownhosts, blowfish, cast5, argon2, sha3 and more. List them with their
importers, and say none is openpgp.

Give the entry an ignoreUntil expiry so renewal is forced, strengthen the
re-verification command to cover test imports and other GOOS build
constraints, and record that the ID-only match cannot be scoped to a Go
package, with govulncheck as the backstop.

The govulncheck SARIF filter now honours ignoreUntil (matching osv-scanner's
same-day expiry) and refuses config keys it does not implement, including an
entry without id, so the two scanners cannot silently diverge. The toml
header names the filter as a consumer and states that it covers ./go.mod
only, since osv-scanner applies a config to its own directory.

SECURITY-POSTURE.md no longer duplicates the per-entry rationale; it states
the expiry rule and the ID-scoping limit and points at the toml.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: Isaac Schepp <isaac.schepp@gmail.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Deploying genealogix with  Cloudflare Pages  Cloudflare Pages

Latest commit: 2d989a8
Status: ✅  Deploy successful!
Preview URL: https://88843fe8.genealogix.pages.dev
Branch Preview URL: https://fix-osv-scanner-suppression.genealogix.pages.dev

View logs

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: Isaac Schepp <isaac.schepp@gmail.com>
@noahbjohnson
noahbjohnson merged commit 76ae474 into main Oct 14, 2026
39 checks passed
@noahbjohnson
noahbjohnson deleted the fix/osv-scanner-suppression-review branch October 14, 2026 15:12
isaacschepp added a commit that referenced this pull request Oct 27, 2026
Resolve the CHANGELOG.md and Makefile conflicts:

- CHANGELOG.md: keep the changie-rendered file. The 12 [Unreleased]
  entries main gained since the last merge (#1382, #1384, #1386, #1393,
  #1395, #1396, #1407, #1413) become fragments Added-main-56 ..
  Fixed-main-67, with trailing/inline refs moved into custom.Issue as in
  the existing migrated fragments. Main's released sections were
  unchanged since the merge base.
- Makefile: .PHONY carries both main's lint-workflows and this branch's
  changelog/changelog-check targets.
- tools/fragmentcheck: import go.yaml.in/yaml/v3. #1407 dropped
  gopkg.in/yaml.v3 from go.mod, so the checker no longer built and
  `make changelog-check` failed with "go mod tidy needed".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants