CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-29064

CVE-2026-29064: Path Traversal via Symlink Extraction in Zarf

Alon Barad
Alon Barad
Software Engineer

Mar 6, 2026·6 min read·29 visits

Executive Summary (TL;DR)

Zarf versions prior to 0.73.1 fail to validate symbolic link targets during archive extraction. Attackers can craft malicious packages containing symlinks that point to arbitrary locations on the host filesystem (e.g., /etc/shadow), leading to arbitrary file read or write access when the package is decompressed.

A high-severity path traversal vulnerability exists in the archive extraction component of Zarf, an airgap-native Kubernetes package manager. The flaw allows malicious packages to write files outside the intended extraction directory via unvalidated symbolic links. This vulnerability affects Zarf versions 0.54.0 through 0.73.0 and is remediated in version 0.73.1.

Vulnerability Overview

Zarf is a CLI tool used to package, ship, and deploy Kubernetes clusters and applications in air-gapped environments. A core function of Zarf is the archiver component, which handles the compression and decompression of package artifacts (typically tarballs or zip files). CVE-2026-29064 identifies a critical flaw in how this component handles symbolic links during the extraction process.

The vulnerability is a variation of the "Zip Slip" class of path traversal issues. When Zarf extracts an archive, it processes file entries sequentially. If an entry is a symbolic link, Zarf creates it on the filesystem. However, in affected versions, the extraction logic does not properly sanitize or restrict the LinkTarget of these symlinks. This allows a malicious archive to create a symlink that points to a sensitive location on the host system (e.g., /etc/shadow or ~/.ssh/authorized_keys) rather than a file within the extraction sandbox.

While the creation of the symlink itself might be benign, subsequent operations—such as writing to a file that resolves through that symlink—can result in arbitrary file overwrites. Furthermore, if the user or a downstream process interacts with the extracted directory, they may unwittingly access or modify sensitive host files.

Root Cause Analysis

The root cause lies in the implementation of the defaultHandler, stripHandler, and filterHandler functions within src/pkg/archive/archive.go. These handlers are responsible for iterating through archive headers and performing filesystem operations based on the entry type.

In the vulnerable code, when a handler encounters a symbolic link (Type Symlink), it extracts the LinkTarget string from the archive header and passes it directly to os.Symlink. While the destination path (dst) is often constructed using filepath.Join, this function only performs lexical cleaning (e.g., removing .. references within the path string) but does not resolve the physical path or validate that the symlink target resides within the intended directory tree.

Specifically, the code lacked a "jail check"—a mechanism to resolve the canonical path of the symbolic link's target and verify it starts with the canonical path of the extraction root. Without this check, a LinkTarget of ../../../../etc/passwd is accepted as valid. When the operating system processes the symlink() syscall, it creates a link on the filesystem that points outside the extraction root, effectively bypassing the application's intended sandbox.

Code Analysis & Fix

The remediation for this vulnerability leverages the os.Root API introduced in Go 1.24, which provides a robust mechanism for directory-scoped file operations. This approach is superior to traditional string-based sanitization as it enforces boundaries at the file descriptor level.

Vulnerable Logic (Simplified): The original code relied on standard os package calls that operate on global paths. Note the lack of validation on h.Linkname.

// BEFORE: src/pkg/archive/archive.go
func (h *defaultHandler) Handle(ctx context.Context, header *tar.Header, dst string) error {
    target := filepath.Join(dst, header.Name)
    // ...
    case tar.TypeSymlink:
        // Vulnerability: h.Linkname is trusted blindly
        if err := os.Symlink(header.Linkname, target); err != nil {
            return err
        }
    // ...
}

Patched Logic: The fix, applied in commit 93f9c33, refactors the extraction to use an os.Root handle. The extraction root is opened once, and all subsequent operations (creating directories, opening files, creating symlinks) are performed relative to this root handle using the root object methods. The OS kernel ensures these operations cannot escape the directory descriptor.

