Coordinated disclosureCVE-2026-64606Apache Fory · JavaCISA ADP · 9.8 Critical

Proof/CVE-2026-64606

CS.06 — Published CVE

Strict mode still trusted the wrong interface.

Apache Fory's Java deserializer correctly rejected an ordinary unregistered lambda capture class. An interface with the same job slipped through — because "no default methods" was treated as proof the type was inert. It wasn't; it still ran attacker-controlled code.

CVECVE-2026-64606
Componentfory-core · Java
Affected< 1.4.0
Fixed1.4.0
ApacheImportant
CISA ADP9.8 Critical
ReporterCharles Vosburgh
Strict class registration was enabled. The receiver registered zero application classes. Executable code still crossed the boundary.
Weakness
CWE-502
Trigger
SerializedLambda
Control
Ordinary class rejected
Outcome
Behavior during deserialize()
Public-safety boundary.This page explains the policy failure, validation method and remediation boundary. It intentionally omits the reusable weaponized payload generator. Apache Fory 1.4.0 fixes the issue.

Class registration is one of the controls that makes a general-purpose object serializer usable at a trust boundary. When a receiver enables strict registration, an unregistered application class should not become executable simply because its name appears in attacker-controlled bytes.

With strict registration enabled, an unregistered application type must not participate in executable deserialization.

The bug was not that Fory could deserialize Java lambdas. The bug was that one part of the policy classified an interface as a harmless class token while another part of the runtime used that same interface as executable lambda-restoration code.

The vulnerable rule admitted interfaces that had no Java default methods. For ordinary type tokens, that can look like a reasonable compatibility exception. For a SerializedLambda capture class, it was the wrong property to test.

Condensed policy pathClassResolver → SerializedLambda
strict mode:
  allow registered classes
  allow known safe tokens
  allow interface when !hasDefaultMethods(interface)

lambda restore:
  load capturing class
  checkClassForDeserialization(capturingClass)
  invoke SerializedLambda restoration

A Java interface can contain executable static methods without containing a single default method. When a serializable lambda is defined there, the compiler can emit both a lambda body and a generated $deserializeLambda$ restoration method. The interface passes the “no default methods” test and still acts as executable restoration machinery.

01 · Bytes

Serialized graph

Attacker controls lambda metadata and captured arguments.

02 · Policy

Safe interface rule

No default methods becomes an admission signal.

03 · Restore

SerializedLambda

Generated capture-class restoration code is invoked.

04 · Trigger

PriorityQueue

Comparator runs while the object graph is rebuilt.

1

Payload created in a permissive writer

A separate sender JVM serialized a comparator lambda and attacker-controlled captured data. The receiver did not share registration state with the writer.

2

Strict receiver started clean

The reader used requireClassRegistration(true) and registered zero application classes.

3

Ordinary class control failed

The equivalent unregistered capture class was rejected. This proved the registration boundary was active rather than accidentally disabled.

4

Capture interface was auto-admitted

The interface had no default methods, so the generic safe-token exception approved it even though it contained generated lambda restoration code.

5

Restored comparator ran during reconstruction

Fory rebuilt a PriorityQueue. Queue reconstruction invoked the restored comparator inside deserialize(), reaching the captured behavior before the call returned.

The finding was promoted only after the successful case, the negative control and the fixed control were retained together.

Negative control

Ordinary class

Unregistered capture class rejected with strict registration active.

Vulnerable path

Capture interface

Unregistered interface admitted; restored behavior invoked during deserialization.

Fixed control

Executable policy

Capture class blocked before lambda restoration when explicit policy is enforced.

CONTROL ordinary unregistered capturing class rejected: PASS STRICT reader registered zero application classes UNREGISTERED capturing interface auto-admitted ATTACKER-CONTROLLED behavior invoked during deserialize DESERIALIZATION-TIME comparator execution: PASS MARKER=FORY_REGISTRATION_BYPASS

A type filter that runs after code-bearing restoration is not a security boundary. Neither is a generic “safe token” exception when that token becomes a callback target in a specialized deserializer.

The durable engineering rule is to classify a type by what the current path will do with it—not only by its surface syntax. In this path, the capture interface was not inert metadata. It was executable restoration state.

The SecHive research loop

Agents widened the search. Evidence narrowed the claim.

The AI-assisted workflow did not stop at a source warning. Each stage had to produce evidence or a refutation before the candidate could move forward.

SK.01

Source mapping

Trace capture-class metadata into the active registration policy and isolate the exception.

SK.02

Language hypothesis

Challenge the assumption that “no default methods” means “no executable behavior.”

SK.03

Runtime construction

Build the smallest graph that restores the lambda and naturally invokes it during deserialization.

SK.04

Skeptic gate

Separate JVMs, zero registrations, ordinary-class negative control, exact marker and fixed control.

HUMAN

Promotion and disclosure

Review the source, replay, impact, version range, wording and public-safety boundary before reporting.

Apache's advisory classifies CVE-2026-64606 as Important. CISA's ADP supplied the 9.8 Critical CVSS 3.1 vector displayed by NVD. NVD had not yet published its own assessment when this article was prepared.

Important
Apache advisory severity
9.8
CISA ADP · CVSS 3.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

The network score models an application that accepts Fory bytes from a remote, unauthenticated source and deserializes them automatically. The vulnerability is in the library boundary; actual deployment exposure still depends on whether untrusted bytes reach that API.

Package lineageAffected rangeFixed
org.apache.fury:fury-core0.5.0 to < 0.11.0Move to current Fory lineage
org.apache.fory:fory-core0.11.0 to < 1.4.01.4.0

The fix is not “look for this one interface.” The durable rule is that executable lambda metadata must not inherit trust from a generic class-token exception.

  1. Upgrade to Apache Fory 1.4.0 or later.
  2. Keep class registration enabled for untrusted data.
  3. Validate every application class that participates in lambda restoration under the active policy.
  4. Apply the same review to capture classes, implementation classes and other class-bearing lambda metadata.
  5. Add regression tests where interfaces contain generated static restoration methods but no Java default methods.
2026-07-11
Runtime validation completed against released Fory packages.
JULY 2026
Private coordination with Apache Fory and Apache Security.
2026-07-20
Apache Fory 1.4.0 released.
2026-07-21
CVE-2026-64606 published; Charles Vosburgh credited as reporter.
2026-07-22
Public proof-first writeup prepared after coordinated disclosure.

The bug lived between abstractions. Java said the interface had no default methods. The generic policy treated the interface as a safe token. SerializedLambda treated it as executable restoration code. A collection invoked the restored lambda while rebuilding attacker-controlled state.

The CVE is the identifier. The negative control is what made the claim defensible.
  1. Apache oss-security advisory for CVE-2026-64606
  2. NVD record and CISA ADP CVSS assessment
  3. Apache Fory 1.4.0 release
  4. Apache Fory Java configuration guidance
  5. Earlier SerializedLambda/class-policy hardening context

Credit: Discovered and reported by Charles Vosburgh. Research was AI-assisted through source mapping, hypothesis generation, runtime construction and skeptical validation; final review and disclosure ownership remained human.