Problem
When Phoenix Activation spawns a group JVM to host a remote service, the ActivationDesc object (containing initialization data and service configuration) is deserialized in the group JVM's execution context. DirtyChai enforces SerialObjectPermission in the calling JVM (typically the admin JVM that initiated service registration), but it is currently undocumented whether and how SerialObjectPermission is re-enforced when the group JVM deserializes this data during activation.
This creates a potential trust boundary gap: an admin JVM's restrictive policy may be bypassed if the group JVM's policy is more permissive, allowing gadget-chain deserialization attacks that the admin's policy would have blocked.
Investigation Scope
-
Current Behavior
- Determine the exact deserialization path when
ActivationDesc.initData (a MarshalledObject) is deserialized in the group JVM
- Identify whether standard Java
ObjectInputStream or JGDMS AtomicMarshalInputStream is used
- Document whether the group JVM's
SerialObjectPermission policy is consulted during deserialization
- Trace the
AccessControlContext that applies during group JVM bootstrap and activation
-
Policy Authority
- Clarify which policy is authoritative: admin's policy (where service was registered) or group JVM's policy (where service runs)?
- Determine how
ActivationDesc is stored and whether it carries metadata about intended policy restrictions
- Identify if policy mismatches between admin and group JVM can create bypass opportunities
-
Integration Points
- Analyze
SharedActivatableServiceDescriptor (service registration)
- Examine groupPerfect! I've found that JGDMS has issue templates available. Now let me fetch one JVM initialization (ActivationGroupImpl, ActivationInstantiator)
- Review how
ActivationDesc flows to understand the template format, then create an updated draft issue: from Phoenix daemon to group JVM
-
Remediation Options
- Propose explicit
SerialObjectPermission checks when group JVM deserializes activation data
- Evaluate whether policy should be enforced at group startup or per-deserialization
- Assess impact on backward compatibility and performance
- Recommend policy templates for secure group JVM configuration
Deliverables
- Detailed trace of deserialization path with code locations
- Assessment of current
SerialObjectPermission enforcement (present/absent/partialGood, there are templates available. Let me fetch them to understand the structure)
- Documentation of policy authority and potential gaps
- Design recommendation for full coverage with attack: scenario examples
- Proof-of-concept demonstrating policy bypass if vulnerabilities exist
References
- N-13 (Residual): Activation deserialization authority trust boundary gap from SECURITY_ANALYSIS.md
- PROCESS_ISOLATION.md §DirtyChai: SerialObjectPermission as JDK-level backstop
- JGDMS modules:
jgdms-rmi-tls, service-starter, phoenix-activation
Related to
Problem
When Phoenix Activation spawns a group JVM to host a remote service, the
ActivationDescobject (containing initialization data and service configuration) is deserialized in the group JVM's execution context. DirtyChai enforcesSerialObjectPermissionin the calling JVM (typically the admin JVM that initiated service registration), but it is currently undocumented whether and howSerialObjectPermissionis re-enforced when the group JVM deserializes this data during activation.This creates a potential trust boundary gap: an admin JVM's restrictive policy may be bypassed if the group JVM's policy is more permissive, allowing gadget-chain deserialization attacks that the admin's policy would have blocked.
Investigation Scope
Current Behavior
ActivationDesc.initData(aMarshalledObject) is deserialized in the group JVMObjectInputStreamor JGDMSAtomicMarshalInputStreamis usedSerialObjectPermissionpolicy is consulted during deserializationAccessControlContextthat applies during group JVM bootstrap and activationPolicy Authority
ActivationDescis stored and whether it carries metadata about intended policy restrictionsIntegration Points
SharedActivatableServiceDescriptor(service registration)ActivationDescflows to understand the template format, then create an updated draft issue: from Phoenix daemon to group JVMRemediation Options
SerialObjectPermissionchecks when group JVM deserializes activation dataDeliverables
SerialObjectPermissionenforcement (present/absent/partialGood, there are templates available. Let me fetch them to understand the structure)References
jgdms-rmi-tls,service-starter,phoenix-activationRelated to