Skip to content

ISS-6229: record the databind floor GHSA-j3rv-43j4-c7qm sets, and assert it - #31

Merged
mbryzek merged 2 commits into
mainfrom
i6229
Aug 26, 2026
Merged

ISS-6229: record the databind floor GHSA-j3rv-43j4-c7qm sets, and assert it#31
mbryzek merged 2 commits into
mainfrom
i6229

Conversation

@mbryzek

@mbryzek mbryzek commented Aug 26, 2026

Copy link
Copy Markdown
Owner

Remediates GHSA-j3rv-43j4-c7qm (CVE-2026-54512) for this repository.

What this is

This branch was opened before ISS-6227 landed, and ISS-6227 pinned the same Jackson family
to the same 2.22.2 in all four libraries for a sibling advisory. The two branches collided;
this PR was returned to the queue as conflicts.

Resolved in favour of main. The version this issue asks for is already there — 2.22.2
is above every range GHSA-j3rv-43j4-c7qm names (<2.18.8, 2.19.02.21.3), so the
resolved classpath is not vulnerable and no version changes here. What is left is the
part of the remediation ISS-6227 had no reason to carry.

What the diff does

1. States the floor this advisory sets. The pin's comment recorded one floor — 2.15.0,
where jackson-core gained its nesting-depth limit (GHSA-h46c-h94j-95f3). This advisory rules
out the whole 2.15.02.18.7 span that leaves reading as available. A later sweep trimming
the pin to the documented floor would land inside this advisory and read as correct while
doing it. The comment now states both floors and which one binds.

2. Asserts it. JacksonPinSpec exists because the other two halves of this pin fail
silently; this one fails more quietly still. A type id carrying generics is validated by the
substring before the <, and the type arguments parsed out of the rest are resolved and
instantiated without ever being offered to the PolymorphicTypeValidator — so an allow-list
reports that it is in force while admitting anything smuggled into an allowed container's
parameter position. Nothing throws and nothing is logged. The new assertion allows exactly
one container and offers a denied type as its generic argument.

Verification

The assertion was checked against the floor rather than assumed — a test that passes on both
sides of a fix is not a regression test:

jackson third assertion meaning
2.18.7 fails — denied HashMap instantiated, nothing thrown bypass reproduces
2.22.2 passes — deserialization refused fix closes it

A first attempt at this assertion passed at 2.18.7 too; it was modelling the bypass wrongly
and was rewritten against the advisory's own proof-of-concept rather than kept.

Full suite green. ci/build.sh clean at push.

Decisions & assumptions

  • Kept dependencyOverrides; did not re-litigate it. This branch originally declared the
    coordinates compile-scope, arguing an override writes no floor into the published POM.
    main took the opposite view explicitly, in reviewed prose in the same file: it governs
    this build only and imposes nothing on consumers, who state their own. That is true —
    platform and acumen both pin 2.22.2 — and a library forcing a transitive floor on every
    consumer is the heavier contract. A merge-conflict resolution is the wrong place to reverse
    a decision that landed three commits earlier.
  • All four libraries stay byte-identical in this block. Divergence here is what the pin
    is guarding against.
  • The 2.14.32.22.2 bump this issue dispositioned is already on main in every one of
    the four repositories.

jackson-databind reached this build transitively on the 2.14 line, inside the affected
range of GHSA-j3rv-43j4-c7qm. play-json has no release above 3.0.6, so there is no
upstream version that carries a fixed databind and the coordinates are named here.

Declared rather than dependencyOverrides: an override is resolution-local and writes
nothing into the published POM, so consumers would keep resolving 2.14.3 through the
transitive edge.

The whole family is declared, not databind alone -- the datatype/dataformat/module
artifacts are not dragged forward by a databind bump and would be left on 2.14.3.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mbryzek
mbryzek marked this pull request as ready for review August 26, 2026 03:33
…ert it

The Jackson family pin that remediates this advisory is already on main: 2.22.2 is above
every range GHSA-j3rv-43j4-c7qm names, so the resolved classpath here is not vulnerable
and no version changes in this commit.

What the pin does not carry is the reason it may not move down. The floor comment states
2.15.0, the jackson-core nesting-depth floor, which leaves 2.15.0-2.18.7 reading as
available -- and that whole span is inside this advisory's range, so a later sweep
trimming the pin to the documented floor reintroduces it. The comment now states both
floors and which one binds.

JacksonPinSpec asserts the other two halves of the pin because they fail silently. This
one fails more quietly still: a type id carrying generics is validated by the substring
before the `<`, and the type arguments parsed out of the rest are resolved and
instantiated without being offered to the PolymorphicTypeValidator at all -- so an
allow-list reports that it is in force while admitting anything smuggled into an allowed
container's parameter position. The third assertion allows exactly one container and
offers a denied type as its generic argument. It was checked against the floor rather
than assumed: at 2.18.7 the denied type is instantiated and nothing is thrown, and at
2.22.2 the deserialization is refused.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mbryzek mbryzek changed the title ISS-6229: pin the Jackson family at 2.22.2 (GHSA-j3rv-43j4-c7qm) ISS-6229: record the databind floor GHSA-j3rv-43j4-c7qm sets, and assert it Aug 26, 2026
@mbryzek

mbryzek commented Aug 26, 2026

Copy link
Copy Markdown
Owner Author

@mbryzek
mbryzek merged commit f3f6874 into main Aug 26, 2026
2 checks passed
@mbryzek
mbryzek deleted the i6229 branch August 26, 2026 04:45
mbryzek added a commit that referenced this pull request Aug 26, 2026
…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.
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