// AFTER: src/pkg/archive/archive.go
func (h *defaultHandler) Handle(ctx context.Context, root *os.Root, header *tar.Header) error {
    // 1. Sanitize entry name to prevent absolute paths or drive letters
    if err := validateEntryName(header.Name); err != nil {
        return err
    }
 
    // 2. Use root-scoped methods for filesystem operations
    switch header.Typeflag {
    case tar.TypeSymlink:
        // 3. Additional validation on the symlink target
        if err := validateSymlink(header.Linkname); err != nil {
            return err
        }
        // 4. Create symlink relative to the root handle
        // The 'root' object enforces the sandbox boundary
        if err := root.Symlink(header.Linkname, header.Name); err != nil {
            return err
        }
    }
}

Exploitation Methodology

Exploiting this vulnerability requires the attacker to create a specially crafted archive (TAR or ZIP) and convince a user to extract it using the zarf tools archiver decompress command. The attack does not require authentication to the system but does require the ability to supply the malicious package.

Step-by-Step Recreation:

  1. Preparation: The attacker identifies a target file on the victim's system (e.g., /etc/shadow or a sensitive configuration file).
  2. Archive Creation: The attacker creates a symlink on their local machine pointing to the target file using relative paths.
    ln -s ../../../../../etc/shadow malicious_link
  3. Packaging: This symlink is packaged into a tarball. Standard tar commands preserve the relative link target.
    tar -czf exploit.tar.gz malicious_link
  4. Delivery & Execution: The attacker distributes exploit.tar.gz. When the victim runs zarf tools archiver decompress exploit.tar.gz output_dir, Zarf replicates the symlink in output_dir.
  5. Impact Realization: The resulting file output_dir/malicious_link now points to /etc/shadow. If the victim (or a script) reads from this file, they read the shadow file. If the archive contained a second entry that wrote data to malicious_link, the extraction process itself would overwrite /etc/shadow.

Impact Assessment

The successful exploitation of CVE-2026-29064 results in a high-impact integrity and confidentiality breach. The specific impact depends on the context in which Zarf is running.

Scenario 1: CI/CD Pipelines Zarf is frequently used in automated pipelines to prepare air-gapped bundles. If a pipeline extracts a malicious package, the attacker could overwrite pipeline configuration files, inject backdoors into build artifacts, or exfiltrate secrets available on the build agent's filesystem.

Scenario 2: Developer Workstations Developers using Zarf to examine packages locally run the tool with their user privileges. An attacker could overwrite ~/.ssh/authorized_keys to gain persistent access or read ~/.aws/credentials.

CVSS Breakdown (8.2): The vulnerability scores High because the scope is Changed (S:C)—the attack impacts the underlying host operating system, not just the Zarf application. Integrity (I:H) and Confidentiality (C:H) are both rated High due to the potential for arbitrary file access. User Interaction (UI:R) is required, preventing a 9.0+ score.

Official Patches

ZarfCommit fixing the vulnerability using os.Root
ZarfZarf v0.73.1 Release Notes

Fix Analysis (1)

Technical Appendix

CVSS Score
8.2/ 10
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
EPSS Probability
0.04%

Affected Systems

Zarf CLI < 0.73.1

Affected Versions Detail

Product
Affected Versions
Fixed Version
Zarf
Defense Unicorns
>= 0.54.0, < 0.73.10.73.1
AttributeDetail
CVE IDCVE-2026-29064
CVSS v3.18.2 (High)
CWE IDCWE-22
Attack VectorLocal / User Interaction
ImpactArbitrary File Read/Write
Affected Versions0.54.0 - 0.73.0

MITRE ATT&CK Mapping

T1083File and Directory Discovery
Discovery
T1005Data from Local System
Collection
CWE-22
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

Vulnerability Timeline

Fix commit merged
2026-03-03
Zarf v0.73.1 Released
2026-03-03
CVE and GHSA Advisory Published
2026-03-06

