Skip to content

[epic] Mitigations for 117 GAVs that cannot be upgraded on Java 1.8 (closes 504 CVEs) #73

Description

@natechadwick-intsof

Summary — EPIC

OWASP dependency-check on the main branch (Java 1.8 build target) reports 657 CVE matches across 136 unique Maven GAVs. After the Tier 1 Java-1.8-bumpable set (19 GAVs, 153 CVEs) is closed, 117 GAVs (504 CVEs) remain unfixed. This epic tracks the remaining work.

Java 11+ migration is explicitly out of scope for the main branch. The mitigations in this issue are Java 1.8-compatible by design.

How the GAVs break down

Subset GAVs CVEs Why
Tier 2 — fix only in a newer major that requires Java 11+/17+ 17 142 Spring 6.x, Bouncy Castle 1.78+, Apache Tika 3.x, CXF 3.6.x, ActiveMQ 5.19.x, Shiro 2.x, Spring 6.x, jackrabbit 2.22.x, etc.
Tier 3 — at the latest Java 1.8 line; no Java 1.8 fix exists 100 362 Maintainer dropped Java 1.8 from the support matrix. Examples: xstream 1.4.21, spring-security 5.8.16, jetty 9.4.58, commons-compress 1.28.0, pdfbox 2.0.31, tika 2.9.4, log4j 2.25.3, hibernate 5.6.15.Final, snakeyaml 2.6.
EOL with no fix ever (subset of Tier 3) commons-lang 2.6, commons-collections 3.2.2, commons-beanutils 1.11.0, commons-httpclient 3.1, commons-configuration 1.10, commons-fileupload 1.6.0, jasypt 1.9.3, bsh 2.0b6, jtds 1.3.1, sanselan 0.97-incubator, axis 1.4.x, jettison 1.5.4, json-lib 2.4, rhino 1.7.15.1, shindig 1.1-BETA5-incubating, soap 2.3.1. These need library replacement, not just configuration hardening.

A per-GAV table for all 117 is in docs/ai-generated/tasks/PR#-DependencyVulnerabilityAnalysis/categorized-final.json (keys UPGRADE_REQUIRES_NEWER_JAVA and NO_JAVA8_UPGRADE).

Sub-tasks to be opened under this epic

