Skip to content

Commit 069cbb7

Browse files
aksOpsclaudePaperclip-Paperclip
committed
fix(bootstrap): R4-1 docs + CPE-collision suppressions (RAN-47)
Reviewer round-4 finding on `fdac5c8` plus CI build-failure analysis: R4-1 (Reviewer blocker): `shared/runbooks/engineering-standards.md` §7.1 deploy-pipeline table said GA release was triggered by `vX.Y.Z` tag push while every other doc (release-java.yml, release.md, CLAUDE.md) says `workflow_dispatch`-only. Rewrote the table with a `Trigger` column and added a clarifying paragraph: tags are an *output* of the GA workflow, not a trigger. This eliminates the docs contradiction. CI failure on `fdac5c8`: dep-check correctly flagged High/Critical CVEs (the gate works as designed). Of the 4 jar/CVE clusters that failed the CVSS>=7 threshold, one is a confirmed CPE-vendor collision and three are real 2026-published CVEs that require dep upgrades. Added `dependency-check-suppressions.xml` (referenced from pom.xml via <suppressionFiles>) covering ONLY the CPE-collision false positives: 1. spring-ai-starter-mcp-server-webmvc 2.0.0-M3 incorrectly matched against cpe:2.3:a:vmware:server:2.0.0 (an EOL VMware hypervisor) and the non-existent cpe:2.3:a:vmware:spring_ai. The 16 CVEs are 2009/2010 VMware Server vulns; not applicable to a Spring Boot starter. CPE collision only — suppressed with TechLead sign-off. 2. spring-boot-neo4j 4.0.5 (Spring Boot autoconfiguration starter) incorrectly matched against cpe:2.3:a:neo4j:neo4j:4.0.5. The starter ships no Neo4j server code; Neo4j-the-database CVEs apply to org.neo4j:* artifacts, not to the Spring Boot bridge. The remaining 3 real CVE clusters (CVE-2026-25087 on Apache Arrow 18.3.0, CVE-2026-33186 on gRPC 1.78.0, CVE-2026-5795 on Jetty 12.x) are NOT suppressed. Per security.md §5, High/Critical = fix-immediately, not document-non-exploitability. These need dep upgrades that are outside the documented scope of RAN-46 ("wire the gate"); flagging to CEO for scope ruling. The gate is functioning correctly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-Authored-By: Paperclip <noreply@paperclip.ing>
1 parent fdac5c8 commit 069cbb7

3 files changed

Lines changed: 87 additions & 4 deletions

File tree

dependency-check-suppressions.xml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
OWASP Dependency-Check suppressions for codeiq.
4+
5+
Policy (per shared/runbooks/engineering-standards.md §5 + ~/.claude/rules/security.md):
6+
- High/Critical CVEs MUST be fixed, not suppressed. The only allowed
7+
suppressions in this file are CPE-MATCH false positives — i.e., the
8+
vulnerability is on a different product whose CPE happens to overlap.
9+
- Each entry MUST include: justification, the wrong CPE that triggered
10+
the match, the CVE list it covers, and TechLead sign-off (initials +
11+
date). No silent suppressions.
12+
13+
This file is referenced from `pom.xml` via the dependency-check-maven
14+
`<suppressionFiles>` configuration.
15+
-->
16+
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
17+
18+
<!--
19+
Spring AI MCP Server WebMVC (org.springframework.ai:spring-ai-starter-mcp-server-webmvc)
20+
is being matched against `cpe:2.3:a:vmware:server:2.0.0` (VMware Server, an
21+
EOL hypervisor product) and `cpe:2.3:a:vmware:spring_ai:2.0.0` (a CPE
22+
that does not correspond to a real product line). The matched CVEs are
23+
all from 2009-2010 against VMware Server / ESX, none of which apply to a
24+
Spring Boot starter JAR. This is a pure CPE-vendor collision triggered
25+
by version pattern `2.0.0:m3` matching VMware Server's `2.0.0` CPE.
26+
27+
Justification: not-applicable. Spring AI 2.0.0-M3 is a 2025 Spring AI
28+
milestone artifact, not VMware Server 2.0.0 (released 2008-09).
29+
Sign-off: Amit Kumar (TechLead) 2026-04-25.
30+
-->
31+
<suppress>
32+
<notes><![CDATA[
33+
Spring AI MCP Server starter incorrectly matched against
34+
cpe:2.3:a:vmware:server (VMware Server EOL hypervisor) due to
35+
version-string overlap. CVEs are 2009/2010 VMware Server vulns,
36+
not applicable to Spring AI. CPE collision only.
37+
]]></notes>
38+
<packageUrl regex="true">^pkg:maven/org\.springframework\.ai/spring-ai-.*@.*$</packageUrl>
39+
<cpe>cpe:/a:vmware:server</cpe>
40+
</suppress>
41+
<suppress>
42+
<notes><![CDATA[
43+
Spring AI MCP Server starter incorrectly matched against
44+
cpe:2.3:a:vmware:spring_ai which is not a real CPE product line.
45+
CPE collision only.
46+
]]></notes>
47+
<packageUrl regex="true">^pkg:maven/org\.springframework\.ai/spring-ai-.*@.*$</packageUrl>
48+
<cpe>cpe:/a:vmware:spring_ai</cpe>
49+
</suppress>
50+
51+
<!--
52+
spring-boot-neo4j (org.springframework.boot:spring-boot-neo4j) is the
53+
Spring Boot autoconfiguration starter for Neo4j; it is NOT the Neo4j
54+
database itself. Dependency-check matches its version (4.0.5) against
55+
cpe:2.3:a:neo4j:neo4j:4.0.5. Neo4j-the-database CVEs apply to the Neo4j
56+
server / driver artifacts (org.neo4j:* and org.neo4j.driver:*), not to
57+
the Spring Boot starter.
58+
59+
Justification: not-applicable. spring-boot-neo4j is a configuration
60+
bridge; it ships no Neo4j server code.
61+
Sign-off: Amit Kumar (TechLead) 2026-04-25.
62+
-->
63+
<suppress>
64+
<notes><![CDATA[
65+
Spring Boot Neo4j starter incorrectly matched against
66+
cpe:2.3:a:neo4j:neo4j. Starter contains no Neo4j server code.
67+
CPE collision only.
68+
]]></notes>
69+
<packageUrl regex="true">^pkg:maven/org\.springframework\.boot/spring-boot-neo4j@.*$</packageUrl>
70+
<cpe>cpe:/a:neo4j:neo4j</cpe>
71+
</suppress>
72+
73+
</suppressions>

pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,14 @@
427427
once the cache is warm. RAN-42 tracks the secret
428428
provisioning + a dedicated nightly NVD-refresh job. -->
429429
<nvdApiKey>${env.NVD_API_KEY}</nvdApiKey>
430+
<!-- CPE-collision false-positive suppressions ONLY.
431+
High/Critical CVEs MUST be fixed, not suppressed
432+
(security.md §5). Each entry is justified, scoped
433+
tightly to the offending CPE, and TechLead-signed.
434+
See file header for the policy. -->
435+
<suppressionFiles>
436+
<suppressionFile>${project.basedir}/dependency-check-suppressions.xml</suppressionFile>
437+
</suppressionFiles>
430438
</configuration>
431439
<executions>
432440
<!-- Bind dependency-check:check into the verify phase so

shared/runbooks/engineering-standards.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,12 @@ Rationale (per @CEO's RAN-46 ruling):
104104

105105
The pipeline:
106106

107-
| Cadence | Workflow | Artifact destination |
108-
|---|---|---|
109-
| `workflow_dispatch` (beta) | `.github/workflows/beta-java.yml` | Sonatype Central beta + GitHub pre-release |
110-
| `vX.Y.Z` tag push (GA) | `.github/workflows/release-java.yml` | Sonatype Central GA + GitHub Release |
107+
| Cadence | Workflow | Trigger | Artifact destination |
108+
|---|---|---|---|
109+
| Beta | `.github/workflows/beta-java.yml` | `workflow_dispatch` (manual) | Sonatype Central beta + GitHub pre-release |
110+
| GA | `.github/workflows/release-java.yml` | `workflow_dispatch` (manual, with `version` input) | Sonatype Central GA + GitHub Release |
111+
112+
Both workflows are `workflow_dispatch`-only — there is no tag-push trigger and no automatic release on merge. A GA cut: the workflow builds a GPG-signed release commit on a detached HEAD, deploys from that exact tree, then creates and pushes a GPG-signed annotated `vX.Y.Z` tag pointing at the release commit plus a GitHub Release. Tags are an *output* of the GA workflow, not a trigger. See [`release.md`](release.md) §3 for the full sequence.
111113

112114
Hello-world / pipeline proof: `git tag -l 'v0.0.1-beta.*' | wc -l` is non-zero (47+ beta tags as of the AC #10 ruling) and `gh release list` shows the corresponding GitHub pre-releases. AC #10 is satisfied by the existing pipeline; no new deploy scaffold is required.
113115

0 commit comments

Comments
 (0)