genai
SECURITY LAB
IncidentsAgent abuse

Clinejection: A GitHub Issue Title Hijacked Cline's AI Triage Bot and Led to a Rogue npm Release

High severityReal-world incidentFebruary 2026LLM01: Prompt InjectionLLM03: Excessive AgencyLLM04: Supply Chain
Status: Reported privately 1 Jan 2026, disclosed by Adnan Khan 9 Feb; workflow removed and tokens rotated, but a missed npm token was used on 17 Feb to publish [email protected] (GHSA-9ppg-jx86-fqw7, no CVE); 2.4.0 shipped and npm publishing moved to OIDC
Sources checked October 2026
On this page

Anyone could open an issue, the issue title went into the prompt, and the agent reading it had a shell on the same CI as the release jobs.

WhenFebruary 2026 (disclosed 9 Feb; rogue release 17 Feb)
TargetCline's AI issue-triage workflow (claude-code-action) and release pipeline
ResearcherAdnan Khan
TechniquePrompt injection via issue title → agent shell → Actions cache poisoning
AdvisoryGHSA-9ppg-jx86-fqw7 (no CVE)
ResultUnauthorised [email protected] live about 8 hours; ~4,000 downloads (StepSecurity estimate)
Attack flow
  1. 1An attacker opens a GitHub issue whose title carries instructions for Cline's AI triage agent
  2. 2The agent runs them with its shell, gaining code execution that can poison the shared Actions cache
  3. 3Release jobs that restore the cache expose publish tokens; one left unrevoked ships [email protected]

What happened

On 9 February 2026, security researcher Adnan Khan published Clinejection, a chain that started with the title of a GitHub issue and ended at the publishing credentials of Cline, an open-source AI coding assistant. Since 21 December 2025, Cline's repository had run an AI issue-triage workflow built on Anthropic's claude-code-action. Any GitHub account could trigger it by opening an issue, and the agent it launched had a shell. Khan reported the flaw privately on 1 January; Cline later acknowledged it did not act until he disclosed it publicly, then removed the workflow within about half an hour and began rotating its publishing tokens.

The rotation missed one. Cline deleted the wrong npm token, and on 17 February an unknown party used the exposed one to publish [email protected]. The CLI code was unchanged; the only addition was an install-time script that globally installed OpenClaw, a separate open-source AI agent. The release was live for about eight hours and, by StepSecurity's estimate reported by The Hacker News, was downloaded about 4,000 times before Cline shipped 2.4.0, deprecated 2.3.0 and revoked the right token. The VS Code and JetBrains extensions were not affected. Khan says another actor found his proof of concept on his test repository; who published 2.3.0 has not been confirmed.

How the attack worked

The triage prompt cast the model as a first responder for new issues and pasted in the issue number, author and title. The title was attacker text inside the instructions. Khan showed that a title written to look like a tool error could direct the agent to install a package from an attacker-controlled fork, and in his tests on a mirror of the repository the agent ran it every time. With Bash among its allowed tools, that meant arbitrary code execution inside a workflow on the default branch.

The triage job's own GitHub token was restricted, so the second step was a pivot. GitHub Actions caches are shared across workflows in the same scope. Code running in a low-privilege job can fill the cache past its 10 GB limit so older entries are evicted, then write poisoned entries under the keys a more privileged workflow expects. Cline's nightly publish workflows restored cached node_modules and held the VS Code Marketplace, OpenVSX and npm publish tokens. Those nightly tokens were not narrower than production ones: marketplace tokens are tied to the publisher, and Cline used the same npm package for nightly and production releases.

Untrusted text, privileged toolsAnyone could write the issue title. The workflow put it inside the agent's instructions and gave that agent a shell on CI that shared a cache with the release jobs.

Root cause

  • Attacker text in the prompt: the issue title was interpolated straight into the agent's instructions, with nothing separating it from the operator's prompt.
  • Open trigger, broad tools: the action accepted runs from any user, and a triage task was given shell, file-write and web tools.
  • Shared CI state: the triage job and the nightly publish jobs used the same Actions cache, so code execution in the weakest job could reach the strongest secrets.
  • Unverified rotation: Cline checked a management page rather than the token itself, so the leaked credential outlived the fix.

What a test would have caught

Open an issue whose title asks the triage agent to do something harmless and observable, such as writing a marker file, and check whether it happens. That one test exposes both the injection and the shell. Asking which jobs share a cache with the release workflow exposes the pivot without any cache-poisoning tooling. And after rotating a credential, try the old one: the supposedly revoked npm token would have still worked.

How to prevent it

  • Treat issue, pull-request and comment text as untrusted data, kept out of the instructions. Delimiting lowers the risk without removing it.
  • Give triage agents triage tools. Reading and labelling issues needs no shell; Cline says future automation will be read-only with no shell access.
  • Restrict who can trigger an agent with write-capable tools, and keep it away from caches that release jobs use.
  • Keep caches out of publishing workflows and replace long-lived publish tokens. Cline did both, moving npm publishing to OIDC provenance through GitHub Actions.
  • Verify rotation against the credential, not a dashboard.

Feel it yourselfThe replay lab puts you on the attacker's side of a CI build agent that follows the text of a pull request as build steps and can read the deploy key.

FAQ

What was Clinejection?

A vulnerability chain in Cline's GitHub repository, disclosed by Adnan Khan on 9 February 2026. Cline's AI issue-triage bot put each new issue's title into its prompt and could run shell commands, so an issue title could make it execute attacker-chosen code. From there, GitHub Actions cache poisoning could reach the nightly release jobs that held Cline's npm, VS Code Marketplace and OpenVSX publish tokens.

How did a prompt injection lead to a rogue npm release?

After the disclosure Cline rotated its tokens but deleted the wrong npm token. On 17 February an unknown party used the still-valid one to publish [email protected], which added an install script that globally installed OpenClaw. It was live for about eight hours before Cline released 2.4.0 and revoked the token. The VS Code and JetBrains extensions were not affected.

How do you secure AI agents in CI/CD pipelines?

Treat issue and pull-request text as untrusted data, give triage agents read-only tools with no shell, limit who can trigger them, keep caches out of release workflows, and publish with short-lived OIDC credentials instead of long-lived tokens. After rotating a credential, check that the old one no longer works.

Replay this attack
Open a pull request whose title and body a CI build agent follows as build steps, and steer its own file and HTTP tools into sending the deploy key to a host it should never contact — attacker-written trigger text driving a privileged CI agent, the pattern Clinejection used.
Open the live lab
A live, sandboxed lab. It recreates the technique, not this exact product.