Описание
Argo Workflow has a Zipslip Vulnerability
Vulnerability Description
Vulnerability Overview
- During the artifact extraction process, the
unpack()function extracts the compressed file to a temporary directory (/etc.tmpdir) and then attempts to move its contents to/etcusing therename()system call, - However, since
/etcis an already existing system directory, therename()system call fails, making normal archive extraction impossible. - At this point, if a malicious user sets the entry name inside the
tar.gzfile to a path traversal like../../../../../etc/zipslip-poc, - The
untar()function combines paths usingfilepath.Join(dest, filepath.Clean(header.Name))without path validation, resulting intarget = "/work/input/../../../../../etc/zipslip-poc", - Ultimately, the
/etc/zipslip-pocfile is created, bypassing the normal archive extraction constraints and enabling direct file writing to system directories.
untar(): Writing Files Outside the Extraction Directory
- Base Path:
/work/tmp(dest) — The intended extraction directory in the wait container - Malicious Entry:
../../../../../../../../../..//mainctrfs/etc/zipslip-ok.txt(header.Name) — Path traversal payload - Path Cleaning:
filepath.Clean("../../../../../../../../../..//mainctrfs/etc/zipslip-ok.txt") = /mainctrfs/etc/zipslip-ok.txt— Go’s path cleaning normalizes the traversal - Path Joining:
filepath.Join("/work/tmp", "/mainctrfs/etc/zipslip-ok.txt") = /mainctrfs/etc/zipslip-ok.txt— Absolute path overrides base directory - File Creation:
/mainctrfs/etc/zipslip-ok.txtfile is created in the wait container - Volume Mirroring: The file appears as
/etc/zipslip-ok.txtin the main container due to volume mount mirroring
PoC
PoC Description
- The user uploaded a malicious
tar.gzfile to S3 that contains path traversal entries like../../../../../../../../../..//mainctrfs/etc/zipslip-ok.txtdesigned to exploit the vulnerability. - In the Argo Workflows YAML, the artifact’s path is set to
/work/tmp, which should normally extract the archive to that intended directory. - However, due to the vulnerability in the
untar()function,filepath.Join("/work/tmp", "/mainctrfs/etc/zipslip-ok.txt")resolves to/mainctrfs/etc/zipslip-ok.txt, causing files to be created in unintended locations. - Since the wait container’s
/mainctrfs/etcand the main container’s/etcshare the same volume, files created in the wait container become visible in the main container’s/etc/directory. - Consequently, the archive that should extract to
/work/tmpexploits the Zip Slip vulnerability to create files in the/etc/directory, enabling manipulation of system configuration files.
exploit yaml
exploit
-
Create Zipslip
-
Upload S3
-
Create Workflow
-
Run
-
Exploit Success
# Find Workflow and Pod NS=default WF=$(kubectl get wf -n "$NS" --sort-by=.metadata.creationTimestamp --no-headers | awk 'END{print $1}') POD=$(kubectl get pod -n "$NS" -l workflows.argoproj.io/workflow="$WF" --no-headers | awk 'END{print $1}') echo "NS=$NS WF=$WF POD=$POD" # Connect Main Container kubectl exec -it -n "$NS" "$POD" -c main -- bash # Exploit cd /etc/ ls -l cat zipslip-ok.txt
Impact
Container Isolation Bypass
The Zip Slip vulnerability allows attackers to write files to system directories like /etc/ within the container, potentially overwriting critical configuration files such as /etc/passwd, /etc/hosts, or /etc/crontab, which could lead to privilege escalation or persistent access within the compromised container.
Ссылки
- https://github.com/argoproj/argo-workflows/security/advisories/GHSA-p84v-gxvw-73pf
- https://nvd.nist.gov/vuln/detail/CVE-2025-62156
- https://github.com/argoproj/argo-workflows/commit/5659ad9b641fcf52c04ed594cd6493f9170f6011
- https://github.com/argoproj/argo-workflows/commit/9f6bc5d236cd1b24d607943384511d71ad17a4c3
- https://github.com/argoproj/argo-workflows/blob/946a2d6b9ac3309371fe47f49ae94c33ca7d488d/workflow/executor/executor.go#L993
- https://pkg.go.dev/vuln/GO-2025-4023
Пакеты
github.com/argoproj/argo-workflows/v3
< 3.6.12
3.6.12
github.com/argoproj/argo-workflows/v3
>= 3.7.0, < 3.7.3
3.7.3
Связанные уязвимости
Argo Workflows is an open source container-native workflow engine for orchestrating parallel jobs on Kubernetes. Versions prior to 3.6.12 and versions 3.7.0 through 3.7.2 contain a Zip Slip path traversal vulnerability in artifact extraction. During artifact extraction the unpack/untar logic (workflow/executor/executor.go) uses filepath.Join(dest, filepath.Clean(header.Name)) without validating that header.Name stays within the intended extraction directory. A malicious archive entry can supply a traversal or absolute path that, after cleaning, overrides the destination directory and causes files to be written outside the /work/tmp extraction path and into system directories such as /etc inside the container. The vulnerability enables arbitrary file creation or overwrite in system configuration locations (for example /etc/passwd, /etc/hosts, /etc/crontab), which can lead to privilege escalation or persistence within the affected container. Update to 3.6.12 or 3.7.3 to remediate the iss