Skip to content

GHSA-cc8m-98fm-rc9g: Verified Repro With Script Download

GHSA-cc8m-98fm-rc9g: Skipper Lua Filter Arbitrary Code Execution

GHSA-cc8m-98fm-rc9g is verified against github.com/zalando/skipper · go. This high reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00066.

REPRO-2026-00066 github.com/zalando/skipper · go Jan 17, 2026 .txt
Severity
HIGH
Reproduced in
9m 5s
Tool calls
73
Spend
$0.89
01 · Overview

What Is GHSA-cc8m-98fm-rc9g?

GHSA-cc8m-98fm-rc9g is a high-severity arbitrary code execution vulnerability in the Skipper API gateway (github.com/zalando/skipper) via Lua filters, arising because inline Lua filters were enabled by default before v0.23. Pruva reproduced it (reproduction REPRO-2026-00066).

02 · Severity & CVSS

GHSA-cc8m-98fm-rc9g Severity

GHSA-cc8m-98fm-rc9g is rated high severity.

HIGH threat level

High — serious impact or readily exploitable. Prioritize remediation.

How to Reproduce GHSA-cc8m-98fm-rc9g

$ pruva-verify REPRO-2026-00066
or curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00066/artifacts/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for GHSA-cc8m-98fm-rc9g

Reproduced by Pruva's autonomous agents — 73 tool calls over 9 min. Full root-cause analysis and the complete transcript are below.

How the agent worked 226 events · 73 tool calls · 9 min
9 minDuration
73Tool calls
73Reasoning steps
226Events
3Dead-ends
Agent activity over 9 min
Support
18
Repro
204
0:0009:05

Root Cause and Exploit Chain for GHSA-cc8m-98fm-rc9g

Summary

Skipper releases prior to v0.23.0 enable inline Lua filters by default (-lua-sources=inline,file). Any user able to submit a Lua filter (for example through an Ingress resource) can run arbitrary Lua code inside the Skipper process and access the local filesystem. Our reproduction shows that a crafted inline Lua script can read /etc/hostname and leak its contents through Skipper’s logs.

Impact

  • Component: github.com/zalando/skipper proxy binary
  • Affected Versions: all versions before v0.23.0 (where Lua is enabled by default)
  • Risk: High (CVSS 8.8) – attackers can execute arbitrary Lua code, read sensitive files (tokens, secrets), and exfiltrate data via logs or upstream responses. If the Skipper process holds credentials or tokens, they can be stolen.

Root Cause

Skipper allowed inline Lua scripts to be embedded directly into route definitions and executed without sandboxing. When -lua-sources includes inline (default before v0.23.0), user-controlled Lua scripts run in the Skipper process with access to the standard Lua IO library. This enables arbitrary file reads/writes and system interaction. The issue was mitigated in v0.23.0 by disabling Lua filters by default (commit 0b52894570773b29e2f3c571b94b4211ef8fa714).

Reproduction Steps

  1. Run repro/reproduction_steps.sh from the workspace root.
  2. The script downloads Skipper v0.22.0, writes a malicious inline Lua route that reads /etc/hostname, starts Skipper with the route, and triggers it via curl.
  3. Successful reproduction is evidenced by the Skipper log entry containing [EXFIL] <hostname> and the summary message printed by the script. Logs are stored under logs/.

Evidence

  • Logs:
    • logs/reproduction.log – full script run output
    • logs/skipper_inline.log – Skipper process logs
    • logs/exfiltration.txt – filtered [EXFIL] line showing leaked hostname
    • logs/request.log – HTTP status (404) from trigger request
  • Key Excerpt: logs/exfiltration.txt contains Error calling request ... [EXFIL] <hostname> proving filesystem data leakage.
  • Environment: uname -aLinux runsc 4.4.0 ... x86_64 GNU/Linux

Recommendations / Next Steps

  • Upgrade Skipper to v0.23.0 or later, where Lua filters are disabled by default.
  • If Lua scripts are required, explicitly limit -lua-sources=file and ensure only trusted scripts are deployed on the filesystem.
  • Harden Lua execution by removing IO modules or running in a restricted sandbox, and add automated tests to ensure inline Lua stays disabled unless explicitly allowed.

Additional Notes

  • The reproduction script is idempotent: it reuses downloaded artifacts, stops Skipper between runs, and was executed successfully twice in a row.
  • The exploit demonstrates read access; write/execute primitives are also possible via Lua IO APIs under the same configuration.

GHSA-cc8m-98fm-rc9g Reproduction Transcript

The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.

Full session Replay every step — scrub the timeline or play it back.

Event 1/40
0:000:38
0:00
session startedgpt-5.1-codex · ghsa-cc8m-98fm-rc9g · ghsa-cc8
0:06
0:06
extract_facts
no facts extracted
0:08
0:08
extract_facts
no facts extracted
0:08
error

Unknown error

0:16
0:16
extract_facts
no facts extracted
0:16
error

Unknown error

0:19
0:19
extract_facts
no facts extracted
0:19
error

Unknown error

0:22
0:22
0:22
supportrepro
0:24
0:24
0:25
0:25
0:27
0:27
0:31
0:31
0:33
0:33
0:36
0:36
0:38

Artifacts and Evidence for GHSA-cc8m-98fm-rc9g

Scripts, logs, diffs, and output captured during the reproduction.

No artifacts available

08 · How to Fix

How to Fix GHSA-cc8m-98fm-rc9g

Coming soon

Step-by-step mitigation and hardening guidance for GHSA-cc8m-98fm-rc9g — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: GHSA-cc8m-98fm-rc9g

How does the Skipper Lua filter code execution attack work?

An attacker who can create an Ingress resource (or otherwise submit a route) writes a Lua request filter such as one that opens /var/run/secrets/kubernetes.io/serviceaccount/token, reads it, and calls error('[EXFIL] ' .. token) to exfiltrate the contents via Skipper's error logs. Because inline Lua runs with filesystem access inside the Skipper process, this lets an attacker read sensitive files, tokens, and secrets accessible to that process.

Which Skipper versions are affected, and where is it fixed?

All versions before v0.23.0 are affected, where Lua filters are enabled by default. It was mitigated in v0.23.0 (commit 0b52894570773b29e2f3c571b94b4211ef8fa714) by disabling Lua filters by default.

How severe is this Skipper Lua filter issue?

The record rates it high severity; the root-cause analysis cites a CVSS score of 8.8, since attackers can execute arbitrary Lua code, read sensitive files such as tokens and secrets, and exfiltrate data via logs or upstream responses.

How can I reproduce the Skipper Lua filter vulnerability?

Download the verified script from this page and run it in an isolated environment against Skipper v0.22.0. It writes a malicious inline Lua route that reads /etc/hostname, starts Skipper with that route, and triggers it via curl, showing the file contents leaked into the Skipper log.
11 · References

References for GHSA-cc8m-98fm-rc9g

Authoritative sources for GHSA-cc8m-98fm-rc9g — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.