Vulnerability  ·  2026-10-15

Ludwig (LLM framework) dataset archive extraction: symlink/hardlink tar-slip → arbitrary file write when loading datasets

VulnerabilityMedium impactGlobalCVE-2026-104103
Verified via NVD REST API (published 2026-10-14, CVSS 8.1, CWE-22/59, GHSA-qvrm-3x4c-rcxf). The fix (0.17.8) rejects escaping link members in the dataset-archive extraction path.
ML training pipelines routinely pull dataset archives from remote/hosted sources; a compromised archive can plant files (e.g. into config, cache, or the model directory) while the framework runs with the orchestrator's privileges — a practical poisoning/overwrite path into the ML build. Trainers should extract from pinned, vetted sources and run extraction in a sandboxed/least-privilege context.
extract_archive() validates tar member names before TarFile.extractall() but not symlink/hard-link members; a crafted archive creates a link escaping the extraction directory, then writes later members through it to an arbitrary filesystem path (CWE-22/59). The commonprefix containment check also allows a sibling path sharing the destination's character prefix. Python 3.14 is immune (default tar data filter).
ludwig-ai/ludwig < 0.17.8 (Python 3.12/3.13)
Upgrade to ludwig >= 0.17.8; validate archive provenance before extraction; prefer running dataset ingestion in containers with restricted filesystem access.
NVD CVE-2026-104103GitHub advisory GHSA-qvrm-3x4c-rcxf
See this in the live feed Explore related AI security and governance findings — updated every morning.
Open the feed →