{"schema_version":"1.9.0","id":"GHSA-f7cq-gvh6-qr25","published":"2026-03-16T20:46:48Z","modified":"2026-05-05T15:55:50.022212Z","aliases":["CVE-2026-32771","GO-2026-4712"],"summary":"Monitoring is vulnerable to Archive Slip due to missing checks in sanitization","details":"The `sanitizeArchivePath` function in `pkg/extract/extract.go` (lines 248–254) is vulnerable to a path traversal bypass due to a missing trailing path separator in the `strings.HasPrefix` check. A crafted tar archive can write files outside the intended destination directory when using the `extractor` CLI tool or the `extract.DumpOTelCollector` library function.\n\n## Vulnerable Code\n\nFile: `pkg/extract/extract.go`, lines 248–254\n\n```go\nfunc sanitizeArchivePath(d, t string) (v string, err error) {\n    v = filepath.Join(d, t)\n    if strings.HasPrefix(v, filepath.Clean(d)) {   // ← missing trailing separator\n        return v, nil\n    }\n    return \"\", fmt.Errorf(\"filepath is tainted: %s\", t)\n}\n```\n\nThe function is called at line 219 inside `untar`, which is invoked by `copyFromPod` (line 205) during the Cold Extract data dump workflow.\n\n## Root Cause\n\n`strings.HasPrefix(v, filepath.Clean(d))` does not append a trailing `/` to the directory prefix, causing a **directory name prefix collision**. If the destination is `/home/user/extract-output` and a tar entry is named `../extract-outputevil/pwned`, the joined path `/home/user/extract-outputevil/pwned` passes the prefix check — it starts with `/home/user/extract-output` — even though it is entirely outside the intended directory.\n\n## Steps to Reproduce\n\n1. **Deploy the monitoring stack** with `ColdExtract: true`. The OTEL Collector begins writing signal data (`otel_traces`, `otel_metrics`, `otel_logs`) to the shared PVC.\n\n2. **Place the PoC tar on the PVC.** Any pod with write access to the `ReadWriteMany` PVC (or the compromised OTEL Collector itself) copies a `poc-path-traversal.tar` into the `/data/collector` mount path. The archive contains three real-looking OTLP telemetry files alongside two crafted entries with path-traversal names.\n\n3. **Run the extractor against the namespace:**\n\n   ```\n   extractor \\\n     --namespace monitoring \\\n     --pvc-name <signals-pvc-name> \\\n     --directory /home/user/extract-output\n   ```\n\n4. **Observe the bypass.** `untar` processes the tar stream. For the malicious entries:\n\n   ```\n   // entry name: ../extract-outputevil/poc-proof.txt\n   filepath.Join(\"/home/user/extract-output\", \"../extract-outputevil/poc-proof.txt\")\n     => \"/home/user/extract-outputevil/poc-proof.txt\"\n\n   strings.HasPrefix(\"/home/user/extract-outputevil/poc-proof.txt\",\n                     \"/home/user/extract-output\")\n     => true   // BUG: prefix collision; file lands OUTSIDE target dir\n   ```\n\n   Both malicious entries are written outside `/home/user/extract-output/`. The three legitimate OTLP files land correctly inside it.\n\n## Impact\n\nSuccessful exploitation gives an attacker arbitrary file write on the machine running the extractor. Real-world primitives include:\n\n- Overwriting `~/.bashrc` / `~/.zshrc` / `~/.profile` for RCE on next shell login\n- Appending to `~/.ssh/authorized_keys` for persistent SSH backdoor\n- Dropping a malicious entry into `~/.kube/config` to hijack cluster access\n- Writing crontab entries for persistent scheduled execution\n\nThe attack surface is widened by the default `ReadWriteMany` PVC access mode, which means any pod in the cluster with the PVC mounted can inject the payload — not just the OTEL Collector itself.","affected":[{"package":{"name":"github.com/ctfer-io/monitoring","ecosystem":"Go","purl":"pkg:golang/github.com/ctfer-io/monitoring"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"0.2.2"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-f7cq-gvh6-qr25/GHSA-f7cq-gvh6-qr25.json"}}],"references":[{"type":"WEB","url":"https://github.com/ctfer-io/monitoring/security/advisories/GHSA-f7cq-gvh6-qr25"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-32771"},{"type":"WEB","url":"https://github.com/ctfer-io/monitoring/commit/269dba165aa42210352628c0db6756f3b8fd3c8a"},{"type":"PACKAGE","url":"https://github.com/ctfer-io/monitoring"},{"type":"WEB","url":"https://security.snyk.io/research/zip-slip-vulnerability#expandable-socPI9fFAJ-title"}],"database_specific":{"cwe_ids":["CWE-22"],"github_reviewed":true,"github_reviewed_at":"2026-03-16T20:46:48Z","nvd_published_at":"2026-03-20T01:15:55Z","severity":"HIGH"},"severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"},{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:L/SA:L"}]}