Each child issue should track one mitigation pattern and reference the relevant GAVs from the analysis.

  • [ ] T2.1 — Apache Tika 2.9.x hardening (13 CVEs in tika-core + 2 in tika-parser-pdf-module)

    • Restrict Tika to a strict AutoDetectParser with an explicit Detector / Parser map (reject unexpected types).
    • Process untrusted uploads in a separate JVM with restricted FS / network (sandbox).
    • Rate-limit PDF parsing operations.
    • Strip embedded scripts / OLE objects before invoking the parser.
    • Track the Java 1.8 compatibility of future Tika 2.9.x patches; if any ship, backport.
  • [ ] T2.2 — ActiveMQ 5.16.x hardening (30 CVEs across activemq-client / broker / openwire-legacy)

    • Change <transportConnectors> in activemq.xml from tcp://0.0.0.0:61616 to tcp://127.0.0.1:61616 (or a private interface).
    • Set advisorySupport=false, producerFlowControl=false (where applicable), openwire.tcp.maxFrameSize=100MB.
    • Remove the OpenWire legacy transport connector if unused.
    • Consider migrating to RabbitMQ in a future major release.
  • [ ] T2.3 — Apache CXF 3.5.x hardening (13+ CVEs across cxf-core / cxf-rt-frontend-jaxrs / cxf-rt-transports-http)

    • Disable WS-Security unless required (remove WSS4JInInterceptor / WSS4JOutInterceptor from the bus config).
    • Set MessageSizeValidation limits on inbound chains.
    • Apply strict schema validation on all incoming SOAP / XML.
  • [ ] T2.4 — Spring Framework 5.3.x + Spring Security 5.8.x hardening (45+ CVEs combined)

    • Apply the Spring 5.3.x security advisory index patches: RFD, open redirects, content-type confusion.
    • Set spring.mvc.contentnegotiation.favor-path-extension=false and use-fresh-handler=true in application.properties / rhythmyx.properties.
    • For @ResponseBody methods, return ResponseEntity<Resource> with Content-Disposition: attachment; filename="...".
    • Spring Security 5.8: ensure CSRF is enabled (default in 5.8+), headers().defaultsDisabled(), SessionManagementFilter configured, DelegatingPasswordEncoder in use, no jsr250 enabled.
  • [ ] T2.5 — XStream 1.4.21 hardening (37 CVEs)

    • For every XStream instance: call setupDefaultSecurity() and XStream.addPermission(NoTypePermission.NONE), then grant per-class permissions.
    • Never accept untrusted XML directly; use Jackson (already in project) or JAXB instead.
    • Document: XStream is a deserialization surface; treat any XStream.fromXML on untrusted input as RCE.
  • [ ] T2.6 — Apache Commons hardening (commons-compress, commons-text, commons-email, commons-collections4, commons-collections, commons-beanutils, commons-lang, commons-httpclient, commons-configuration, commons-fileupload, commons-io)

    • commons-compress 1.28.0 (11 CVEs): validate archive entries before extraction; reject .. paths; set ZipFile.setMaxEntrySize().
    • commons-text 1.15.0 (1 CVE): the CVE is in StringSubstitutor; never substitute into user input.
    • commons-email 1.6.0 (2 CVEs): validate all email headers and recipient lists.
    • commons-collections4 4.5.0 (2 CVEs): input validation on any Transformer / Predicate / Closure chain.
    • commons-collections 3.2.2 (2 CVEs): EOL — migrate to commons-collections4 (already in project). Replace org.apache.commons.collections.*org.apache.commons.collections4.*.
    • commons-beanutils 1.11.0 (3 CVEs): EOL — migrate to commons-beanutils2 (Jakarta) or Spring BeanUtils.
    • commons-lang 2.6 (1 CVE): EOL — migrate to commons-lang3 (already in project). Replace org.apache.commons.lang.*org.apache.commons.lang3.*.
    • commons-httpclient 3.1 (1 CVE): EOL since 2007 — migrate to Apache HttpClient 4.x or 5.x (already in project).
    • commons-configuration 1.10 (1 CVE): EOL — migrate to commons-configuration2.
    • commons-fileupload 1.6.0 (7 CVEs): EOL — set strict multipart.maxFileSize / multipart.maxRequestSize; migrate to commons-fileupload2 (Jakarta) or Spring MultipartResolver.
    • commons-io 2.21.0 (2 CVEs): on latest 2.21 line; CVE around untrusted file paths. Validate all paths before FileUtils / IOUtils operations.
  • [ ] T2.7 — Apache Tomcat 9.0.x hardening (1 CVE in tomcat-juli, 1 in tomcat-servlet-api)

    • Disable AJP connector unless required (CVE-2020-1938).
    • Set allowedRequestAttributesPattern strict.
    • Follow Tomcat 9 hardening guide.
  • [ ] T2.8 — Apache Log4j 2.25.x hardening (13 CVEs across log4j-core, log4j-api, log4j-1.2-api)

    • Set log4j2.formatMsgNoLookups=true defensively.
    • Don't include user data in log message patterns.
    • Restrict log destinations if log data is sensitive.
  • [ ] T2.9 — Apache PDFBox 2.0.31 hardening (8 CVEs)

    • Set org.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true.
    • Limit untrusted PDF processing; sandbox where possible.
    • Plan migration to PDFBox 3.x when the project moves to Java 11+.
  • [ ] T2.10 — Apache POI 5.2.x hardening (7+ CVEs across poi-core, poi-ooxml, poi-scratchpad)

    • Reject untrusted Office files.
    • Sandbox POI processing; consider Apache Tika for parsing user uploads.
  • [ ] T2.11 — SnakeYAML 2.6 + 1.23 hardening (8 + 8 CVEs)

    • Use SafeConstructor; never pass Constructor to untrusted YAML.
    • Set LoaderOptions.setAllowUnknownTags(false).
    • Cap input size.
  • [ ] T2.12 — Xerces 2.12.2 hardening (5 CVEs)

    • Set http://apache.org/xml/features/disallow-doctype-decl=true and other safe-features.
    • Disable external entities.
  • [ ] T2.13 — Eclipse Jetty 9.4.58 hardening (29 + 1 + 3 + 2 CVEs across jetty-server, jetty-util, jetty-http2-*)

    • Set HttpConfiguration.setSendServerVersion(false), max header size, request attribute pattern.
    • Disable HTTP/2 if not needed: remove the http2-* modules from the assembly.
    • Follow Jetty 9.4 hardening guide.
  • [ ] T2.14 — Hibernate 5.6.x + Hibernate Validator 6.2.x hardening (3 + 4 CVEs)

    • Use HQL parameter binding; never build HQL from user input.
    • Disable message interpolation in ConstraintValidator for user-controlled messages.
  • [ ] T2.15 — MyFaces 2.3.11 hardening (2 CVEs)

    • Disable ViewState compression if not required; set org.apache.myfaces.SECRET to a strong value; enable strict_jar_in_filesystem.
  • [ ] T2.16 — OWASP AntiSamy 1.7.8 + ESAPI 2.7.0 hardening (7 + 7 CVEs)

    • Update the AntiSamy policy file to the latest rules.
    • Set strong master key + salt for ESAPI; rotate; ESAPI 2.x is in maintenance mode.
  • [ ] T2.17 — Library replacements for EOL dependencies (15+ artifacts)

    • jasypt 1.9.3 → Spring Security Crypto (BCryptPasswordEncoder / SCryptPasswordEncoder / StandardPasswordEncoder PBKDF2). CVE-2023-24 is a timing attack on PBE.
    • bsh 2.0b6 → JEXL or Groovy. RCE in BeanShell 2.0b6.
    • jtds 1.3.1 → Microsoft's official mssql-jdbc (already in project).
    • sanselan 0.97-incubator → Apache Commons Imaging.
    • axis 1.4.x → CXF (already in project) or JAX-WS RI. If migration impossible: restrict to localhost, disable unused RPC handlers via server-config.wsdd.
    • jettison 1.5.4 → Jackson (already in project).
    • json-lib 2.4 → Jackson (already in project).
    • rhino 1.7.15.1 → GraalVM JavaScript or Nashorn (JDK 8 has Nashorn built-in).
    • shindig 1.1-BETA5-incubating → review whether this is still in use; if not, remove. If yes, replace with a current gadget container (no Java 1.8 option exists; consider removing gadgets).
    • soap 2.3.1 → JAX-WS RI (jakarta.xml.ws:jaxws-api or javax.xml.ws:jaxws-api).
    • rhino 1.7.15.1 → JDK Nashorn (built-in) or GraalVM.
  • [ ] T2.18 — Apache Derby 10.14.2.x hardening (7 CVEs)

    • Bind only to localhost or private interface.
    • Enable authentication (derby.user.*) and SSL.
  • [ ] T2.19 — Spring LDAP 2.4.4 hardening (3 CVEs)

    • Validate all DN inputs to prevent LDAP injection.
    • Use LdapTemplate with parameterized queries.
  • [ ] T2.20 — Other minor deps (commons-net 3.12.0, dom4j 2.1.5, jdom 2.0.6.1, jaxen, json 2025-12-24, etc.)

    • See the full per-GAV table in categorized-final.json under NO_JAVA8_UPGRADE for the complete list of 100 GAVs.

