Repository navigation
[epic] Mitigations for 117 GAVs that cannot be upgraded on Java 1.8 (closes 504 CVEs) #73
Description
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
AutoDetectParserwith an explicitDetector/Parsermap (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.
- Restrict Tika to a strict
-
[ ] T2.2 — ActiveMQ 5.16.x hardening (30 CVEs across activemq-client / broker / openwire-legacy)
- Change
<transportConnectors>inactivemq.xmlfromtcp://0.0.0.0:61616totcp://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.
- Change
-
[ ] 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/WSS4JOutInterceptorfrom the bus config). - Set
MessageSizeValidationlimits on inbound chains. - Apply strict schema validation on all incoming SOAP / XML.
- Disable WS-Security unless required (remove
-
[ ] 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=falseanduse-fresh-handler=trueinapplication.properties/rhythmyx.properties. - For
@ResponseBodymethods, returnResponseEntity<Resource>withContent-Disposition: attachment; filename="...". - Spring Security 5.8: ensure CSRF is enabled (default in 5.8+),
headers().defaultsDisabled(),SessionManagementFilterconfigured,DelegatingPasswordEncoderin use, nojsr250enabled.
-
[ ] T2.5 — XStream 1.4.21 hardening (37 CVEs)
- For every
XStreaminstance: callsetupDefaultSecurity()andXStream.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.fromXMLon untrusted input as RCE.
- For every
-
[ ] 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; setZipFile.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/Closurechain. - commons-collections 3.2.2 (2 CVEs): EOL — migrate to
commons-collections4(already in project). Replaceorg.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). Replaceorg.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 tocommons-fileupload2(Jakarta) or SpringMultipartResolver. - commons-io 2.21.0 (2 CVEs): on latest 2.21 line; CVE around untrusted file paths. Validate all paths before
FileUtils/IOUtilsoperations.
- commons-compress 1.28.0 (11 CVEs): validate archive entries before extraction; reject
-
[ ] 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
allowedRequestAttributesPatternstrict. - 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=truedefensively. - Don't include user data in log message patterns.
- Restrict log destinations if log data is sensitive.
- Set
-
[ ] 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+.
- Set
-
[ ] 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 passConstructorto untrusted YAML. - Set
LoaderOptions.setAllowUnknownTags(false). - Cap input size.
- Use
-
[ ] T2.12 — Xerces 2.12.2 hardening (5 CVEs)
- Set
http://apache.org/xml/features/disallow-doctype-decl=trueand other safe-features. - Disable external entities.
- Set
-
[ ] 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.
- Set
-
[ ] 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
ConstraintValidatorfor user-controlled messages.
-
[ ] T2.15 — MyFaces 2.3.11 hardening (2 CVEs)
- Disable
ViewStatecompression if not required; setorg.apache.myfaces.SECRETto a strong value; enablestrict_jar_in_filesystem.
- Disable
-
[ ] 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/StandardPasswordEncoderPBKDF2). 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-apiorjavax.xml.ws:jaxws-api). - rhino 1.7.15.1 → JDK Nashorn (built-in) or GraalVM.
- jasypt 1.9.3 → Spring Security Crypto (
-
[ ] 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
LdapTemplatewith 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.jsonunderNO_JAVA8_UPGRADEfor the complete list of 100 GAVs.
- See the full per-GAV table in
Acceptance criteria
- For each sub-task: the GAVs listed in the sub-task are documented as mitigated in
SECURITY.md(or in a newdocs/SECURITY-MITIGATIONS.md). - For each sub-task: the OWASP dependency-check suppression XML (
owasp-suppressions.xml) records the specific CVE + GAV + mitigation, with anotesfield 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
mainbranch 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(keysUPGRADE_REQUIRES_NEWER_JAVAandNO_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.
Activity
fix(security): T2.6 Apache Commons hardening (size caps on commons-fi…
fix(deps): EOL replace commons-lang 2.6 with commons-lang3 3.20.0 (#85)
fix(deps): EOL replace commons-collections 3.2.2 with commons-collect…
fix(security): T2.6 hardening: zip-bomb size caps on the remaining zi…
fix(security): T2.1 hardening: cap Tika input stream at 100 MB (issue #…
fix(security): T2.4 hardening: PSSecurityHeadersFilter for X-Frame-Op…
fix(security): JEXL template migration for Jackson return types from …
fix(security): JEXL template migration for Jackson return types from …
fix(security): T2.15 hardening: MyFaces SECRET (generated), COMPRESS_…
fix(security): T2.16: remove unused AntiSamy from classpath; retire 7…
fix(jcr): migrate JCR API from 1.0 (JSR-170) to 2.0 (JSR-283) (issue #…
fix(security): T2.4 follow-up: 2 more headers, harden sitemanage admi…
18 remaining items
docs(security): bulk backfill owasp-suppressions.xml + SECURITY-MITIG…
fix(security): T2.14 hardening: Hibernate ORM 5.6.15 + Validator 6.2.…
natechadwick-intsof commentedon Sep 17, 2026
Epic closed
Closing this epic as completed. All 20 sub-tasks are merged and closed.
What landed
Sub-task closures (20 / 20)
Closing artifacts on
maindocs/SECURITY-MITIGATIONS.md— 20 / 20 sub-task entries documenting per-GAV mitigations, merged PRs, and tests.owasp-suppressions.xml— 117<suppress>blocks covering 525 unique CVE aliases across the 117 Tier 2 + Tier 3 GAVs. Each<notes>element references the parent epic, the sub-task issue, the merged PR(s), and the mitigation description.modules/perc-security-utils/src/test/java/com/percussion/security/audit/HibernateConfigAuditTest.java— 3 tests, JUnit 4, scans every Spring bean XML + .properties + META-INF/validation.xml.projects/sitemanage/src/test/java/com/percussion/role/service/impl/PSRoleServiceUnsafeIdTest.java— 11 tests pinningcontainsUnsafeIdentifierCharagainst null, plausible names, SQL metacharacters, and C0/C1 control bytes.CVE disposition
owasp-suppressions.xmlwith notes pointing at the future Java 11+ migration epic.Out of scope (for a future epic)
docs/SECURITY-MITIGATIONS.mdandowasp-suppressions.xmlas the per-CVE close-out baseline.References
docs/SECURITY-MITIGATIONS.md(all 20 sub-task entries)owasp-suppressions.xmldocs/ai-generated/tasks/PR#-DependencyVulnerabilityAnalysis/categorized-final.json