Description
Ludwig is a low-code framework for building custom LLMs, neural networks, and other AI models. Prior to 0.17.8, ludwig.datasets.archives.extract_archive() validated tar member names before calling TarFile.extractall() but did not validate symlink members or hard-link members. A crafted archive could create a link that escaped the extraction directory and then write a later member through that link, placing attacker-controlled content at an arbitrary filesystem path with the extracting process's privileges. The same containment check used os.path.commonprefix, so a sibling path sharing the destination's character prefix could also pass. The dataset-loading path can download and extract configured archive URLs, but exploitation requires a user to process an archive from a source controlled or compromised by the attacker on supported Python 3.12 and 3.13 runtimes. Python 3.14 is not affected because its default tar data filter rejects escaping links. This issue is fixed in version 0.17.8.
Published: 2026-10-14
Score: 8.1 High
EPSS: < 1% Very Low
KEV: No
Impact: Arbitrary file write via path traversal and symlink exploitation
Action: Upgrade to v0.17.8
AI Analysis

Impact

Ludwig was vulnerable to a path traversal flaw during archive extraction. The implementation validated tar member names but missed checking for symlink and hard‑link members. A crafted archive could create a link that escapes the intended extraction directory and then allow a later member to be written through that link, resulting in attacker‑controlled content being placed at an arbitrary filesystem path with the privileges of the Ludwig process. This flaw is a classic CWE‑22 and CWE‑59 vulnerability that permits arbitrary file overwrite and can serve as a foundation for remote code execution if the overwritten location is critical to the system's operation.

Affected Systems

The affected product is Ludwig 0.17.7 and earlier from the vendor ludwig-ai. The issue exists for Python 3.12 and 3.13 runtimes; it does not affect Python 3.14 or newer because the built‑in tar data filter forbids escaping links.

Risk and Exploitability

The vulnerability carries a CVSS score of 8.1 and is not listed in the CISA KEV catalog. EPSS data is unavailable, but the absence of a specific exploitation score suggests it is not widely automated. The attack vector requires the attacker to supply a malicious archive URL that Ludwig will download and extract as part of dataset loading. Because the vulnerability is triggered during archive extraction, it is remote but requires the ability to influence dataset configuration or an attacker‑controlled source.

Generated by OpenCVE AI on October 15, 2026 at 14:15 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Ludwig to version 0.17.8 or later in which the path‑traversal flaw is fixed.
  • If an upgrade cannot be performed immediately, limit dataset ingestion to trusted URLs or validate archive contents manually before extraction.
  • Run Ludwig in a sandboxed environment with the minimal privileges required, ensuring that the extraction directory is isolated from critical filesystem paths.

Generated by OpenCVE AI on October 15, 2026 at 14:15 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Sat, 17 Oct 2026 04:30:00 +0000

Type Values Removed Values Added
First Time appeared Ludwig-ai
Ludwig-ai ludwig
Vendors & Products Ludwig-ai
Ludwig-ai ludwig

Thu, 15 Oct 2026 16:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Wed, 14 Oct 2026 18:15:00 +0000

Type Values Removed Values Added
Description Ludwig is a low-code framework for building custom LLMs, neural networks, and other AI models. Prior to 0.17.8, ludwig.datasets.archives.extract_archive() validated tar member names before calling TarFile.extractall() but did not validate symlink members or hard-link members. A crafted archive could create a link that escaped the extraction directory and then write a later member through that link, placing attacker-controlled content at an arbitrary filesystem path with the extracting process's privileges. The same containment check used os.path.commonprefix, so a sibling path sharing the destination's character prefix could also pass. The dataset-loading path can download and extract configured archive URLs, but exploitation requires a user to process an archive from a source controlled or compromised by the attacker on supported Python 3.12 and 3.13 runtimes. Python 3.14 is not affected because its default tar data filter rejects escaping links. This issue is fixed in version 0.17.8.
Title Ludwig: Path traversal in dataset archive extraction allows arbitrary file write via symlink members
Weaknesses CWE-22
CWE-59
References
Metrics cvssV3_1

{'score': 8.1, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H'}


Subscriptions

Ludwig-ai Ludwig
cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-10-15T15:06:47.154Z

Reserved: 2026-10-01T18:05:14.173Z

Link: CVE-2026-104103

cve-icon Vulnrichment

Updated: 2026-10-15T13:52:40.559Z

cve-icon NVD

Status : Awaiting Analysis

Published: 2026-10-14T18:17:21.540

Modified: 2026-10-16T20:02:37.630

Link: CVE-2026-104103

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-17T04:15:02Z

Weaknesses
  • CWE-22

    Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

  • CWE-59

    Improper Link Resolution Before File Access ('Link Following')