CVE-2016-1000027
Critical · 9.8CVSS
9.8
EPSS
33.2%
Published
Jan 2, 2020
CISA due date
—
Cloudanix analysis
Some Java applications may let an attacker take control of the server if they accept unsafe serialized data from outside users.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Remote Code Execution
- Component
- Library
- Class
- Deserialization
- Remediation
- Workaround Only
- Effort
- High
- Patch risk
- High
What it actually does
This is a Java deserialization remote code execution condition in Spring Framework when an application uses Spring components or custom code to deserialize untrusted Java serialized data. If an exposed endpoint accepts attacker-controlled serialized objects and the runtime classpath contains a usable gadget chain, object deserialization can trigger attacker-controlled method execution before application authorization or business logic is reached. Successful exploitation can result in arbitrary command execution in the privileges of the Java application process, with full compromise of confidentiality, integrity, and availability for the affected service.
Why it matters to the business
An exposed vulnerable implementation can let an unauthenticated remote attacker take over an application server, steal application secrets, alter data, deploy malware, or disrupt service. The issue is implementation-dependent: organizations are most at risk where Spring-based services expose Java serialization endpoints, Spring HTTP Invoker-style remoting, or custom deserialization of request data. Although it is not listed in CISA KEV and is not known here as ransomware-associated, public exploitation techniques exist and the EPSS score indicates meaningful exploitation likelihood, so internet-facing or partner-facing Java services should be prioritized.
How an attack unfolds
An attacker first identifies a Spring-based service endpoint that accepts Java serialized objects, commonly through remoting interfaces, legacy integration endpoints, or custom request handlers. The attacker confirms that the endpoint passes untrusted input into Java deserialization, such as ObjectInputStream, Spring serialization utilities, or Spring remoting exporters. They then craft a serialized payload using a gadget chain available in the target application's classpath, often from common Java libraries. When the vulnerable service deserializes the payload, gadget methods execute during object reconstruction, allowing the attacker to run commands, load additional code, open a reverse shell, write files, or pivot to application credentials and internal systems. Authentication may be required in some deployments, but if the vulnerable endpoint is exposed without authentication, exploitation can be fully remote and unauthenticated.
How to fix it
The primary mitigation is to remove Java native deserialization of untrusted data. Do not expose endpoints that accept arbitrary Java serialized objects from users, partners, browsers, message queues, or other untrusted sources. Replace Java serialization with safer formats such as JSON or Protocol Buffers with strict schema validation. Where deserialization cannot be immediately removed, enforce authentication and authorization before deserialization where architecturally possible, restrict network access to trusted callers only, apply JEP 290 object input filters or equivalent allowlists, reject unexpected classes, and remove unnecessary gadget libraries from the runtime classpath. Upgrade affected components to fixed package versions where available: Chainguard mysql-8.0, mysql-8.0-dev, mysql-8.0-oci-entrypoint, mysql-8.0-oci-entrypoint-compat, and mysql-8.0-client should be updated to 8.0.38-r0 or later; spring-projects/spring-framework should include commit 5a30a43b753a971ac8bf4005a8ccddeaff439d7e or a later fixed release/branch equivalent. Because the vendor position notes that untrusted deserialization is not an intended use case, upgrading alone should not be treated as sufficient if the application still deserializes untrusted data.
How to confirm the fix worked
Inventory Java applications and containers for Spring Framework versions through 5.3.16 and for the affected Chainguard packages below their fixed versions. Use software composition analysis, Maven/Gradle dependency reports, container image scanning, and runtime classpath inspection to identify vulnerable Spring libraries and common gadget libraries. Review application routes, controllers, filters, remoting configuration, and integration endpoints for ObjectInputStream, SerializationUtils.deserialize, HttpInvokerServiceExporter, RemoteInvocationSerializingExporter, or any code accepting application/x-java-serialized-object. Confirm fixed state by verifying upgraded package versions, confirming vulnerable remoting/deserialization endpoints are removed or access-controlled, and testing that serialized Java object payloads are rejected before deserialization. Validate that object input filters are active and deny unexpected classes, and confirm network controls prevent untrusted clients from reaching any remaining legacy remoting interfaces.
Typical attack path
- Discover a Java/Spring service exposing legacy remoting, HTTP Invoker, or custom serialized-object endpoints.
- Send probes containing Java serialization magic bytes or serialized test objects to determine whether the endpoint deserializes attacker-controlled input.
- Identify usable gadget chains based on libraries present in the target application's classpath.
- Generate a malicious Java serialized payload designed to execute a command or load a second-stage payload during deserialization.
- Submit the payload to the vulnerable endpoint using the expected protocol, HTTP method, headers, or authentication context if required.
- Achieve code execution under the Java application account and establish persistence, exfiltrate secrets, move laterally, or disrupt the service.
How to detect it
Review web, reverse proxy, application server, EDR, container, and JVM logs for evidence of Java serialized payloads reaching Spring endpoints. Focus on requests with Content-Type application/x-java-serialized-object, request bodies beginning with Java serialization magic bytes AC ED 00 05, unusual POST requests to remoting or integration paths, and spikes in HTTP 500 responses with Java deserialization exceptions. In application logs, look for ObjectInputStream, StreamCorruptedException, InvalidClassException, ClassNotFoundException during deserialization, rejected object input filters, Spring remoting exporter stack traces, and references to known gadget classes such as InvokerTransformer or TemplatesImpl. In host and container telemetry, investigate java processes spawning shells or command interpreters, writing files to temporary directories, launching curl/wget/powershell, or making unexpected outbound connections shortly after suspicious HTTP requests. If available, correlate network captures or WAF logs for serialized Java payload signatures with process creation and outbound beaconing. Threat hunting should include both successful exploitation and failed probing, because attackers often test multiple gadget chains before achieving execution.
- Content-Type: application/x-java-serialized-object
- application/x-java-serialized-object
- AC ED 00 05
- org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter
- org.springframework.remoting.rmi.RemoteInvocationSerializingExporter
- org.springframework.util.SerializationUtils.deserialize
- java.io.ObjectInputStream
- java.io.StreamCorruptedException
- java.io.InvalidClassException
- java.io.InvalidClassException: filter status: REJECTED
- java.lang.ClassNotFoundException
- org.apache.commons.collections.functors.InvokerTransformer
- com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
- ysoserial
- /bin/sh -c
- cmd.exe /c
- powershell -enc
- wget http
- curl http
- java.lang.Runtime.exec
- java.lang.ProcessBuilder
What your security team should do
- Prioritize internet-facing and partner-facing Spring/Java services that expose remoting or serialized-object endpoints.
- Upgrade affected packages to the listed fixed versions, including Chainguard packages to 8.0.38-r0 or later and Spring Framework to a branch containing the fixed commit or later equivalent.
- Remove or redesign any feature that deserializes untrusted Java serialized data; treat this as the durable fix.
- If immediate redesign is not possible, restrict endpoint access at the network layer and require strong authentication before any deserialization path is reachable.
- Enable Java object deserialization allowlists/filters and log rejected classes for investigation.
- Search application code and configurations for ObjectInputStream, SerializationUtils.deserialize, HttpInvokerServiceExporter, RemoteInvocationSerializingExporter, and application/x-java-serialized-object.
- Hunt historical logs for serialized-object probes, deserialization exceptions, Java child process creation, suspicious outbound connections, and web requests followed by application crashes or shell activity.
- Remove unnecessary libraries that provide known deserialization gadget chains from application classpaths.
- Add regression tests that submit Java serialized payloads to public endpoints and verify rejection without deserialization.
The record
Pivotal Spring Framework through 5.3.16 suffers from a potential remote code execution (RCE) issue if used for Java deserialization of untrusted data. Depending on how the library is implemented within a product, this issue may or not occur, and authentication may be required. NOTE: the vendor's position is that untrusted data is not an intended use case. The product's behavior will not be changed because some users rely on deserialization of trusted data.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Maven | org.springframework:spring-web | 0 | 6.0.0 |
| Chainguard | apache-nifi | 0 | 0 |
| Chainguard | apache-nifi-compat | 0 | 0 |
| Chainguard | apache-nifi-toolkit | 0 | 0 |
| Chainguard | geoserver-2.26 | 0 | 0 |
| Chainguard | geoserver-2.26-community | 0 | 0 |
| Chainguard | geoserver-2.26-docker | 0 | 0 |
| Chainguard | geoserver-2.27 | 0 | 0 |
| Chainguard | geoserver-2.27-community | 0 | 0 |
| Chainguard | geoserver-2.27-docker | 0 | 0 |
| Chainguard | geoserver-2.28-community | 0 | 0 |
| Chainguard | geoserver-2.28-docker | 0 | 2.28.0-r0 |
| Chainguard | jenkins | 0 | 0 |
| Chainguard | jenkins-2.440 | 0 | 0 |
| Chainguard | jenkins-2.452 | 0 | 0 |
| Chainguard | jenkins-2.462 | 0 | 0 |
| Chainguard | jenkins-compat | 0 | 0 |
| Chainguard | jenkins-remoting | 0 | 0 |
| Chainguard | ontop | 0 | 0 |
| Chainguard | ontop-fips | 0 | 0 |
| Chainguard | seata | 0 | 2.5.0-r3 |
| Chainguard | seata-namingserver-oci-entrypoint | 0 | 2.5.0-r3 |
| Chainguard | seata-openjdk-17-compat | 0 | 2.5.0-r3 |
| Chainguard | seata-openjdk-21-compat | 0 | 2.5.0-r3 |
| Chainguard | seata-openjdk-8-compat | 0 | 2.5.0-r3 |
| Chainguard | seata-server-oci-entrypoint | 0 | 2.5.0-r3 |
| Debian:10 | libspring-java | 0 | 4.2.7-1 |
| Debian:11 | libspring-java | 0 | 4.2.7-1 |
| Debian:12 | libspring-java | 0 | 4.2.7-1 |
| Debian:13 | libspring-java | 0 | 4.2.7-1 |
| Debian:14 | libspring-java | 0 | 4.2.7-1 |
| Ubuntu:20.04:LTS | libspring-java | 0 | No fix |
| Ubuntu:22.04:LTS | libspring-java | 0 | No fix |
| Ubuntu:24.04:LTS | libspring-java | 0 | No fix |
| Ubuntu:Pro:14.04:LTS | libspring-java | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | libspring-java | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | libspring-java | 0 | No fix |
| Wolfi | apache-nifi | 0 | 0 |
| Wolfi | apache-nifi-compat | 0 | 0 |
| Wolfi | apache-nifi-toolkit | 0 | 0 |
| Wolfi | jenkins | 0 | 0 |
| Wolfi | jenkins-compat | 0 | 0 |
| Wolfi | jenkins-remoting | 0 | 0 |
| maven | org.springframework/spring-core | 4.1.4 | No fix |
Related vulnerabilities
- CVE-2025-41234 Description In Spring Framework, versions 6.0.x as of 6.0.5, versions 6.1.x and 6.2.x, an… Also affects org.springframework:spring-web
- CVE-2024-38820 Spring Framework DataBinder Case Sensitive Match Exception Also affects org.springframework:spring-web
- CVE-2024-38809 Applications that parse ETags from "If-Match" or "If-None-Match" request headers are… Also affects org.springframework:spring-web
- CVE-2024-22262 Applications that use UriComponentsBuilder to parse an externally provided URL (e.g. Also affects org.springframework:spring-web
- CVE-2024-22259 Applications that use UriComponentsBuilder in Spring Framework to parse an externally… Also affects org.springframework:spring-web
- CVE-2024-22243 Applications that use UriComponentsBuilder to parse an externally provided URL (e.g. Also affects org.springframework:spring-web
- CVE-2013-6429 The SourceHttpMessageConverter in Spring MVC in Spring Framework before 3.2.5 and… Also affects org.springframework:spring-web
- CVE-2026-22732 When applications specify HTTP response headers for servlet applications using Spring… Also affects apache-nifi