Skip to content

Add OPEV 0016#24

Open
macedogm wants to merge 3 commits into
openvex:mainfrom
macedogm:opev-0016
Open

Add OPEV 0016#24
macedogm wants to merge 3 commits into
openvex:mainfrom
macedogm:opev-0016

Conversation

@macedogm
Copy link
Copy Markdown

As discussed in openvex/spec#31 and in the OpenVEX SIG meeting on April 13th, this OPEV proposes to extend the OpenVEX spec to allow re-scoring vulnerabilities. The extension is minimal, doesn't break backwards compatibility and follows the original NTIA VEX spec.

Signed-off-by: Guilherme Macedo <guilherme@gmacedo.com>
@macedogm
Copy link
Copy Markdown
Author

@puerco PTAL and thanks for the support of the OpenVEX SIG.

@fahedouch
Copy link
Copy Markdown

Great news! I couldn't make it to the meeting yesterday. So, am I right in understanding that OpenVEX has agreed to support ratings in its spec?

@macedogm
Copy link
Copy Markdown
Author

macedogm commented Apr 14, 2026

@fahedouch those that were in the OpenVEX SIG meeting sympathize with this proposal, because they face the same issue (overall need to provide better scoring at product level instead of the generic scoring from the upstream source). They agreed to get it reviewed, improved and them be submitted for official voting from the maintainers of the spec.

Copy link
Copy Markdown
Member

@puerco puerco left a comment

Choose a reason for hiding this comment

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

Thanks for the proposal, I am excited to now have this capability under a more formal discussion track. I have some initial comments and questions 👇

Comment thread enhancements/opev-0016.md Outdated

| Field | Required | Description |
| ----- | -------- | ----------- |
| source | ✕ | An object that contains information about the entity that is providing the vulnerability's rating. |
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We are considering adding a proper identity structure. To the spec. The current plan is to model it to record actors (people or bots) or tools. Can you provide more context on the types of entities you expect reference here?

In the end we will unify this part of the proposal with the new identity struct.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

To me the entity is similar to the author field of the report, it provides more details about who did the re-score. I believe that for most of the cases it will be the same person/company that generated the entire report, but I also believe that we should be flexible and allow it reference some 3rd-party if needed. The source.url is to allow to link the re-score to an external link that can provide more details about it.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I agree with @macedogm, since VEX format already has the author and role fields, this might result in redundancy here.
I would go with something minimal, only to give more details to the final user, such as source.url or at most with an optional field details.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I agree with both @alegrey91 and @macedogm, keeping it minimal with source.url (and maybe an optional details) feels right. The doc-level author/role already covers the identity part.

Comment thread enhancements/opev-0016.md Outdated
{
"vulnerability": {
"name": "CVE-2025-68121",
"ratings": [
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Since we have a list of reclassifications, how are tools expected to understand which of these apply to them.

In this example: if I have a policy engine to block on a 7.5 or higher, score which of the two reclassifications should it pay attention to?

SLSA, for example, uses a builderId URI to identify and define the expectations of a build system. Here, we may need something like it (unless you want to do it only based on the source).

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

My expectation is that tools (scanners) will respect the VEX data that was provided and follow it over their default score. From my main experience with Trivy, once you provide a VEX report to it, it will by default suppress vulnerabilities that it matches, so here I see the same logic being applied, by default it will either suppress a matched vulnerability or re-score it if it's a match.

So on your example, the policy engine must respect the VEX data and if the score in the example is lower than the block threshold, then that vulnerability will not be blocked if the re-score is now lower. The reasoning here is that the user/operator must properly check and trust the VEX report in question before feeding it to its tools.

SLSA, for example, uses a builderId URI to identify and define the expectations of a build system. Here, we may need something like it (unless you want to do it only based on the source).

I haven't thought about that. I don't believe that such context would be relevant here, so it would be based only on the source.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Looking at the example, both ratings come from the same source but different CVSS versions — so the source-based logic alone doesn't disambiguate.

The current spec doesn't have a method field — version/format is only implicit via the vector prefix, which works for CVSS but breaks for OWASP RR, EPSS or SSVC. Adding an explicit method (cvss-v3.1, cvss-v4.0, owasp, ssvc, other) would let consumers filter cleanly without needing a builderId-style URI.

For the residual case (same source, same method, diverging values), the spec could just say "order is precedence, last wins" and let consumers override via their own policy.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I've updated the spec and added a type that lists the supported types for the score and allows to more easily parse the provided score. PTAL.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Adoption of type looks great. One thing missing: other as a value in the enum. It would act as an escape hatch and avoid a spec bump every time a new scoring system shows up.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@puerco wdyt ^? it makes sense and I can quickly update the proposal

Comment thread enhancements/opev-0016.md Outdated
"vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
},
{
"source": {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Formal nit: Since openvex is JSON-LD, the reclassification struct will need an @id field (which can be implicit). Just noting it as it needs to go into the spec below.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@puerco I'm a bit lost here. What would be a good @id in this case? Can you please share some ideas? Could it be the actual source.url? If yes, then it would have to be mandatory, and we could even remove the source.name to make it smaller and simpler, given that it would be implied from the source.url. On the other hand, if the provider of the report doesn't have a place to publish its source.url, then what would be a good candidate for the @id?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Same here, I don't see the point of the @id attribute. What's the benefit of having an ID for this kind of information?

Comment thread enhancements/opev-0016.md Outdated
`severity` or a `vector` must be provided, otherwise there is no purpose in
having an empty object that contains no actionable rating for the
vulnerability.
- Strict formatting of `severity` isn't enforced, because some authors might
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

FYI, initially we didn't enforce a strict enumeration on the hash fields and very quickly led into problems. Not saying this is the same case but just some advice from paste experiences.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I've updated the spec to consider this now.

Signed-off-by: Guilherme Macedo <guilherme@gmacedo.com>
@macedogm macedogm requested review from alegrey91, fahedouch and puerco May 7, 2026 14:10
@macedogm
Copy link
Copy Markdown
Author

macedogm commented May 7, 2026

@puerco the spec is now updated to address the feedback from the pr and also from the last sig meeting. I've only one open question about the @id that I tagged you above. Thank you!

Comment thread enhancements/opev-0016.md Outdated
| source | ✕ | An object that contains information about the entity that is providing the vulnerability's severity. |
| source.name | ✕ | The `name` of the entity providing the severity. |
| source.url | ✕ | A `url` linking to a page that further describes the vulnerability or the severity. |
| rating | x | An object containing zero or more ratings of the vulnerability. |
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

naming nit: rating is singular but holds a list, should be ratings. And severity as the outer name is confusing — usually severity = the category (low/med/high), not the container.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

@fahedouch your comment makes sense and I've updated the proposal to try to eliminate any confusion, ptal.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

thanks. Small follow-up: the inner list is now severities but each entry is {type, score} — those are scores/ratings, not severity categories. Would scores or ratings be a better fit?

Signed-off-by: Guilherme Macedo <guilherme@gmacedo.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.

4 participants