CVE-2026-27830
Java vulnerability analysis and mitigation

Overview

CVE-2026-27830 is a remote code execution vulnerability in c3p0, a widely used JDBC Connection pooling library for Java, caused by unsafe deserialization of the userOverridesAsString property. All versions of com.mchange:c3p0 prior to 0.12.0 (including c3p0-loom) are affected. The vulnerability was disclosed by the maintainer on February 23, 2026, published to the GitHub Advisory Database on February 25, 2026, and to NVD on February 26, 2026. It carries a CVSS v4.0 base score of 8.9 (High) (GitHub Advisory, Red Hat Bugzilla).

Technical details

The root cause is classified under CWE-502 (Deserialization of Untrusted Data) and CWE-94 (Code Injection). Prior to v0.12.0, the userOverridesAsString property of c3p0's ConnectionPoolDataSource implementations was stored as a hex-encoded Java-serialized object. An attacker with low privileges and adjacent network access who can reset this property — either on an existing ConnectionPoolDataSource or via maliciously crafted serialized objects or javax.naming.Reference instances — can trigger deserialization of attacker-controlled data. The risk is compounded by a vulnerability in c3p0's dependency mchange-commons-java, which provided ungated support for remote factoryClassLocation values in JNDI references, enabling an attacker to embed JNDI references in the serialized payload that cause the JVM to download and execute code from an attacker-controlled remote location. The fix (commit e14cbd8) replaces the hex-serialized format with a safe CSV-based format and upgrades the dependency to mchange-commons-java 0.4.0+, which restricts remote factoryClassLocation by default (GitHub Advisory, c3p0 Commit).

Impact

Successful exploitation allows an attacker to execute arbitrary code on the application server within the JVM's classpath, resulting in full compromise of confidentiality, integrity, and availability of the vulnerable system and potentially subsequent systems. An attacker can exfiltrate sensitive data (e.g., database credentials, application secrets), modify application data, disrupt service availability, and use the compromised host as a pivot point for lateral movement within the network. The vulnerability affects any Java application using c3p0 < 0.12.0 that exposes ConnectionPoolDataSource objects via JNDI or allows modification of the userOverridesAsString property (GitHub Advisory, Red Hat Bugzilla).

Exploitation steps

  1. Reconnaissance: Identify applications using c3p0 < 0.12.0 that expose ConnectionPoolDataSource objects via JNDI interfaces or allow modification of the userOverridesAsString JavaBean property (e.g., through application configuration endpoints or management interfaces).
  2. Set up malicious JNDI server: Deploy a rogue LDAP or RMI server (e.g., using tools like marshalsec) that serves a malicious javax.naming.Reference pointing to a remote factoryClassLocation hosting attacker-controlled Java bytecode.
  3. Craft malicious payload: Construct a hex-encoded Java-serialized object for the userOverridesAsString property that embeds a javax.naming.Reference pointing to the attacker's JNDI server and remote class location.
  4. Inject the payload: Reset the userOverridesAsString property on the target ConnectionPoolDataSource — either by manipulating a serialized object delivered over a deserialization endpoint, via a JNDI lookup that returns a crafted ConnectionPoolDataSource, or through any interface that allows setting this JavaBean property.
  5. Trigger deserialization: Cause the application to deserialize the malicious userOverridesAsString value, which triggers dereferencing of the embedded javax.naming.Reference and a connection to the attacker's JNDI server.
  6. Remote code execution: The JVM downloads and executes the attacker-supplied class from the remote factoryClassLocation, achieving arbitrary code execution in the context of the application server process (GitHub Advisory, c3p0 Security Advisory).

Indicators of compromise

  • Network: Unexpected outbound LDAP (port 389/636) or RMI (port 1099) connections from the application server to external or unusual internal hosts; outbound HTTP/HTTPS connections to unknown hosts initiated by the JVM process (class loading from remote factoryClassLocation).
  • Logs: Java exceptions or stack traces referencing javax.naming.Reference, JNDI lookups, or deserialization errors in application logs; unexpected class loading events from remote URLs in JVM verbose class-loading logs.
  • Process: Unusual child processes spawned by the Java application server process (e.g., shells, network utilities like curl, wget, nc); unexpected network connections initiated by the JVM.
  • File System: Newly created or modified .class files or JAR files in temporary directories or application directories; unexpected web shells or scripts written by the application server process.

Mitigation and workarounds

The primary remediation is to upgrade c3p0 to version 0.12.0 or later, which replaces the unsafe hex-serialized userOverridesAsString format with a safe CSV-based format and upgrades the mchange-commons-java dependency to 0.4.0+, which restricts remote factoryClassLocation by default. There is no supported workaround for versions prior to 0.12.0. As additional defensive measures, implement Java deserialization filters (JEP 290) to block dangerous classes, restrict outbound network access from application servers to prevent JVM class loading from remote sources, and limit exposure of ConnectionPoolDataSource objects via JNDI. Vendor patches have been issued by Red Hat (RHSA-2026:3890, RHSA-2026:18054/18055/18059 for JBoss EAP 8.1), IBM (Business Automation Manager Open Editions), Oracle (April 2026 CPU), and Atlassian (May 19, 2026 security bulletin) (GitHub Advisory, Red Hat Bugzilla, Oracle CPU).

Community reactions

The vulnerability was originally researched and reported by Hans-Martin Münch (credited as 'dpp'), who published a blog post titled "c3p0, you little rascal" at Mogwai Labs detailing the attack surface (GitHub Advisory). The maintainer (swaldman) promptly disclosed and patched the issue. Coverage appeared across security news outlets including Heise (noting Atlassian products were affected) and community aggregators. The vulnerability attracted attention due to its similarity to well-known JNDI/deserialization attack chains (e.g., Log4Shell), though its adjacent-network attack vector and low-privilege requirement limit its scope compared to fully remote, unauthenticated vulnerabilities.

Additional resources


SourceThis report was generated using AI

Related Java vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

GHSA-p279-2cqp-84jgCRITICAL9.6
  • Java logoJava
  • org.openidentityplatform.opendj:opendj-server-legacy
NoYesJul 24, 2026
GHSA-fp43-vj7g-pg92HIGH7.5
  • Java logoJava
  • org.omnifaces:omnifaces
NoYesJul 24, 2026
GHSA-7ppr-r889-mcf2HIGH7.5
  • Java logoJava
  • org.http4s:http4s-blaze-server_2.12
NoYesJul 24, 2026
GHSA-mhvj-jhpq-885vHIGH7.4
  • Java logoJava
  • org.http4s:http4s-blaze-server_2.13
NoYesJul 24, 2026
GHSA-46q4-43ph-c6frHIGH7.4
  • Java logoJava
  • org.http4s:blaze-http_2.12
NoYesJul 24, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management