References & Sources

  • [1]GHSA-hcm4-6hpj-vghm Advisory
  • [2]NVD - CVE-2026-29064

More Reports

•44 minutes ago•GHSA-XF4V-W5X5-PV79
5.1

GHSA-XF4V-W5X5-PV79: CSV Formula Injection in Spree Customer Export

A CSV Formula Injection vulnerability (CWE-1236) exists in the Spree headless eCommerce platform within the customer export functionality. An unauthenticated attacker can register a customer profile containing malicious formula sequences in fields like the first name or last name. When an administrator exports the customer data to a CSV file and opens it in a spreadsheet application, the spreadsheet engine can interpret and execute these formulas, potentially leading to remote command execution on the administrator's workstation or out-of-band data exfiltration.

Alon Barad
Alon Barad
2 views•6 min read
•about 1 hour ago•CVE-2026-47694
5.4

CVE-2026-47694: Stored Cross-Site Scripting in WWBN AVideo Category Descriptions

A Stored Cross-Site Scripting (XSS) vulnerability exists in WWBN AVideo versions up to and including 29.0. Unsanitized category descriptions are stored in the database and subsequently rendered as raw HTML in the Gallery view plugin, allowing low-privileged authenticated users to execute arbitrary JavaScript in the browsers of visiting users.

Alon Barad
Alon Barad
2 views•7 min read
•about 2 hours ago•GHSA-JPVJ-WPMJ-H7RV
9.6

GHSA-JPVJ-WPMJ-H7RV: Supply Chain Compromise and Malicious Code Injection in @cap-js/openapi

A critical supply chain compromise was identified in the Node.js package @cap-js/openapi at version 1.4.1. An attacker gained unauthorized publishing access to the npm registry and distributed a backdoored release that harvests sensitive developer credentials, environment variables, and SSH keys. The malicious code then exfiltrates the collected data to external actor-controlled servers.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 2 hours ago•CVE-2026-47696
7.1

CVE-2026-47696: Authenticated Wallet Credit Bypass in WWBN AVideo AuthorizeNet Plugin

An authenticated wallet credit bypass vulnerability exists in WWBN AVideo version 29.0 and earlier. The AuthorizeNet plugin includes an unfinished mockup endpoint, processPayment.json.php, which lacks actual transaction verification and hardcodes success. This allows any authenticated user to credit their wallet with arbitrary balances without making any payments.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 3 hours ago•GHSA-8WHC-2WMV-WW35
8.8

GHSA-8whc-2wmv-ww35: Unauthenticated Stored DOM-based Cross-Site Scripting in WWBN AVideo YPTSocket Plugin

An unauthenticated stored DOM-based Cross-Site Scripting (DOM XSS) vulnerability in the YPTSocket plugin of WWBN AVideo (formerly YouPHPTube) allows remote attackers to execute arbitrary JavaScript within the session context of administrative users. Unsanitized metadata parameters supplied during the WebSocket handshake are persisted in an SQLite database and broadcast to connected users. The frontend application processes these parameters through an unsafe jQuery append sink, leading to silent, high-impact administrative context compromise.

Amit Schendel
Amit Schendel
6 views•7 min read
•about 3 hours ago•CVE-2026-47676
5.3

CVE-2026-47676: Inconsistent Path Parsing and Slicing in Hono Framework Sub-Application Mounting

A path parsing and normalization inconsistency vulnerability exists in the Hono web framework prior to version 4.12.21. When hosting sub-applications via the app.mount() routing interface, Hono calculates the routing path prefix length on a percent-decoded representation of the URI but executes the path-slicing offset on the raw, percent-encoded string. This discrepancy results in malformed request paths being dispatched to mounted sub-applications, potentially leading to route bypasses, route confusion, and application-level Denial of Service.

Alon Barad
Alon Barad
4 views•6 min read