Acceptance criteria

  • For each sub-task: the GAVs listed in the sub-task are documented as mitigated in SECURITY.md (or in a new docs/SECURITY-MITIGATIONS.md).
  • For each sub-task: the OWASP dependency-check suppression XML (owasp-suppressions.xml) records the specific CVE + GAV + mitigation, with a notes field describing the mitigation. No broad "suppress everything" entries.
  • For each EOL replacement (T2.17): the replacement library is in use, the old GAV no longer appears in the dependency graph, and any call sites have been migrated.

Out of scope

  • Java 11+ migration. The main branch stays on Java 1.8. A future major branch may tackle the migration; the Tier 2 GAVs in this issue would then be closed by that move.

References

  • Full analysis: docs/ai-generated/tasks/PR#-DependencyVulnerabilityAnalysis/main-vulnerability-report.md
  • Machine-readable per-GAV data: docs/ai-generated/tasks/PR#-DependencyVulnerabilityAnalysis/categorized-final.json (keys UPGRADE_REQUIRES_NEWER_JAVA and NO_JAVA8_UPGRADE)
  • Per-module OWASP HTML reports at <module>/target/dependency-check-report.html
  • Parent task (the 19 GAVs that CAN be upgraded on Java 1.8): see related issue in this milestone.

Metadata

Metadata

Assignees

No one assigned

    Labels

    dependenciesPull requests that update a dependency file

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions