CVE-2026-40899: Verified Reproduction
CVE-2026-40899: DataEase: JDBC parameter blocklist bypass via Lombok @Data setter exposure
CVE-2026-40899 is verified against dataease · github. Affected versions: <= v2.10.20. Fixed in v2.10.21. Vulnerability class: Auth Bypass. This medium reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00165.
What Is CVE-2026-40899?
CVE-2026-40899 is a medium-severity (CVSS 6.5) vulnerability in DataEase (CWE-915) that lets an authenticated administrator bypass the server-side JDBC parameter blocklist when configuring a datasource. Pruva reproduced it (reproduction REPRO-2026-00165).
CVE-2026-40899 Severity & CVSS Score
CVE-2026-40899 is rated medium severity, with a CVSS base score of 6.5 out of 10.
Medium — meaningful risk under specific conditions. Schedule a fix in the normal cycle.
Affected dataease Versions
dataease · github versions <= v2.10.20 are affected.
How to Reproduce CVE-2026-40899
pruva-verify REPRO-2026-00165 curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00165/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-40899
Reproduced by Pruva's autonomous agents — 487 tool calls over 1h 51m. Full root-cause analysis and the complete transcript are below.
How the agent worked
Root Cause and Exploit Chain for CVE-2026-40899
DataEase community edition ≤ v2.10.20 allows an authenticated administrator to bypass the server-side JDBC parameter blocklist by exploiting Lombok's @Data annotation on datasource configuration classes. The @Data annotation auto-generates public setters for all fields, including the illegalParameters blocklist field. When Spring's Jackson JSON binder deserializes the incoming datasource configuration, it calls this setter and overwrites the hardcoded blocklist with an attacker-supplied value (e.g., an empty array). As a result, forbidden parameters such as allowloadlocalinfile=true can be injected into the JDBC URL, enabling arbitrary file read via a rogue MySQL server.
- Package/component affected:
core/core-backend/src/main/java/io/dataease/datasource/type/Mysql.java(and sibling datasource type classes: Pg, Impala, Sqlserver, Db2, H2, CK, Redshift, Mongo) - Affected versions: DataEase community edition ≤ v2.10.20
- Fixed versions: v2.10.21
- Risk level: Medium (CVSS 3.1: 6.5)
- Consequences: A privileged user can bypass the JDBC parameter blocklist, inject dangerous MySQL parameters (e.g.,
allowLoadLocalInfile), and trigger arbitrary file read from the DataEase server host.
Root Cause
The datasource type classes (e.g., Mysql.java) are annotated with Lombok @Data, which generates a public setter for every non-final field. The field illegalParameters holds a hardcoded list of dangerous JDBC parameter names that must be blocked. Because Jackson's default deserialization strategy invokes any public setter that matches a JSON key, an attacker can include "illegalParameters": [] in the same JSON request that defines the datasource. This overwrites the blocklist before the getJdbc() validation logic runs, allowing any subsequently supplied extraParams to pass validation unchecked.
The fix commit is 16a950f96089b2a90e37d82304ede714a40902ba ("fix: 【漏洞】Arbitrary File Read (Credential Exfiltration)"). It adds @JsonIgnore to the illegalParameters field in all affected datasource type classes, preventing Jackson from ever binding user input to that field.
Reproduction Steps
- Run
repro/reproduction_steps.sh - The script:
- Pulls the official DataEase Docker images for v2.10.20 (vulnerable) and v2.10.21 (fixed)
- Starts each image in
desktopmode (which bypasses token-based authentication) on separate ports - Waits for the real
/de2api/datasource/typesendpoint to respond - Sends an HTTP POST to
/de2api/datasource/validatewith a Base64-encoded malicious MySQL configuration containing"illegalParameters": []and"extraParams": "allowloadlocalinfile=true" - Captures and compares the responses
- Expected evidence:
- Vulnerable (v2.10.20): The server returns a JDBC connection error (
Communications link failure), proving thatgetJdbc()did not reject the forbidden parameter and instead attempted to open a connection. - Fixed (v2.10.21): The server returns
Illegal parameter: allowloadlocalinfile, proving that the blocklist was enforced and the bypass was blocked.
- Vulnerable (v2.10.20): The server returns a JDBC connection error (
Evidence
logs/vulnerable_response.json:{"code":40001,"msg":"DEException(code=40001, msg=Communications link failure\n\nThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)","data":null}logs/fixed_response.json:{"code":40001,"msg":"DEException(code=40001, msg=Illegal parameter: allowloadlocalinfile)","data":null}repro/runtime_manifest.jsondocuments the exact endpoints, payloads, and responses for both versions.
Recommendations / Next Steps
- Primary fix: Apply
@JsonIgnore(or equivalent Jackson ignore annotation) to all blocklist/whitelist fields on configuration beans that must not be user-modifiable. This is exactly what the DataEase maintainers did in v2.10.21. - Defense in depth: Consider making
illegalParametersaprivate finalfield initialized in the constructor or astatic finalconstant, so there is no setter at all — even for other deserialization frameworks. - Upgrade guidance: Users on DataEase ≤ v2.10.20 should upgrade to v2.10.21 or later immediately.
- Testing recommendations: Add an integration test that POSTs a datasource configuration containing an
illegalParametersoverride to the live/de2api/datasource/validateendpoint and asserts that the response is a blocklist rejection, not a connection attempt.
Additional Notes
- Idempotency:
repro/reproduction_steps.shhas been executed twice consecutively from a clean state and produced the same results both times. - Edge cases / limitations: The reproduction uses the
desktopSpring profile to bypass authentication, which is the simplest way to reach the vulnerable endpoint without implementing RSA-encrypted login. This does not affect the validity of the reproduction because the vulnerable code path (Jackson deserialization ofMysqlfollowed bygetJdbc()validation) is identical across all profiles.
CVE-2026-40899 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.
Artifacts and Evidence for CVE-2026-40899
Scripts, logs, diffs, and output captured during the reproduction.
How to Fix CVE-2026-40899
Upgrade dataease · github to v2.10.21 or later.
FAQ: CVE-2026-40899
What can an attacker achieve by bypassing the DataEase JDBC blocklist?
Which DataEase versions are affected by CVE-2026-40899, and where is it fixed?
How severe is CVE-2026-40899?
How can I reproduce CVE-2026-40899?
References for CVE-2026-40899
Authoritative sources for CVE-2026-40899 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.