Conversation
The whole Jackson family reaches this build transitively at 2.14.3 -- play-json 3.0.6 contributes core/annotations/databind/datatype-jdk8/datatype-jsr310, and scalatestplus-play -> play -> pekko-serialization-jackson contributes dataformat-cbor/module-parameter-names/module-scala on the test classpath. 2.14.3 is inside the affected range of the advisory, where jackson-core's non-blocking parser applies maxNumberLength to the digits in each fed chunk rather than to the number accumulated across feeds. play-json 3.0.6 is its newest release and still declares 2.14.3, so there is no upstream version carrying a fixed Jackson and the coordinates have to be named here. Two statements, two jobs, and neither does the other's. dependencyOverrides settles every configuration of THIS build -- the three artifacts that only reach the test classpath included -- and writes nothing into the published POM. The compile-scope libraryDependencies entries are what reach a CONSUMER: without them every consumer keeps resolving 2.14.3 through the play-json edge from a library that reads as fixed. Verified on the generated POM, which now carries the fixed versions at compile scope. The whole family moves rather than jackson-core alone: the datatype and dataformat modules compile against databind's internal serializer SPI and jackson-module-scala asserts its databind version at runtime, so a pin naming one coordinate trades an advisory for a latent AbstractMethodError. 2.22.2 rather than the advisory's own 2.18.8 floor -- both are out of range, and 2.22.2 is what platform and acumen already pin, so this library's tests resolve the Jackson its consumers actually run. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Aug 26, 2026
mbryzek
marked this pull request as ready for review
August 26, 2026 03:40
origin/main already pins the Jackson family to 2.22.2 (ISS-6227), which is above this advisory's 2.21.4 ceiling, so the resolved version needs no further change. What was missing is the assertion that holds it there: JacksonPinSpec's existing cases observe the nesting-depth limit, which shipped in 2.15.0, so a pin slipped anywhere into 2.15.0-2.18.7 or 2.19-2.21.3 passes both of them while being fully vulnerable to GHSA-r7wm-3cxj-wff9. The added case feeds ten 50-digit chunks against maxNumberLength=100 through the non-blocking parser. Measured against jackson-core 2.17.0 the two existing cases pass and this one fails, accepting all 500 digits.
…ing one The pin comment named only GHSA-h46c-h94j-95f3, whose floor is 2.15.0 -- so a reader lowering the pin to anywhere in 2.15.0-2.18.7 or 2.19-2.21.3 would find the comment agreeing with them while reintroducing this advisory. The floor is now stated as the range both advisories set. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…er guard ISS-6229 reached lib-cipher's main (#31) and edits the same two places this branch does: build.sbt's floor paragraph and JacksonPinSpec. Both assertions are kept -- main's PolymorphicTypeValidator case stays third as merged, this branch's chunked-number case becomes fourth. The scaladoc and the build.sbt paragraph are rewritten rather than concatenated: the two advisories share one affected range (<2.18.8 || 2.19.0-2.21.3), and main's text calls its own "the quietest of the three", a count that a fourth case falsifies. No pinned version changes -- build.sbt's diff against main is comment-only. Byte-identical to the resolution already on lib-util's and lib-ai's i6233, modulo the package name.
Owner
Author
|
Autonomously merging. Details: https://admin.plybk.us/admin/autonomy/decisions/adc-6c01ac12c51a430bb68786fc6409df00 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Security fix for GHSA-r7wm-3cxj-wff9 — jackson-core's async parser applies
maxNumberLengthto the digits in each fed chunk rather than to the number accumulated across feeds, so a value split acrossfeedInputcalls is never bounded at all.This was a RESUME. The PR was open with an earlier attempt's commits, and merge-on-ready returned it as
conflicts.What the conflict actually was
The branch predated ISS-6227, which landed on
mainthe same remediation this issue asks for: the whole Jackson family pinned to2.22.2, which is above this advisory's2.21.4ceiling. So the resolved version here already needs no change.The earlier attempt's diff, merged as-is, would have done two things it should not:
JacksonPinSpec.scala— a regression test ISS-6227 added, which the branch predates.libraryDependenciesat compile scope so that consumers inherit the floor.mainstates the opposite position explicitly and with reasoning — the pin "governs THIS build's resolution only ... and imposes no floor on a consumer. A consumer states its own, as platform and acumen do." Both real consumers do pin. Re-litigating that here would also have added five direct compile dependencies to this library's published POM, so the next Jackson advisory would need the whole family bumped in lockstep instead of consumers moving on their own schedule.Resolved by taking
main'sbuild.sbtwholesale. The version diff of this PR againstmainis now zero.What is left, and why it is not nothing
JacksonPinSpec's existing assertions observe the nesting-depth limit, which shipped in 2.15.0. A pin slipped anywhere into2.15.0–2.18.7or2.19–2.21.3passes both of them while being fully vulnerable to this advisory. Nothing in the repo held the pin above this floor.The added case feeds ten 50-digit chunks against
maxNumberLength=100through the non-blocking parser — 500 digits total, no single chunk over the limit.Verification
Measured, not assumed. The same suite, against two Jackson lines:
So the two pre-existing assertions cannot see this advisory, and the new one can.
ci/build.shgreen.Decisions & assumptions
main's consumer-floor policy rather than the earlier attempt's. Best design is one Jackson policy across the four libs, which is whatmainalready had for three of them — see lib-ai#60 for the fourth.main; both are out of range and 2.22.2 is what platform and acumen pin.maxNumberLength=100in the test rather than the 1000 default, so the case runs on small inputs and states its own bound rather than depending on a library default that may move.Alternatives considered
Resume: sibling of the
conflictsverdict on lib-util#30gh pr list --head i6233found this PR OPEN andMERGEABLE/CLEAN; it is updated in place, and no second PR was opened. The conflict the requeue named was lib-util's alone — main's ISS-6229 landed there only — so nothing here needed a merge resolution.What changed here. The
build.sbtpin comment named only GHSA-h46c-h94j-95f3, whose floor is 2.15.0. That is an incomplete list presented as a complete one: a reader lowering the pin to anywhere in 2.15.0-2.18.7 or 2.19-2.21.3 would find the comment agreeing with them while reintroducing this advisory, andJacksonPinSpec's two pre-existing assertions would pass. The floor is now stated as the range both advisories set — 2.18.8, or 2.21.4 on the 2.19 line. No pinned version changed; the comment is the whole of this commit.lib-util#30 states the same floor with a third advisory, GHSA-j3rv-43j4-c7qm, which main added there and has not reached this repo.
Decisions & assumptions
JacksonPinSpeccase this PR adds enforces that floor at build time, and the comment is what tells a reader the enforcement is deliberate rather than incidental.Verification
dev agent build -- ./ci/build.shgreen: 10 tests, 3 suites, 0 failed,scalafmtCheckAllandscalafmtSbtCheckclean. The pre-push hook re-ran the same script on the pushed tree and reported clean.Resume 3: main's ISS-6229 reached this repo, and conflicted
dev agent resume-check 6233found this PR OPEN; it wasMERGEABLE/CLEANat the start of this session and went CONFLICTING/DIRTY part-way through it, when ISS-6229 merged to this repo'smain. Updated in place; no second PR opened.What conflicted. ISS-6229 edits exactly the two files this branch edits, in exactly the same two places:
build.sbt's floor paragraph, andJacksonPinSpec, where it added a third assertion. lib-util#30 hit and resolved this same conflict one resume earlier; it reached this repo now.How it was resolved. Both assertions are kept: main's
PolymorphicTypeValidatorcase stays third exactly as merged, this branch's chunked-number case becomes fourth. The scaladoc and thebuild.sbtparagraph are rewritten rather than concatenated, because the two advisories describe the same affected range (<2.18.8 || 2.19.0–2.21.3) and main's text calls its own "the quietest of the three" — a count that stops being true with a fourth case. The comment now states the range once, attributes it to one databind advisory and one core advisory, and points each at its assertion.Verified by diff to be byte-identical to the resolution already on lib-util's, lib-ai's and lib-cipher's
i6233, modulo the package name. That is deliberate: these four libraries carry one Jackson policy, and this comment is the only place a reader learns why the pin may not be lowered.No pinned version changed.
build.sbt's diff againstmainis comment-only — every coordinate and version line is byte-identical to main's (2.22.2, annotations 2.22), checked mechanically.Verification
dev agent build -- ./ci/build.shgreen: 11 tests, 0 failed (up one from 10 — main's ISS-6229 case),scalafmtCheckAllandscalafmtSbtCheckclean. All fourJacksonPinSpeccases named in the log:The pre-push hook independently re-ran
ci/build.shon the pushed tree:pre-push: lib-cipher's ci/build.sh is clean.Siblings: lib-util#30, lib-query#31, lib-ai#60 — all four carry this same resolution.