Skip to content
Menu
Patent pending

A Consequence Record · The Consequence Library

Clinejection: prompt injection and unauthorised package publication

A malicious public GitHub issue influenced an AI-enabled workflow and contributed to a chain that reached software-publishing credentials.

The Consequence Library · How records are made and graded

A crafted GitHub issue title manipulated the Cline repository's AI issue-triage bot into executing arbitrary code, ultimately yielding the npm publish token and producing an unauthorised release of the official package that auto-installed a separate AI agent on any system that installed or updated it.

Date
9 to 17 February 2026
Sector
supply-chain
System type
coding-cyber-agent
Failure stage
tool-call
Consequence
security-compromise
Severity
S3, significant
Confidence
Event: C2, multi-source corroborated
AI attribution: C2, multi-source corroborated
Last verified
16 August 2026

Evidence caveat. Figures circulating for the number of affected developer machines appear only in lower-tier sources and are not reproduced here. The package was live for approximately eight hours; the installed-base figure is not established.

What happened

On 9 February 2026 security researcher Adnan Khan disclosed a vulnerability chain, named Clinejection, in the Cline repository. The repository had introduced an AI issue-triage bot in December 2025 whose configuration embedded the issue title verbatim into the prompt sent to the model. By crafting a malicious issue title an attacker manipulated the agent into executing code within the triage workflow. The low-privilege triage workflow and the high-privilege publish workflow shared a cache namespace; the attacker stuffed the cache with dummy data so that legitimate entries were evicted under the least-recently-used policy, and the privileged nightly release workflow later restored the poisoned data as if legitimate. That yielded the npm publish token, which was used to publish an unauthorised version of the package on 17 February 2026, embedding a post-install script. It was withdrawn about eight hours later. Cline revoked the token, removed the vulnerable triage workflow and moved publishing to short-lived credentials.

Where control failed

A public, unauthenticated input was placed inside a prompt that drove a workflow with execution rights. Privilege separation existed between the triage and publish workflows but was defeated by a shared cache namespace, which is a trust boundary nobody had modelled as one. And the release pipeline authenticated with a long-lived static token, so a single disclosure was sufficient to publish as the project.

The authority question

Nobody authorised the release. The publishing identity was a token, and the token was reachable through a chain that began with a stranger typing text into a public issue tracker. Authority to publish belonged to whoever could reach the credential.

What could be proven afterward

Unusually good. The researcher published the full chain, the malicious package version and its withdrawal are on the public registry record, and independent security vendors reproduced and documented the analysis.

Control state, before and after

Before the consequence

Issue titles interpolated into an agent prompt with execution rights. Shared cache namespace across privilege boundaries. Long-lived static publish token.

After the consequence

Token revoked, vulnerable triage workflow removed, publishing moved to short-lived credentials.

Sources

Record history

Published 16 August 2026. Load-bearing facts re-verified against the cited sources on 16 August 2026. Corrections and material changes are appended here with their dates. To report an error in this record, write to hello@regulayer.com with the record slug and the source you believe is authoritative.

This record describes what sources establish about a consequence and the control state around it. It separates confirmed fact from source-stated cause and from architectural analysis, and it makes no claim that any control or product would have prevented the outcome. Gap codes identify a failure class, not a remedy.