Ce mail provient de l'extérieur, restons vigilants ===================================================================== CERT-Renater Note d'Information No. 2026/VULN063 _____________________________________________________________________ DATE : 22/01/2026 HARDWARE PLATFORM(S): / OPERATING SYSTEM(S): Systems running argo-workflows (Go) versions prior to 3.6.17, 3.7.8. ===================================================================== https://github.com/argoproj/argo-workflows/security/advisories/GHSA-cv78-6m8q-ph82 _____________________________________________________________________ Stored XSS in the artifact directory listing High Joibel published GHSA-cv78-6m8q-ph82 Jan 21, 2026 Package github.com/argoproj/argo-workflows (Go) Affected versions <3.6.17 >=3.7.0, <3.7.7 Patched versions 3.6.17 3.7.8 Description Summary Stored XSS in the artifact directory listing allows any workflow author to execute arbitrary JavaScript in another user’s browser under the Argo Server origin, enabling API actions with the victim’s privileges. Details The directory listing response in server/artifacts/artifact_server.go renders object names directly into HTML via fmt.Fprintf without escaping. Object names come from driver.ListObjects(...) and are attacker‑controlled when a workflow writes files into an output artifact directory. argo-workflows/server/artifacts/artifact_server.go Lines 194 to 244 in 9872c29 if isDir { // return an html page to the user objects, err := driver.ListObjects(ctx, artifact) if err != nil { a.httpFromError(ctx, err, w) return } a.logger.WithFields(logging.Fields{ "artifact": artifact, "files": objects, }).Debug(ctx, "this is a directory") key, _ := artifact.GetKey() for _, object := range objects { // object is prefixed by the key, we must trim it dir, file := path.Split(strings.TrimPrefix(object, key+"/")) // if dir is empty string, we are in the root dir // we found in index.html, abort and redirect there if dir == "" && file == "index.html" { w.Header().Set("Location", r.URL.String()+"index.html") w.WriteHeader(http.StatusTemporaryRedirect) return } } w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("")) PoC Deploy Argo Workflows: kubectl create ns argo kubectl apply --server-side -f manifests/base/crds/full kubectl apply --server-side -k manifests/quick-start/postgres Port‑forward Argo Server: kubectl -n argo port-forward deploy/argo-server 2746:2746 Create the PoC workflow: cat > /tmp/argo-xss.yaml <<'EOF' apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: xss-artifact-test- spec: entrypoint: main templates: - name: main container: image: alpine command: [sh, -c] args: - | mkdir -p /tmp/artifacts touch '/tmp/artifacts/xss">.html' outputs: artifacts: - name: dir path: /tmp/artifacts archive: none: {} EOF kubectl -n argo create -f /tmp/argo-xss.yaml Wait for completion: kubectl -n argo get wf -w Get the node ID: kubectl -n argo get wf \ -o jsonpath='{range .status.nodes.*}{.id}{"\t"}{.displayName}{"\n"}{end}' Open the listing: https://localhost:2746/artifact-files/argo/workflows///outputs/dir/ image Impact The attacker creates a workflow that produces a HTML artifact that contains a HTML file that contains a script which uses XHR calls to interact with the Argo Server API. The attacker emails the deep-link to the artifact to their victim. The victim opens the link, the script starts running. As the script has access to the Argo Server API (as the victim), so may do the following (if the victim may): Read information about the victim’s workflows. Create or delete workflows. Severity High 7.3/ 10 CVSS v4 base metrics Exploitability Metrics Attack Vector Network Attack Complexity High Attack Requirements None Privileges Required Low User interaction Active Vulnerable System Impact Metrics Confidentiality High Integrity High Availability High Subsequent System Impact Metrics Confidentiality None Integrity None Availability None CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N CVE ID CVE-2026-23960 Weaknesses No CWEs Credits @Masamuneee Masamuneee Reporter ========================================================= + CERT-RENATER | tel : 01-53-94-20-44 + + 23/25 Rue Daviel | fax : 01-53-94-20-41 + + 75013 Paris | email:cert@support.renater.fr + =========================================================