Jackson, the library that turns incoming JSON into Java objects inside most of the server software your business runs, has patched the third place where the same permission check was missing. CVE-2026-59889 is not a memory-corruption bug or a route to remote code execution. It is quieter, and for the applications it touches it is worse: a caller with a low-privilege account can write fields that were meant to be reserved for administrators.
It fires against one specific pattern, and that pattern is common. Teams use Jackson's @JsonView feature, an annotation that tags each field with a named view so the application only reads or writes the fields belonging to the caller's view, as a write-side permission gate. Group your privileged fields under one view, bind an untrusted request under a public view, and in theory those privileged fields are unreachable. This flaw reopens that door for one field arrangement.
Who is exposed, and who is not
You are exposed only when three things line up. Your code uses @JsonView to decide which fields an incoming request may set. A privileged field carries both @JsonView, pointing at a restricted view, and @JsonUnwrapped, the annotation that flattens a nested object's fields up into the parent so a group of related fields reads and writes as if it were top-level. And a public path deserializes attacker-influenced JSON under a stricter active view.
When those hold, the flattened group is written straight from the request even though the active view should have excluded it. The advisory gives a concrete shape: a self-service registration endpoint that binds the request body under a public view, with the role and account-balance fields placed in an unwrapped sub-object tied to an admin-only view. An untrusted caller sets them anyway. That is a classic mass-assignment problem, where a request quietly sets fields the caller was never meant to control, and here it lands as privilege escalation.
GitHub scores it 6.5 out of 10 on the CVSS 3.1 scale, reflecting integrity-only impact and the need for a low-privilege foothold to send the request. Snyk, using the newer CVSS 4.0 scale, puts it at 7.1. There is no public report of exploitation, and its EPSS exploit-probability score sits in the 34th percentile. Treat it as an urgent audit-and-patch item, not an active incident.
What actually broke
When Jackson meets an @JsonUnwrapped property, it buffers the JSON and replays it against the sub-object's properties. On that replay path, the internal handler set each property without first asking whether the property is visible in the active view. Everywhere else in the library, that question gets asked: a visibleInView check against the active view decides whether a field is in scope. On the unwrapped-property path it was simply absent.
One detail matters for triage, and the advisory is explicit about it. The fields inside the unwrapped sub-object are still gated correctly by their own deserializer. What went unchecked is the view on the container property, the unwrapped group as a whole. So the entire flattened block slips through as a unit, not field by field.
One missing check, three code paths
This is where the story stops being a single bug. The same view check was already added to the constructor-parameter path in an earlier fix, Jackson issue #5971, tracked as GHSA-rcqc-6cw3-h962. The current release extends the identical guard to two more routes: the regular-property path that carries CVE-2026-59889, and a separate bypass on external-type-id properties tracked as GHSA-mhm7-754m-9p8w. Three distinct deserialization routes, one root cause: a check present in one place and missing in the others.
That is the real signal for a defender. When the same authorization check has to be retrofitted onto path after path, the annotation was never an authorization boundary to begin with. @JsonView was built to shape which fields get written into and out of JSON, not to enforce who is allowed to set them.
Find your exposure before you patch
Start in your own code. Search every Java service for properties that carry both @JsonView and @JsonUnwrapped, and for write paths that set an active view, through calls like readerWithView, withView, or a configured default view on deserialization. That pairing next to a restricted view is the exact at-risk shape. No matches, and you can move this down the queue.
Then count your copies. jackson-databind is rarely a dependency you picked on purpose. It rides in transitively under Spring, Elasticsearch clients, cloud SDKs and hundreds of other libraries, so a single application often pulls several versions at once. Your software bill of materials or your software composition analysis is the fastest way to enumerate them, the same transitive-copy problem the last jackson-databind advisory turned on.
Runtime detection is thin, which is the nature of this bug class: the request is well-formed JSON, and nothing looks malformed until a privileged field changes value. Your advantage is in the authorization tests and the audit, not the alert. Watch for unexpected writes to privileged fields through endpoints that should never touch them, the same instinct behind catching an authorization gap that hands back data the caller should not see.
Patch, then stop trusting the annotation
The fix is a version bump.
| Release line | Affected | Patched |
|---|---|---|
| jackson-databind 2.18.x | 2.18.0 to 2.18.8 | 2.18.9 |
| jackson-databind 2.21.x | 2.21.0 to 2.21.4 | 2.21.5 |
| jackson-databind 2.22.x | 2.22.0 | 2.22.1 |
| tools.jackson.core 3.1.x | 3.0.0 to 3.1.4 | 3.1.5 |
| tools.jackson.core 3.2.x | 3.2.0 | 3.2.1 |
Upgrade jackson-databind to 2.18.9 on the 2.18 line, 2.21.5 on the 2.21 line, or 2.22.1 on 2.22. On the 3.x line, published as tools.jackson.core, move to 3.1.5 or 3.2.1. Everything from 2.18.0 through those releases on each line carries the flaw.
The version bump closes this instance. The pattern is the thing to fix for good. If @JsonView is currently the only thing standing between an untrusted caller and a privileged field, add a real control underneath it: check the caller's role before binding, or bind untrusted input to a dedicated object that only holds the fields that caller is allowed to set, so a missed annotation cannot become a privilege grant. The teams burned least by the next Jackson view bug are the ones that never treated a serialization annotation as their access-control layer. As with other data-binding flaws, the danger concentrates exactly where untrusted input becomes live object state.