Skip to content

Add OPEV-0016 - #24

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

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

Conversation

@macedogm

@macedogm macedogm commented Apr 13, 2026 •

Copy link
Copy Markdown
Member

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.

Closes openvex/spec#31

Signed-off-by: Guilherme Macedo <guilherme@gmacedo.com>
@macedogm

Copy link
Copy Markdown
Member 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

macedogm commented Apr 14, 2026 •

Copy link
Copy Markdown
Member Author

@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.

@puerco puerco left a comment

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.

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
Member 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
Member 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
Member 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
Member 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
Member 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?

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.

All JSON-LD elements have an ID which is used to reference them in the linked data graph. This ID exists implicitly even if it is not in the JSON code.

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
Member 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

macedogm commented May 7, 2026

Copy link
Copy Markdown
Member Author

@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
Member 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>
@cwayne18

cwayne18 commented Jul 9, 2026

Copy link
Copy Markdown

any update on this? Would be a great addition IMHO

@kaz-33

kaz-33 commented Jul 22, 2026 •

Copy link
Copy Markdown

Hi Team, any reason to block this PR? it seems it miss an human review? @puerco @alegrey91 @macedogm

@alegrey91

Copy link
Copy Markdown

Hi Team, any reason to block this PR? it seems it miss an human review? @puerco @alegrey91 @macedogm

Hi @kaz-33, final review is not in our hands. We are waiting for the project maintainers to get approval.

@kaz-33

kaz-33 commented Jul 28, 2026

Copy link
Copy Markdown

thx @fahedouch ! what is the next step?

@alegrey91

Copy link
Copy Markdown

thx @fahedouch ! what is the next step?

Hello @kaz-33, we are waiting for other maintainers to approve it.
Just out of curiosity, how this feature matches your needs? I'm curious to know how does this impact your daily job.

@kaz-33

kaz-33 commented Jul 28, 2026

Copy link
Copy Markdown

@alegrey91 We would like to integrate OpenVEX inside supply chain to promote Image with Trivy(e.g) and trigger the number of CVE Critical. Critical > 0, no promoted. OpenVEX will used to automate exchange with supplier but sometime "affected" to "no_affected" no working cause they change the level of severity, affected + critical >> affected +minor, with openVEX actually, only status is present.

@alegrey91

Copy link
Copy Markdown

@alegrey91 We would like to integrate OpenVEX inside supply chain to promote Image with Trivy(e.g) and trigger the number of CVE Critical. Critical > 0, no promoted. OpenVEX will used to automate exchange with supplier but sometime "affected" to "no_affected" no working cause they change the level of severity, affected + critical >> affected +minor, with openVEX actually, only status is present.

cool! thanks for sharing. I'm glad to hear that someone else has similar needs :)

Comment thread enhancements/opev-0016.md
Comment on lines +110 to +117
- The `type` specifies how to parse the `score` string and must be one of the
following:
- `cvss_v2` - for the CVSS v2.0 format.
- `cvss_v3` - for the CVSS v3.x format.
- `cvss_v4` - for the CVSS v4.x format.
- `owasp` - for the OWASP Risk Rating Methodology format.
- `ssvc_v2` - for the CISA Stakeholder-Specific Vulnerability Categorization v2.x format"
- `sev` - a string containing directly the rating/severity.

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.

If the type field is a fixed enum, should we enforce some sort of structure either in the value string or a struct?

From a policy perspective it sounds like we need a source of truth on how to parse each type for validation and to ensure properly formatted values are carried forward to systems that expect them.

For example validating a doc should reject an invalid CVSS string, this would also guard other systems from rejecting the vex document (or the score value)

@miniprow

miniprow Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: fahedouch, macedogm
Once this PR has been reviewed and has the lgtm label, a repository administrator can /approve this pull request. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from a repository administrator.

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@puerco

puerco commented Aug 28, 2026

Copy link
Copy Markdown
Member

/hold for discussion

@puerco

puerco commented Aug 28, 2026

Copy link
Copy Markdown
Member

/hold

@miniprow miniprow Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command label Aug 28, 2026
Comment thread enhancements/opev-0016.md
Comment on lines +50 to +52
"source": {
"name": "Acme - Security team",
"url": "https://www.example.com/cves/cve-2025-68121.html"

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.

Question: "source" is the agent (person or tool) reclassifying the vulnerability?

@macedogm macedogm Aug 31, 2026 •

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Source is the person (entity/company) doing the reclassification. It isn't the tool.

@macedogm macedogm Aug 31, 2026 •

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

TODO: remove the source field for the moment, in the future we can tie it to a way of verifying identity/signature of the doc's author with the re-scoring, for example.

@puerco puerco changed the title Add OPEV 0016 Add OPEV-0016 Aug 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Modify severity

6 participants