Repository navigation
feat: check the SBOM against cve-status verdicts, resolved like an application - #9799
Merged
Merged
Conversation
The SBOM check now also reads https://vaadin.github.io/cve-status/assessments.json. A finding counts as known when every id it reports is named by a cve-status verdict on its versionless purl, and the verdict's affects range covers the platform version being built. The local cveWhiteList stays: a finding either list covers is known, and if the fetch fails or the schema is unknown the check uses the local list alone. Nothing that passes today fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Dependencies Report
|
vaadin-platform-sbom now has the shape of the application vaadin/cve-status scans: - spring-boot-dependencies is imported after vaadin-bom; - vaadin-spring-boot-starter and hilla-spring-boot-starter replace vaadin-spring and hilla; - vaadin-dev brings copilot, instead of copilot being declared directly; - the starter's own spring-boot-starter-validation, devtools and test are added. The CVE check therefore reports what a customer deploys, and the verdicts published there apply to it. Resolved against 25.4.0-alpha4 and Spring Boot 4.1.2, the runtime tree matches that application's in 319 of 320 artifacts. The one difference is slf4j-api and jul-to-slf4j, at 2.0.17 here and 2.0.20 there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 3, 2026
manolo
added a commit
that referenced
this pull request
Nov 3, 2026
…plication [25.3] (#9804) * feat: check the SBOM against cve-status verdicts, resolved like an application (#9799) * feat: read CVE verdicts from cve-status in the SBOM check The SBOM check now also reads https://vaadin.github.io/cve-status/assessments.json. A finding counts as known when every id it reports is named by a cve-status verdict on its versionless purl, and the verdict's affects range covers the platform version being built. The local cveWhiteList stays: a finding either list covers is known, and if the fetch fails or the schema is unknown the check uses the local list alone. Nothing that passes today fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat: resolve the SBOM project the way a Spring Boot application does vaadin-platform-sbom now has the shape of the application vaadin/cve-status scans: - spring-boot-dependencies is imported after vaadin-bom; - vaadin-spring-boot-starter and hilla-spring-boot-starter replace vaadin-spring and hilla; - vaadin-dev brings copilot, instead of copilot being declared directly; - the starter's own spring-boot-starter-validation, devtools and test are added. The CVE check therefore reports what a customer deploys, and the verdicts published there apply to it. Resolved against 25.4.0-alpha4 and Spring Boot 4.1.2, the runtime tree matches that application's in 319 of 320 artifacts. The one difference is slf4j-api and jul-to-slf4j, at 2.0.17 here and 2.0.20 there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 786b80f) * fix: judge a snapshot SBOM by the newest release of its line 25.3-SNAPSHOT compared as the start of the 25.3 line, so a cve-status verdict saying a fix shipped in 25.3.5 did not apply to it. The SBOM run of #9804 was red on Quill CVE-2025-15056 for that reason. A snapshot is now judged as prev.lastPatch, the newest release of its line, which the same script already computes for the comparison. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
cveWhiteListinscripts/generateAndCheckSBOM.jshas three problems:purl@exact version. A false positive we already analysed goes red again on the next bump of the dependency.vaadin/cve-status publishes its verdicts at https://vaadin.github.io/cve-status/assessments.json. The URL is public and needs no token. Each entry has three parts:
affects, a range of platform versions, such as>=24.4,<24.7.What
At build time the check downloads that list with
curl, using the same pattern asdownloadSbom. A finding is known when either list covers it:cveWhiteList, using exactly today's rule;currVersion) is inside that verdict'saffects;A new CVE on the same package therefore still turns the build red. Only verdicts that silence a finding appear in the list (
false_positive,not_affected,configuration,no_risk,fixed), soriskstays red.If the download fails, the JSON does not parse, or the
schemais unknown, the check logs it and falls back to the local list alone. That is today's behaviour.The matching functions are copied unchanged from
scripts/platform/known-vulnerabilities.js. That file is tested there against the Python that writes the verdicts. Fixes belong there, and are then copied here.The tree being checked is the application's
The check only means something if both sides look at the same dependency tree. Until now they did not:
vaadin-platform-sbomdeclared everything directly, with no Spring Boot.spring-boot-starter-parent, importsvaadin-bom, usesvaadin-spring-boot-starterandhilla-spring-boot-starter, and gets copilot throughvaadin-dev.This is why the build reported packages such as guava 33.5.0/33.6.0 or
tomcat-catalina, which no application resolves.The pom now has the same shape:
spring-boot-dependencies(${spring.boot.version}) is imported aftervaadin-bom. That reproduces a real application's precedence: what vaadin-bom manages wins because the application declares it, and Spring Boot decides everything else.vaadin-springandhillaare replaced by their starters.vaadin-devand is no longer declared directly.spring-boot-starter-validationandspring-boot-devtoolsare added, andspring-boot-starter-testis added at test scope.I resolved both trees against
25.4.0-alpha4and Spring Boot 4.1.2 withdependency:list, runtime scope:slf4j-apiandjul-to-slf4j: 2.0.17 here (from the slf4j-bom inside vaadin-bom) against 2.0.20 in the application (Spring Boot's).This changes the
Software.Bill.Of.Materials.jsonthat 25.4 publishes. From now on it describes what an application deploys, not the union of every artifact Vaadin declares.Verified
The patched
checkVunerabilitieswas run on the findings printed by three of today's runs:What stays red has two causes:
riskverdicts. These are mostly Spring, Tomcat and Logback on 24.7 and 23.6, and they are real.tomcat-catalina,spring-webflux,vite-plusandlog4j-to-slf4j.After this
scripts/from their branch, so each branch needs the change.cve.py whitelist-json --branch <b>lists the ones it does not cover yet.Related to https://github.com/vaadin/cve-status/pull/284
🤖 Generated with Claude Code