CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-55223

CVE-2026-55223: Remote Code Execution via Deserialization Gadget Chain in c3p0 Connection Pooling Library

Alon Barad
Alon Barad
Software Engineer

Jul 23, 2026·6 min read·75 visits

Executive Summary (TL;DR)

c3p0 versions prior to 0.14.0 contain a deserialization gadget where JavaBean introspectors trigger getConnection() or getPooledConnection() on deserialized DataSources, leading to RCE via malicious JDBC URLs or JNDI lookups.

An untrusted deserialization vulnerability exists in the c3p0 JDBC connection pooling library before version 0.14.0. Standard JDBC getter methods conform to the JavaBean property getter pattern, allowing introspection libraries like Apache Commons BeanUtils to evaluate connection properties dynamically during deserialization, leading to arbitrary code execution when chained with a vulnerable database driver or JNDI sink.

Vulnerability Overview

The open-source library c3p0 serves as a JDBC connection pooling manager in enterprise Java applications. By automating the creation, reuse, and disposal of database connections, it optimizes application performance and database interaction. The library exposes public classes that implement the standard JDBC javax.sql.DataSource and javax.sql.ConnectionPoolDataSource interfaces to allow seamless integration into enterprise frameworks.\n\nBecause c3p0 functions within complex enterprise application containers, its classes are frequently instantiated, configured, and serialized. To facilitate runtime properties management, modern frameworks heavily depend on dynamic serialization and JavaBean introspection. This architecture relies on the implicit trust of underlying property names and getter methods, exposing a wide attack surface if untrusted inputs influence object configuration.\n\nIn environments where c3p0 is present on the application classpath alongside an introspection-driven deserialization library, this architectural design introduces a critical weakness. An attacker who is able to submit crafted serialized Java objects can exploit the trust relationship between dynamic reflection and connection configuration. This vulnerability allows an attacker to control the target database URI and trigger connection attempts, leading to remote code execution under specific circumstances.

Root Cause Analysis

The root cause of this vulnerability lies in the conflict between the standard JavaBean design conventions and the JDBC specification. Under standard JavaBean rules, any public parameterless method starting with get followed by an uppercase letter is interpreted as a getter for a readable property. When JavaBean helper libraries like Apache Commons BeanUtils scan a class, they translate these getter methods into readable and writable properties.\n\nIn the JDBC specification, the javax.sql.DataSource interface defines the getConnection() method to obtain a database connection, while the javax.sql.ConnectionPoolDataSource interface defines getPooledConnection(). Because these methods match the standard getter signature, standard JDK java.beans.Introspector registers connection and pooledConnection as readable properties. Consequently, utility methods that dynamically query properties will implicitly execute the database connection process.\n\nDuring standard deserialization of dynamic objects, libraries like Apache Commons BeanUtils utilize a BeanComparator to evaluate and compare properties across objects. When a deserialized payload triggers a comparison, the comparator invokes the configured property getter via reflection. If the compared target is a c3p0 DataSource, resolving the connection property forces a call to getConnection(), triggering an active TCP connection to an attacker-controlled endpoint.

Code Analysis

The developer addressed the vulnerability in version 0.14.0 by introducing a custom BeanInfo code generation mechanism to modify the exposed metadata of c3p0 classes. In Java, providing an explicit BeanInfo implementation in the same package as the target bean class overrides the automatic reflective discovery performed by the JDK Introspector. The class C3P0BeanInfoGen generates these descriptor files during the project's build phase.\n\njava\npackage com.mchange.v2.c3p0.beaninfo;\n\nimport java.io.*;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.Set;\nimport com.mchange.v2.codegen.bean.BeanInfoGen;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\npublic final class C3P0BeanInfoGen\n{\n final static Set excludedPropertyNames;\n final static Set excludedPropertyTypes;\n\n static\n { \n // Explicitly blacklists the dangerous property names to hide them\n Set tmp0 = new HashSet();\n tmp0.add(\"connection\");\n tmp0.add(\"pooledConnection\");\n excludedPropertyNames = Collections.unmodifiableSet(tmp0);\n\n // Explicitly blacklists return types that trigger database interactions\n Set tmp1 = new HashSet();\n tmp1.add( java.sql.Connection.class );\n tmp1.add( javax.sql.PooledConnection.class );\n excludedPropertyTypes = Collections.unmodifiableSet(tmp1);\n }\n // ... (rest of code generation logic follows)\n}\n\n\nBy generating explicit BeanInfo descriptors that exclude the connection and pooledConnection properties, standard JavaBean reflection libraries can no longer find these properties. Consequently, attempts to dynamically resolve the \"connection\" property result in a standard property-not-found exception rather than executing the underlying database connection method. This mechanism cleanly severs the link between JavaBean introspection and JDBC execution, neutralizing the deserialization gadget path.

