Skip to content

Commit ee1e2a8

Browse files
authored
Update fixture Jackson to 3.1.7 and route pinned Dependabot updates (#233)
Raise the Jakarta fixture's Spring Boot plugin-realm Jackson pin to 3.1.7 for GHSA-wv8q-qhhj-9h54 and GHSA-cxp5-3px4-pw24, superseding #231. Exclude the exact Jackson pins and the Maven wrapper distribution from the grouped Dependabot PR, and ignore Jackson minor/major version updates while Boot 4.1.1 stays on the 3.1 line. Security updates remain eligible. Record the #232 dispositions and revisit conditions, and add a policy test that keeps versioned ignore rules out of the broad group.
1 parent 454a07c commit ee1e2a8

6 files changed

Lines changed: 101 additions & 14 deletions

File tree

‎.github/CI_SECURITY.md‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,10 @@ configured. Review new action source and transitive downloads as well as pins.
8888
Do not dismiss alerts merely to reduce the count. Correct versions or graph
8989
semantics, submit the new graph, and let GitHub close packages that are no longer
9090
present.
91-
Baseline-sensitive API, JSP-engine and build-plugin dependencies are excluded
92-
from the broad Maven **version-update group**, so unsuppressed proposals receive
93-
individual review. Reviewed incompatible minor and major proposal classes use
91+
Baseline-sensitive API, JSP-engine and build-plugin dependencies, the exact Boot
92+
plugin-realm Jackson pins and the Maven distribution used by the wrapper are
93+
excluded from the broad Maven **version-update group**, so unsuppressed proposals
94+
receive individual review. Reviewed incompatible minor and major proposal classes use
9495
`ignore.update-types`; GitHub applies those rules only to version updates, so
9596
security updates remain eligible and the security-update group is unchanged.
9697
Dependabot classifies repeated Maven coordinates from their lowest occurrence;

‎.github/DEPENDENCY_DECISIONS.md‎

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Dependency proposal decisions — 1.5.0
22

33
Initial review: 2026-09-26. Focused API follow-up: 2026-09-27. Dependabot
4-
proposal-policy follow-up: 2026-09-28.
4+
proposal-policy follow-up: 2026-09-28. Jackson and proposal-routing follow-up:
5+
2026-10-05.
56

67
PRs [#176](https://github.com/OWASP/owasp-java-encoder/pull/176) and
78
[#188](https://github.com/OWASP/owasp-java-encoder/pull/188) mixed ordinary build
@@ -63,6 +64,42 @@ security suppression or published library dependency is added or changed.
6364
Verify both the resolved plugin closure and the packaged browser fixture in CI;
6465
a source-POM pin alone does not demonstrate the executed dependency version.
6566

67+
## Jackson 3.1.7 and proposal routing — 2026-10-05
68+
69+
[GHSA-wv8q-qhhj-9h54](https://github.com/advisories/GHSA-wv8q-qhhj-9h54)
70+
and [GHSA-cxp5-3px4-pw24](https://github.com/advisories/GHSA-cxp5-3px4-pw24)
71+
affect Jackson databind 3.0.0 through 3.1.6 and are fixed in 3.1.7. GitHub
72+
reported both against the Boot plugin-realm pin above. Raise databind and core in
73+
that realm to **3.1.7**. The scope, CI evidence and unchanged library dependencies
74+
from the 2026-09-28 fix still apply. Both advisories also list fixed 2.x releases;
75+
the core library's test-only Jackson 2.22.3 is already the fixed 2.22 release.
76+
This replaces security PR [#231](https://github.com/OWASP/owasp-java-encoder/pull/231),
77+
which failed only on the exact-version policy assertion.
78+
79+
Grouped PR [#232](https://github.com/OWASP/owasp-java-encoder/pull/232) mixed
80+
three different decisions:
81+
82+
- Its Jackson 3.2.3 proposal is not accepted. It moves Boot 4.1.1's plugin realm
83+
to a minor line that its buildpack platform was not built against, and the
84+
3.1 line already has the fix. The configuration ignores Jackson minor and major
85+
version updates; patch and security updates remain eligible.
86+
- Its Maven wrapper 3.10.0 proposal is not rejected, but it is a release-toolchain
87+
change. The configuration now excludes `org.apache.maven:apache-maven` from the
88+
broad group so it arrives as its own PR. That PR fails by design until it also
89+
updates the release enforcer range (`pom.xml`), `scripts/check-wrapper.py`,
90+
`scripts/check-reproducible.py`, BUILDING.md, README.md and RELEASING.md,
91+
keeps `mvnw.cmd` LF-normalized in the index (#232 committed CRLF), and records
92+
reproducibility evidence for the new Maven version.
93+
- Its commons-lang3 3.21.0 build-plugin update is routine and returns in the group.
94+
95+
The Jackson pin remains an exact policy-test value, so every Jackson proposal,
96+
including a security update, needs a matching change to that test and this
97+
record. Excluding Jackson from the broad group keeps such a proposal from blocking
98+
routine updates. Revisit when the Boot parent moves past 4.1.1: if its buildpack
99+
platform brings the same or a newer Jackson, remove the pin, its ignore rules and
100+
the policy assertion together. Enforcer rules do not inspect plugin realms, so a
101+
stale exact pin would silently downgrade Boot's own Jackson.
102+
66103
## Deferred proposals and reconsideration conditions
67104

68105
| Proposal | Disposition and required evidence before reconsideration |
@@ -94,10 +131,13 @@ record; a grouped PR closure is not proof that every proposed upgrade was applie
94131

95132
## Future Dependabot proposals
96133

97-
The [configuration](dependabot.yml) excludes the eleven baseline-sensitive
98-
coordinates above from the broad Maven **version-update group**. For the ten
99-
coordinates with a rejected proposal in #218–#227, it also ignores only the
100-
SemVer minor or major version-update classes covered by the decisions above.
134+
The [configuration](dependabot.yml) excludes fourteen coordinates from the broad
135+
Maven **version-update group**: the eleven baseline-sensitive coordinates above,
136+
the two Boot plugin-realm Jackson coordinates and the Maven distribution used by
137+
the wrapper. For the ten coordinates with a rejected proposal in #218–#227 and
138+
the two Jackson coordinates from #232, it also ignores only the SemVer minor or
139+
major version-update classes covered by the decisions above. The Maven wrapper
140+
has no ignore rule.
101141
This prevents the weekly job from recreating proposals that merely replace
102142
historical comparators, minimum-consumer fixtures, coherent servlet-engine
103143
lines, or reviewed tool majors. The accepted Felix Maven Bundle Plugin remains

‎.github/dependabot.yml‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ updates:
3232
- jakarta.el:jakarta.el-api
3333
- org.apache.tomcat.embed:tomcat-embed-jasper
3434
- org.apache.tomcat:tomcat-annotations-api
35+
# Exact Boot plugin-realm pins checked by CI policy tests.
36+
- tools.jackson.core:jackson-databind
37+
- tools.jackson.core:jackson-core
38+
# The wrapper's Maven version is a separately reviewed toolchain change.
39+
- org.apache.maven:apache-maven
3540
maven-security:
3641
applies-to: security-updates
3742
patterns: ['*']
@@ -83,6 +88,16 @@ updates:
8388
- dependency-name: org.apache.tomcat:tomcat-annotations-api
8489
update-types:
8590
- version-update:semver-major
91+
# Keep Boot 4.1.1's plugin realm on its own 3.1 line; patches and
92+
# security updates remain eligible.
93+
- dependency-name: tools.jackson.core:jackson-databind
94+
update-types:
95+
- version-update:semver-minor
96+
- version-update:semver-major
97+
- dependency-name: tools.jackson.core:jackson-core
98+
update-types:
99+
- version-update:semver-minor
100+
- version-update:semver-major
86101
- package-ecosystem: github-actions
87102
directory: /
88103
schedule:

‎CHANGELOG.md‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ unchanged. [1.5.0 is available from Central](releases/1.5.0-central-publication.
1313
- Discover release tags independently of commit ancestry so squash merges cannot
1414
leave the compatibility baseline stale; add isolated Git regressions.
1515
- Record verified 1.5.0 publication and replace pending-availability notices.
16-
- Update Jackson core/databind to 3.1.6 in the unpublished Jakarta fixture's
17-
Spring Boot Maven plugin realm for GHSA-q4xh-88c3-wmh7 and GHSA-wjgm-6hv5-3cvf.
18-
Published library dependencies and release artifacts are unchanged.
16+
- Update Jackson core/databind to 3.1.7 in the unpublished Jakarta fixture's
17+
Spring Boot Maven plugin realm for GHSA-q4xh-88c3-wmh7, GHSA-wjgm-6hv5-3cvf,
18+
GHSA-wv8q-qhhj-9h54 and GHSA-cxp5-3px4-pw24. Published library dependencies
19+
and release artifacts are unchanged.
20+
- Route Jackson plugin-realm pins and Maven wrapper upgrades out of the grouped
21+
Dependabot PR for individual review, and keep Jackson on its 3.1 line until the
22+
Boot parent moves. Security updates remain eligible.
1923

2024
## 1.5.0 — 2026-09-28 UTC
2125

‎jakarta-test/pom.xml‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
<tomcat.version>11.0.26</tomcat.version>
2727
<!-- Keep the client aligned with the reviewed, digest-pinned browser image. -->
2828
<selenium.version>4.49.0</selenium.version>
29-
<!-- GHSA-q4xh-88c3-wmh7 / GHSA-wjgm-6hv5-3cvf: Boot's separate plugin realm. -->
30-
<jackson.build.version>3.1.6</jackson.build.version>
29+
<!-- GHSA-q4xh-88c3-wmh7 / GHSA-wjgm-6hv5-3cvf / GHSA-wv8q-qhhj-9h54 /
30+
GHSA-cxp5-3px4-pw24: Boot's separate plugin realm. -->
31+
<jackson.build.version>3.1.7</jackson.build.version>
3132
<!-- Must equal the version in the root pom.xml so this app tests the
3233
encoder-jakarta-jsp built in the same reactor. CI checks this. -->
3334
<encoder.version>1.5.1-SNAPSHOT</encoder.version>

‎scripts/tests/test_ci_policy.py‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def test_dependabot_scopes_reviewed_ignores_to_version_updates(self):
213213
'version-update:semver-major'],
214214
'org.apache.tomcat:tomcat-annotations-api': [
215215
'version-update:semver-major'],
216+
'tools.jackson.core:jackson-databind': minor_and_major,
217+
'tools.jackson.core:jackson-core': minor_and_major,
216218
}
217219
self.assertEqual(expected, rules)
218220
self.assertEqual(
@@ -238,6 +240,30 @@ def test_dependabot_scopes_reviewed_ignores_to_version_updates(self):
238240
with self.subTest(mutation=name), self.assertRaises(ValueError):
239241
parse_dependabot_ignore(mutation)
240242

243+
def test_dependabot_routes_reviewed_coordinates_out_of_broad_group(self):
244+
dependabot = (ROOT / '.github/dependabot.yml').read_text()
245+
maven = dependabot.split('- package-ecosystem: maven', 1)[1]
246+
maven = maven.split('- package-ecosystem:', 1)[0]
247+
group = maven.split(' maven-dependencies:\n', 1)[1]
248+
group = group.split(' maven-security:\n', 1)[0]
249+
block = group.split(' exclude-patterns:\n', 1)[1]
250+
excluded = [line.split('- ', 1)[1].strip()
251+
for line in block.splitlines()
252+
if line.startswith(' - ')]
253+
self.assertEqual(len(excluded), len(set(excluded)))
254+
255+
# Pinned Boot plugin-realm Jackson and the wrapper's Maven distribution
256+
# need individual review; a mixed group PR cannot pass their checks.
257+
for coordinate in ('tools.jackson.core:jackson-databind',
258+
'tools.jackson.core:jackson-core',
259+
'org.apache.maven:apache-maven'):
260+
self.assertIn(coordinate, excluded)
261+
262+
ignore = parse_dependabot_ignore(maven.split(' ignore:\n', 1)[1])
263+
versioned = {name for name, update_types in ignore.items() if update_types}
264+
self.assertEqual(set(), versioned.difference(excluded))
265+
self.assertNotIn('org.apache.maven:apache-maven', ignore)
266+
241267
def test_only_executed_plugins_are_submitted(self):
242268
workflow = (ROOT / '.github/workflows/dependency-submission.yaml').read_text()
243269
self.assertIn('-DincludeArtifactIds=', workflow)
@@ -265,7 +291,7 @@ def test_only_executed_plugins_are_submitted(self):
265291

266292
def test_boot_plugin_jackson_fix_stays_in_its_own_realm(self):
267293
app = ET.parse(ROOT / 'jakarta-test/pom.xml').getroot()
268-
self.assertEqual('3.1.6', app.findtext(
294+
self.assertEqual('3.1.7', app.findtext(
269295
'p:properties/p:jackson.build.version', namespaces=version.NS))
270296
plugins = app.findall('p:build/p:plugins/p:plugin', version.NS)
271297
boot = next(plugin for plugin in plugins

0 commit comments

Comments
 (0)