DataEase: Quartz JobStore Java deserialization RCE via QRTZ_JOB_DETAILS
What's the vulnerability?
DataEase uses the Quartz scheduler with the JDBC JobStore backend so its
periodic tasks (refresh datasets, send digest emails, run maintenance) survive
restarts. Quartz persists each job's JobDataMap in the
qrtz_job_details.JOB_DATA column as a Java-serialized blob and calls
ObjectInputStream.readObject() on that blob every time the trigger fires.
The DataEase classpath ships a version of commons-collections that contains
the well-known transformer-based gadget chain. The only thing standing
between an attacker and code execution is the table contents — and the
preceding step in the chain (CVE-2026-40900, stacked SQL injection) hands
that to them. With write access to a single row of qrtz_job_details, the
next scheduler tick deserializes the attacker's payload and runs whatever
method chain it encodes in the JVM running the DataEase backend.
This is the terminal step of the 4-CVE chain (auth bypass → blocklist bypass → stacked SQLi → Quartz deserialization RCE). The end result is code execution inside the DataEase container as the DataEase process user (root, in the default container image).
Root Cause Analysis
Verify with pruva-verify
Run the Pruva CLI to automatically fetch and execute the reproduction script.
pruva-verify REPRO-2026-00167 pruva-verify CVE-2026-40901 curl -fsSL https://pruva.dev/install.sh | sh Or Run Manually
Download the script
curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00167/artifacts/bundle/repro/reproduction_steps.sh Make executable
chmod +x reproduction_steps.sh Run the script
./reproduction_steps.sh How Pruva Reproduced This
Watch the AI agent's step-by-step process.
Loading session...