CVE-2019-13990

9.8 CRITICAL

📋 TL;DR

CVE-2019-13990 is an XML External Entity (XXE) vulnerability in Terracotta Quartz Scheduler that allows attackers to read arbitrary files from the server filesystem or conduct server-side request forgery attacks. This affects all systems using Quartz Scheduler versions through 2.3.0 that process XML job descriptions. The vulnerability is particularly dangerous because it can be exploited via job descriptions submitted to the scheduler.

💻 Affected Systems

Products:
  • Terracotta Quartz Scheduler
Versions: Versions through 2.3.0
Operating Systems: All operating systems running Java
Default Config Vulnerable: ⚠️ Yes
Notes: Vulnerability exists in the XML parsing functionality when processing job descriptions. Any application using Quartz Scheduler with XML job definitions is affected.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Full server compromise through file disclosure of sensitive data (passwords, keys, configuration files) and potential remote code execution via SSRF leading to complete system takeover.

🟠

Likely Case

Unauthorized file read access to sensitive server files, potentially exposing credentials, configuration data, or other sensitive information stored on the server.

🟢

If Mitigated

Limited impact with proper network segmentation and file system permissions, though sensitive data exposure remains possible.

🌐 Internet-Facing: HIGH
🏢 Internal Only: HIGH

🎯 Exploit Status

Public PoC: ⚠️ Yes
Weaponized: LIKELY
Unauthenticated Exploit: ✅ No
Complexity: LOW

Exploitation requires the ability to submit XML job descriptions to the scheduler. Public proof-of-concept code exists in GitHub issues and security advisories.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: Version 2.3.1 and later

Vendor Advisory: https://github.com/quartz-scheduler/quartz/issues/467

Restart Required: Yes

Instructions:

1. Upgrade Quartz Scheduler to version 2.3.1 or later. 2. Update your project dependencies to use the patched version. 3. Restart your application server. 4. Verify that XXE protection is enabled in XML parsing configurations.

🔧 Temporary Workarounds

Disable XXE in XML parsing

all

Configure XML parsers to disable external entity processing

Set XML parser properties: FEATURE_SECURE_PROCESSING = true, http://apache.org/xml/features/disallow-doctype-decl = true, http://xml.org/sax/features/external-general-entities = false, http://xml.org/sax/features/external-parameter-entities = false

Input validation and sanitization

all

Validate and sanitize XML input before processing

Implement XML schema validation, Remove DOCTYPE declarations from input, Use whitelists for allowed XML elements

🧯 If You Can't Patch

  • Implement network segmentation to isolate Quartz Scheduler instances from sensitive systems
  • Deploy web application firewall (WAF) rules to block XXE payloads in XML input

🔍 How to Verify

Check if Vulnerable:

Check your project's dependency management file (pom.xml, build.gradle) for Quartz Scheduler version. Versions <= 2.3.0 are vulnerable.

Check Version:

For Maven: mvn dependency:tree | grep quartz, For Gradle: gradle dependencies | grep quartz, Or check: System.getProperty("org.quartz.version")

Verify Fix Applied:

Verify that Quartz Scheduler version is 2.3.1 or higher and test XML parsing with XXE payloads to ensure they are rejected.

📡 Detection & Monitoring

Log Indicators:

  • XML parsing errors mentioning external entities
  • Unexpected file read operations in system logs
  • HTTP requests to internal resources from Quartz processes

Network Indicators:

  • Outbound connections from Quartz to unexpected internal services
  • Large XML payloads containing DOCTYPE declarations

SIEM Query:

source="*quartz*" AND ("DOCTYPE" OR "ENTITY" OR "SYSTEM")

🔗 References

📤 Share & Export