Skip to content

feat(vulnfeeds): handle rejected CVEs and propagate withdrawn status - #5761

Open
jess-lowe wants to merge 12 commits into
google:masterfrom
jess-lowe:feat/cve/handle-deletions
Open

feat(vulnfeeds): handle rejected CVEs and propagate withdrawn status#5761
jess-lowe wants to merge 12 commits into
google:masterfrom
jess-lowe:feat/cve/handle-deletions

Conversation

@jess-lowe

@jess-lowe jess-lowe commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

If a CVE is marked as Rejected upstream (in NVD or CVEList), OSV will now handle it properly instead of ignoring the change or keeping stale data.

How it works

  • If we already had the record in cve5 or nvd OSV records, it gets updated with a "Withdrawn" timestamp.
  • If a rejected CVE is brand new to us, we make a tombstone record so it gets withdrawn properly.
  • In the final step (combine-to-osv), if either source is rejected, the combined OSV file is deleted to keep the feed clean.
  • We skip merging logic in combine-to-osv if we know a record is withdrawn.

(Tested and verified with local scripts and unit tests).

Closes #4610

@jess-lowe
jess-lowe requested review from a team and another-rex August 3, 2026 01:36

@another-rex another-rex left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If a rejected CVE is brand new to us, we ignore it.

Should we also just be publishing withdrawn entires for them rather than ignoring it?
At least, should we be doing this in the cve and nvd versions, and then in combine-to-osv decide whether to publish it. (To avoid cases where it's withdrawn in nvd, but there in cve, and we're just publishing it as if cve is the only source and not correctly marking it as withdrawn.)

Comment thread vulnfeeds/cmd/combine-to-osv/main.go Outdated
Comment thread vulnfeeds/cmd/combine-to-osv/main_test.go
Comment thread vulnfeeds/cmd/combine-to-osv/main.go Outdated
Comment thread vulnfeeds/cmd/converters/cve/nvd-cve-osv/main.go Outdated
Comment thread vulnfeeds/cmd/converters/cve/cve5/bulk-converter/main.go Outdated
Comment thread vulnfeeds/cmd/converters/cve/cve5/bulk-converter/main.go Outdated
Comment thread vulnfeeds/conversion/cve5/converter.go
Comment thread vulnfeeds/conversion/cve5/converter.go Outdated
@jess-lowe
jess-lowe requested a review from another-rex August 5, 2026 04:42

@another-rex another-rex left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some questions, but otherwise everything else LGTM.

Comment thread vulnfeeds/conversion/cve5/converter.go Outdated

var withdrawnTime *timestamppb.Timestamp
if cve.Metadata.State == "REJECTED" {
withdrawnTime = timestamppb.New(modified)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like there's also "dateRejected", which might fit better here?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point - updated for cve5. nvd doesn't seem to have an equivalent so I'll keep it as modified date

v.DatabaseSpecific = databaseSpecific
}

return v, metrics, models.Rejected

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm this returns early while the CVE one doesn't. Is this because NVD removes most of the details once it rejects a record?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've made them both return early now - information outside the basic stuff isn't really relevant after rejection

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.

Withdraw CVE5 records that have changed status to "rejected"

2 participants