Skip to content

fix(vulnfeeds): delete rejected CVEs from combined output and clean up withdrawn relations - #6314

Merged
jess-lowe merged 1 commit into
google:masterfrom
jess-lowe:issue_6313_fix
Nov 10, 2026
Merged

jess-lowe merged 1 commit into
google:masterfrom
jess-lowe:issue_6313_fix

Conversation

@jess-lowe

Copy link
Copy Markdown
Contributor

Summary

Fixes #6313.

Upstream CVE rejections (REJECTED in CVEList V5 / Rejected in NVD) are converted into withdrawn tombstone records by cve5-to-osv and nvd-cve-osv (since #5761), and combine-to-osv returns nil when either input has withdrawn set. However, combine-to-osv runs with -sync-deletions=false (and enabling full-bucket -sync-deletions would delete valid pre-2016 CVEs and legacy upstream stubs in osv-output/), so existing gs://cve-osv-conversion/osv-output/<CVE>.json records were never removed when a CVE transitioned to REJECTED. As a result, neither importer nor importer-deleter detected the rejection and the records remained live without withdrawn.

Changes

vulnfeeds

  • writer.HandleWithdrawnDeletions & writer.DeleteLocalFiles: List objects in osv-output/, intersect against CVE IDs marked withdrawn in either cve5 or nvd, skip any record with a manual override in osv-output-overrides/, and delete matching stale objects so importer-deleter marks them withdrawn via TaskDelete (without touching pre-2016 CVEs or non-withdrawn records).
  • combine-to-osv: Collect withdrawn CVE IDs during readAndCombineWorker and unconditionally clean up existing withdrawn records after uploads finish.
  • cve5/bulk-converter: Emit withdrawn tombstones for REJECTED CVEs even when the assigning CNA is in cna_denylist.txt (since cve5.CVEToOSV returns early before version extraction for REJECTED records).

go/cmd/relations

  • Updater.run (update.go): Delete ListedVulnerability (instead of unconditionally Putting it) when updating relations on a withdrawn vulnerability, preventing withdrawn CVEs from reappearing on /list.
  • updateAliasGroup (alias.go): Mark removed AliasGroup members in changedVulns when a group shrinks, splits, or is deleted so surviving records have stale aliases to withdrawn duplicates cleared.

Testing

  • Added unit tests in vulnfeeds/conversion/writer/writer_test.go, vulnfeeds/cmd/combine-to-osv/main_test.go, vulnfeeds/cmd/converters/cve/cve5/bulk-converter/main_test.go, and go/cmd/relations/alias_test.go.
  • cd vulnfeeds && go test ./... passed.
  • poetry run tools/lint_and_format.sh passed with 0 issues.

@jess-lowe
jess-lowe merged commit 59ebdcf into google:master Nov 10, 2026
24 of 25 checks passed
@jess-lowe
jess-lowe deleted the issue_6313_fix branch November 10, 2026 05:50
munimv2 added a commit to munimtechnologies/advisory-import-census that referenced this pull request Nov 10, 2026
…6 found live?

OSV.dev merged google/osv.dev#6314 on 2026-11-10, fixing google/osv.dev#6313 (study S16: every rejected 2026 CVE in the sample was still live). S17 freezes six predictions before the fix is visible, to be graded on S16's 163 live and 7 withdrawn records on or after 2026-11-17. Also adds docs/upstream-outcomes.md, a
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.

Rejected CVEs are no longer withdrawn: all 162 sampled 2026 rejections still live (e.g. CVE-2026-97618)

2 participants