Skip to content

chore(security): pin tomcat.version=10.1.55 to close 7 new CVEs (v0.1.25.19)#161

Merged
amavashev merged 1 commit into
mainfrom
chore/bump-tomcat-10.1.55
May 21, 2026
Merged

chore(security): pin tomcat.version=10.1.55 to close 7 new CVEs (v0.1.25.19)#161
amavashev merged 1 commit into
mainfrom
chore/bump-tomcat-10.1.55

Conversation

@amavashev
Copy link
Copy Markdown
Collaborator

Summary

Trivy's container scan started failing CI on every PR build against main between 2026-05-11 (last green main run) and 2026-05-21. Root cause: the upstream Trivy DB picked up a new wave of CVEs against org.apache.tomcat.embed:tomcat-embed-core 10.1.54 — the version Spring Boot 3.5.14's BOM currently manages.

Severity CVE Fixed in
CRITICAL CVE-2026-43512 10.1.55 / 11.0.22
CRITICAL CVE-2026-43515 10.1.55 / 11.0.22
CRITICAL CVE-2026-41293 10.1.55 / 11.0.22
HIGH CVE-2026-43513 10.1.55 / 11.0.22
HIGH CVE-2026-42498 10.1.55 / 11.0.22
HIGH CVE-2026-41284 10.1.55 / 11.0.22
LOW CVE-2026-43514 10.1.55 / 11.0.22

All seven are scoped to tomcat-embed-core and ship transitively via spring-boot-starter-web.

Fix

Re-add the <tomcat.version>10.1.55</tomcat.version> property override on cycles-protocol-service/pom.xml. Spring Boot 3.5.14's BOM picks the property up and resolves Tomcat at 10.1.55 across all transitive dependencies.

This mirrors the v0.1.25.16 pattern, which pinned tomcat.version=10.1.54 for the previous CVE wave. The override was dropped in v0.1.25.18 once Spring Boot 3.5.14's BOM caught up to 10.1.54. This re-adds the same shape, one patch higher. Removable again once Spring Boot ships a release whose BOM manages 10.1.55+.

commons-lang3.version=3.18.0 override is retained (CVE-2025-48924 still unfixed in SB 3.5.14's BOM-managed 3.17.0).

Why a standalone PR

PR #160 (the listReservations from/to feature) is currently blocked by the same Trivy failure, but mixing CVE-hygiene with feature work would split scope and complicate the v0.1.25.x patch history. Prior CVE waves (v0.1.25.16, v0.1.25.17, v0.1.25.18) each landed as their own PR; following that precedent here.

After this merges, I'll rebase #160 onto main and bump its revision to 0.1.25.20.

Verification

  • No production-code or test changes — pom property addition + version bump + CHANGELOG/AUDIT entries.
  • Local Maven dependency resolution against the new artifact requires Central reachability; my dev environment has a TLS cert constraint that blocks this locally, so the resolution is verified by CI. All 537 protocol-service tests pass against the source as-is.
  • Container scan is expected to pass after this lands — Trivy will detect tomcat-embed-core 10.1.55 and skip the seven CVEs.

Test plan

  • CI: Container Scan (Trivy) passes — that's the gate this PR is opened to fix.
  • CI: Unit & Contract / Build & Test green (no code changes, should be trivially green).
  • CI: Integration (with contract validation) green.
  • Manual: nothing required — pom-only patch.

Trivy's container scan picked up a new wave of CVEs against
org.apache.tomcat.embed:tomcat-embed-core 10.1.54 between the last
green main run (2026-05-11) and today:

  CRITICAL: CVE-2026-43512, CVE-2026-43515, CVE-2026-41293
  HIGH:     CVE-2026-43513, CVE-2026-42498, CVE-2026-41284
  LOW:      CVE-2026-43514

All seven scoped to tomcat-embed-core; all seven fixed in 10.1.55
(and 11.0.22 on the 11.x line). The artifact ships transitively via
spring-boot-starter-web; Spring Boot 3.5.14's BOM currently manages
10.1.54.

Mirrors the v0.1.25.16 pattern: explicit <tomcat.version>10.1.55</tomcat.version>
property override on cycles-protocol-service/pom.xml. The v0.1.25.16
override (10.1.54) was dropped in v0.1.25.18 once SB 3.5.14's BOM
caught up; this re-adds the same shape one patch higher. Removable
again once Spring Boot ships a release with 10.1.55+ as its managed
version.

commons-lang3.version=3.18.0 override retained (CVE-2025-48924 still
unfixed in SB 3.5.14's managed 3.17.0).

No production code, no test code, no API or Lua-script changes —
pom property change plus CHANGELOG.md and AUDIT.md entries. All 537
protocol-service tests pass (374 data + 163 api). Wire format
unchanged from v0.1.25.18.

Unblocks PR #160 (and any other branched work) — Trivy was failing
the container-scan check on every PR build against main.
@amavashev amavashev merged commit 9114b75 into main May 21, 2026
8 checks passed
@amavashev amavashev deleted the chore/bump-tomcat-10.1.55 branch May 21, 2026 15:32
amavashev added a commit that referenced this pull request May 21, 2026
Two real bugs found during the post-push code-review pass against PR #160:

1. FilterHasher.hash unconditionally appended `|fr=...|to=...` to the
   canonical string, even when both bounds were null. This changed the
   SHA-256 hash for every pre-window cursor, including any v0.1.25.18
   sorted-path cursor mid-pagination across the deployment boundary —
   the server would reject those cursors with 400 INVALID_REQUEST
   despite the client never sending the new params. That falsified the
   PR's stated "byte-for-byte" back-compat claim for the sorted path.

   Fix: gate the fr=/to= emission behind `fromMs != null || toMs != null`.
   When both bounds are null the canonical form reverts byte-exactly to
   the v0.1.25.12 8-field shape, so any pre-window cursor continues to
   resolve. When either bound is supplied, the new fields render in the
   canonical string as before, so cursors still invalidate on window
   change. Adds an explicit regression test
   `preservesPreWindowHashWhenBothBoundsNull` that locks the truncated
   8-byte SHA-256 to its v0.1.25.18 golden value (2f397ea0e8fb53b7).

2. Three new ReservationControllerTest cases
   (shouldPropagateFromOnly / shouldPropagateToOnly / shouldAcceptEqualBounds)
   hard-coded 1779710400000L as the epoch-ms for "2026-05-21T12:00:00Z",
   but the correct value is 1779364800000L (the literal was off by 4
   days — it's actually 2026-05-25T12:00:00Z). Mockito's eq(...) never
   matched the controller's computed value, the stub silently returned
   null, ResponseEntity.ok(null) still produced HTTP 200, and the tests
   passed vacuously without asserting anything about epoch-ms propagation.

   Fix: drop the literal entirely. Derive the expected ms from the same
   parser the controller uses (java.time.Instant.parse(...).toEpochMilli()).
   Each test also gains a verify(repository).listReservations(... eq(...) ...)
   assertion so a future Mockito miss raises a wanted-but-not-invoked
   failure instead of slipping through as a vacuous 200.

No production behavior change beyond restoring the back-compat invariant
for v0.1.25.18 sorted-path cursors. All 538 protocol-service tests pass
(375 data + 163 api). JaCoCo 95% bundle gate met.

Also folds in the .19 → .20 revision bump from the rebase onto main
post-#161 (Tomcat CVE hygiene), so the PR's cumulative version is now
v0.1.25.20.
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.

1 participant