Exploitation Methodology

Exploitation of this vulnerability requires the presence of specific dependencies on the target application's classpath. The primary prerequisite is an active deserialization vector that parses attacker-supplied object streams. Additionally, an introspection-based deserialization carrier such as Apache Commons BeanUtils must be present to bridge the gap between deserialization and getter invocation.\n\nmermaid\ngraph LR\n A[\"Serialized Payload\"] --> B[\"PriorityQueue.readObject()\"]\n B --> C[\"BeanComparator.compare()\"]\n C --> D[\"PropertyUtils.getProperty()\"]\n D --> E[\"ComboPooledDataSource.getConnection()\"]\n E --> F[\"Remote Exploit Execution\"]\n\n\nThe attack sequence begins when the target system deserializes a crafted payload containing a PriorityQueue configured with a BeanComparator. During queue rebuilding, the comparator executes dynamic property resolution on the elements. This action triggers getConnection() on the deserialized c3p0 DataSource, forcing the library to establish a connection to the configured JDBC URL. The attacker controls this URL, pointing it to a rogue database (e.g., an H2 instance executing custom SQL command scripts) or an external JNDI service to load malicious byte code.\n\nBecause the exploit relies on third-party drivers or JNDI sinks to execute commands, the payload composition varies based on the classpath of the target. For instance, if the H2 database driver is present, the connection URL triggers SQL script evaluation, executing commands via a user-defined alias. Alternatively, a JNDI-backed DataSource configuration allows loading arbitrary class files via LDAP or RMI lookups.

Impact Assessment

The immediate impact of successful exploitation is remote code execution in the context of the running Java Virtual Machine. An attacker who successfully delivers a weaponized payload can run arbitrary system commands, potentially leading to a complete compromise of the underlying application server and hosting infrastructure.\n\nWhile the CVSS Base Score is calculated at 6.3, this reflects the moderate rating of c3p0 itself since the connection pooling library functions as an intermediate gadget rather than the final execution context. However, in practice, the technical severity depends on the classpath environment. If a vulnerable database driver or unmitigated JNDI sink is available, the impact escalates directly to a critical system compromise.\n\nFurthermore, the confidentiality, integrity, and availability of database assets connected to the application are severely threatened. Once code execution is achieved, the attacker can extract application database credentials, modify operational data, or disrupt business services by executing denial-of-service commands on host systems.

Remediation and Mitigation

To resolve the vulnerability, developers must upgrade the c3p0 connection pooling library to version 0.14.0 or newer. Upgrading ensures that the built-in BeanInfo files are present on the classpath, blocking reflective utilities from locating the connection-triggering properties.\n\nIf upgrading is not immediately possible, temporary workarounds should be applied to restrict the deserialization attack surface. The application should be configured to reject Java serialized objects from untrusted sources, transitioning to secure serialization alternatives like JSON or Protocol Buffers. Additionally, deploying look-ahead deserialization firewalls or custom ObjectInputStream filters can prevent the instantiation of dangerous classes like BeanComparator or c3p0 DataSources.\n\nEgress filtering must also be implemented on target servers to block unexpected outbound TCP connections. Restricting outbound connections to authorized database ports prevents the target from connecting to rogue external servers or fetching remote payloads via JNDI or HTTP channels.

Fix Analysis (1)

Technical Appendix

CVSS Score
6.3/ 10
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N
EPSS Probability
0.28%
Top 79% most exploited

Affected Systems

Java Enterprise Applications utilizing c3p0 and dynamic serialization frameworks like Apache Commons BeanUtils.

Affected Versions Detail

Product
Affected Versions
Fixed Version
c3p0
Steve Waldman
< 0.14.00.14.0
AttributeDetail
CWE IDCWE-502 / CWE-915
Attack VectorNetwork
CVSS v4.0 Score6.3
EPSS Score0.00284
Exploit StatusProof-of-Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1059Command and Scripting Interpreter
Execution
CWE-502
Deserialization of Untrusted Data

The application deserializes untrusted serialization streams without validating that the incoming objects are safe.

References & Sources

  • [1]Official GitHub Advisory Record
  • [2]Official Fix Commit Patch Code
  • [3]c3p0 v0.14.0 Release Page
  • [4]NVD CVE Detail
  • [5]CVE Org Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 day ago•CVE-2026-107844
5.3

CVE-2026-107844: Path Traversal Vulnerability in Contao ImagesController

A path traversal vulnerability (CWE-22) in Contao CMS allows unauthenticated remote attackers to bypass directory boundary restrictions in ImagesController and access files within the project directory.

Amit Schendel
Amit Schendel
8 views•5 min read
•1 day ago•CVE-2026-107848
3.5

CVE-2026-107848: Cross-Site Request Forgery (CSRF) in Contao Backend Actions via GET Requests

Contao Open Source CMS versions 4.0.0 through 5.3.49 and 5.4.0-RC1 through 5.7.11 contain a Cross-Site Request Forgery (CSRF) vulnerability in backend parameter handling. The `RequestTokenListener` component validates anti-CSRF tokens solely for HTTP POST requests, while GET-based declarative guards run only when an `act` parameter is present in the query string. Consequently, custom backend actions dispatched via alternative parameters such as `key=` can execute without CSRF token verification when triggered by an authenticated user.

Amit Schendel
Amit Schendel
8 views•5 min read
•2 days ago•CVE-2026-107843
5.3

CVE-2026-107843: Unthrottled Activation Email Resend and Account Enumeration in Contao CMS

Contao CMS versions 4.1.0 through 5.3.49 and 5.4.0-RC1 through 5.7.11 fail to validate form submission tokens and enforce rate limiting when processing activation email resend requests via HTTP POST, enabling resource exhaustion and account state enumeration.

Amit Schendel
Amit Schendel
8 views•4 min read
•2 days ago•CVE-2026-107842
5.3

CVE-2026-107842: Information Disclosure via Stale Indexing in Contao Search Module

An information disclosure vulnerability in Contao CMS allows unauthenticated site visitors to view protected page titles, URLs, and text excerpts through search queries when protected page indexing is disabled after previously being enabled.

Amit Schendel
Amit Schendel
10 views•4 min read
•2 days ago•GHSA-G38J-7V97-X298
6.5

GHSA-G38J-7V97-X298: Missing Authorization Check in Vikunja CalDAV Task Relation Creation

In Vikunja prior to version 2.6.0, relation creation via the CalDAV endpoint fails to invoke the TaskRelation.CanCreate authorization check. This missing access control allows an authenticated user to establish unauthorized relationships and perform write operations against any task, provided its unique identifier (UID) is known.

Alon Barad
Alon Barad
12 views•5 min read
•2 days ago•GHSA-3HC7-R24J-RPWC
6.8

GHSA-3hc7-r24j-rpwc: Cross-Project Task Disclosure via Subtask Expansion in Vikunja

A cross-project information disclosure vulnerability in Vikunja allows authenticated users with read access to one project to view private task details from unauthorized projects via subtask expansion parameters.

Alon Barad
Alon Barad
9 views•5 min read