Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-39866 — Proof-of-concept lab demonstrating command injection in GitHub Actions workflow dispatch (CVE-2026-39866). Runs vulnerable and patched versions side-by-side for educational analysis. | Kitploit
Tools/GitHubGitHub/abhayclasher/cve-2026-39866
Vulnerability AnalysisExploitationWeb Application ExploitationCommand and ControlLearning & EducationLabs & Practice
GitHubabhayclasher/cve-2026-39866

CVE-2026-39866

Proof-of-concept lab demonstrating command injection in GitHub Actions workflow dispatch (CVE-2026-39866). Runs vulnerable and patched versions side-by-side for educational analysis.

View Repository
4 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-39866 — Command Injection via unquoted workflow dispatch input

CVE GHSA CWE-78 Patched

Proof-of-concept lab for command injection in GitHub Actions workflow dispatch


Purpose

CVE-2026-39866 is a command injection bug in Lawnchair's GitHub Actions release workflow. The release_update.yml file passes user input directly to bash without quoting, so an attacker can inject commands. This repo runs both the vulnerable and patched versions side by side.

Quick facts

FieldValue
CVE IDCVE-2026-39866
GHSAGHSA-9prc-pp2c-3427
CWECWE-78 (Improper Neutralization of Special Elements used in an OS Command)
ProductLawnchairLauncher/lawnchair
AffectedAll versions below fcba413
Patchedfcba413
DiscoveryAbhay Kumar (@abhayclasher)

Vulnerability details

The vulnerability exists in the release_update.yml workflow file. The action takes an artifactName parameter and passes it directly into a bash command without quoting.

root@kitploit:~
- name: Rename artifact
  run: mv ${{ inputs.artifactName }}.zip lawnchair.zip

GitHub Actions substitutes the variable value into the string before the shell runs it. Without quotes around ${{ inputs.artifactName }}, the shell interprets spaces and semicolons as command separators.

If an attacker supplies file.zip; touch pwned.txt # as the artifactName:

How GitHub Actions parses it: ${{ inputs.artifactName }} → file.zip; touch pwned.txt #

How the shell executes it:

root@kitploit:~
mv file.zip; touch pwned.txt #.zip lawnchair.zip

The shell executes mv file.zip, then touch pwned.txt, then ignores the rest as a comment.

Impact

  • Execute arbitrary commands on the GitHub Actions runner.
  • Steal repository secrets exposed to the runner environment (like GITHUB_TOKEN or release signing keys).
  • Alter release artifacts before they are uploaded.
  • Pivot into connected infrastructure if the runner is self-hosted.

System requirements

  • Node.js 18 or later
  • Docker (optional, for containerized lab)
  • 500 MB free disk space

Setup

Option 1: Run directly

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-39866.git
cd CVE-2026-39866/app
npm install
node server.js

Option 2: Run with Docker

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-39866.git
cd CVE-2026-39866
docker compose up -d

Usage

After the server starts, visit these URLs:

URLDescription
http://localhost:3000/workflow/vulnerableVulnerable workflow — command injection executes on submit
http://localhost:3001/workflow/patchedSame workflow with fcba413 patch applied

The vulnerable version will execute your injected command on the runner. The patched version treats the input as a literal string.

You can also run the standalone PoC:

root@kitploit:~
cd poc
node exploit.js

This spins up a minimal server on port 3000 that demonstrates the same bug without the full application context.

How it works

Detection flow

root@kitploit:~
1. Attacker controls the artifactName input parameter
2. GitHub Actions expands ${{ inputs.artifactName }} into the YAML
3. The run step sends this to bash
4. Bash sees unquoted special characters and treats them as command syntax
5. Commands execute with runner environment privileges

The attack chain

root@kitploit:~
┌────────────────────────────────────────────────────┐
│  1. Malicious input:                               │
│                                                     │
│     artifactName = "file.zip; id #"                │
│                                                     │
│  2. GitHub Actions substitutes into YAML:          │
│                                                     │
│     run: mv file.zip; id #.zip lawnchair.zip       │
│                                                     │
│  3. Bash sees:                                      │
│     - mv file.zip                                   │
│     - id                    <-- Arbitrary command   │
│     - #.zip lawnchair.zip (ignored)                │
│                                                     │
│  4. Shell executes arbitrary command               │
└────────────────────────────────────────────────────┘

The fix

Version fcba413 introduces quoting around the interpolated variable:

root@kitploit:~
- name: Rename artifact
  run: mv "${{ inputs.artifactName }}.zip" lawnchair.zip

Quotes prevent the shell from parsing special characters. The payload stays treated as a literal filename string.

Best practice is to use environment variables to completely isolate user input:

root@kitploit:~
- name: Rename artifact
  env:
    ARTIFACT_NAME: ${{ inputs.artifactName }}
  run: mv "$ARTIFACT_NAME.zip" lawnchair.zip

View the full commit: fcba413

Project structure

root@kitploit:~
CVE-2026-39866/
├── README.md               # This file
├── docker-compose.yml      # Docker lab configuration
├── app/
│   ├── Dockerfile          # Container build configuration
│   ├── package.json        # Node.js dependencies
│   └── server.js           # Vulnerable + patched workflow runner simulation
└── poc/
    └── exploit.js          # Standalone minimal proof-of-concept

References

  • NVD — CVE-2026-39866
  • GitHub Security Advisory
  • Patch Commit
  • CWE-78

Reported by Abhay Kumar. This repository is intended for local educational use only. Do not deploy the vulnerable server on a public network.

Educational purposes only — use in isolated environments

Download Tool