▸ SECURE CONNECTION ▸ LATENCY: 4.2ms ▸ AGENTS: 17,432 ▸ THREAT LEVEL: NOMINAL
ROGUE TERMINAL v1.0 ESC to close
← Back to blog
June 25, 2026 by Rogue Security Research
agentic-securitysupply-chaingithub-actionscoding-agentsCI-CDAI-agentsOWASPASI03ASI04ASI05ASI07

A Release Action Became an Agent Worm

Supply chain compromise

A GitHub Action was turned into an agent infection path.

The codfish/semantic-release-action compromise is not just another poisoned CI dependency. It shows the next shape of supply chain attacks: steal CI credentials, poison repositories, plant hooks in AI coding tools, and use the developer’s own agent stack as the persistence layer.

mutable tagsCI credential theftAI assistant hooksGitHub Actionsruntime containment

On June 24, 2026, attackers compromised codfish/semantic-release-action, force-pushed malicious code, and moved multiple version tags so downstream workflows would execute the attacker’s payload the next time CI ran.

That is the boring part.

The important part is what the payload tried to become.

This was not a one-shot secret stealer. It was built like a propagation system. It targeted GitHub tokens, personal access tokens, package registry credentials, SSH trust paths, and developer AI assistant configuration. It tried to move from CI into repositories, from repositories onto developer machines, and from developer machines into the AI tools that now open codebases, read instructions, and execute commands.

That is the new supply chain problem.

What Actually Changed

The legitimate action was Docker-based. The malicious version switched the action into a composite action and added extra steps that installed Bun and ran a large obfuscated JavaScript payload.

The ugly detail is the execution guard: the injected steps used if: always().

So even if the release step failed, the malware still ran.

2026-06-24
compromise window
15:39 UTC
tag hijack time
512 KB
obfuscated payload
13
AI tools targeted

The payload also chose Bun on purpose. Many Node security tools rely on Node-specific interception patterns. Switching runtime is a quiet way to slip around assumptions baked into developer security tooling.

This is a recurring supply chain lesson: the malicious change often looks like a small build-system detail, not a giant red flag.

The Kill Chain

From release automation to agent persistence
01
Move the tag
Existing workflows keep using the same version label, but it now resolves to attacker code.
02
Run inside CI
The payload executes with runner context, repository metadata, and injected workflow secrets.
03
Steal credentials
GitHub tokens, PATs, package registry credentials, and cloud material become the next pivot.
04
Poison repositories
Malicious files are committed back to branches with dependency-update style messages.
05
Hijack AI tools
Agent config and rule files become startup hooks for future developer sessions.

The line between CI malware and agent malware is now blurry.

CI has credentials. Agents have autonomy. Developer machines have both trust and reach. An attack that can cross those three environments can turn one compromised action into a multi-stage enterprise foothold.

Why AI Coding Assistants Matter Here

The payload targeted configuration paths for tools including Claude, Codex, Gemini, Copilot, Kiro, OpenCode, Cline, Aider, Tabby, Amazon Q, Cody, Bolt, and Continue.

That list matters because AI coding assistants are becoming developer control planes.

They read repo instructions. They invoke shells. They edit files. They touch secrets by accident. They run inside IDEs, terminals, and cloud workspaces. They also normalize a dangerous behavior: executing project-local instructions as part of the workflow.

That creates a persistence opportunity.

If malware can commit a hidden startup hook into a repository, then the next developer or coding agent that opens the repo may rehydrate the attack outside CI. If it can modify rule files or assistant config, it can shape what the agent believes is normal. If it can hide inside “background task” instructions, it can use the assistant’s trust path against the developer.

The real lesson
Agent configuration is now executable infrastructure. Treat it like shell profile code, not documentation.

This is where old supply chain advice starts to feel incomplete.

Pinning dependencies matters. Rotating tokens matters. Locking down CI matters. But if your coding agent reads project-local rules and executes hooks with developer privileges, repository content itself has become a runtime boundary.

The Failure Was Mutable Trust

The compromised action spread through tags.

Tags feel stable. They look like versions. In practice, a tag is just a reference. If a workflow uses codfish/semantic-release-action@v2, GitHub resolves that reference at runtime. If the tag moved, the workflow runs different code without the downstream repository changing a single line.

That is why “we did not change anything” is no longer a useful incident response answer.

Your dependency graph can change under you.

Your CI runner can execute new code under an old label.

Your agent can follow new instructions from files that look like harmless repo metadata.

AssumptionWhat failedBetter control
A version tag means stable code.Mutable Git tags can be force-updated.Pin GitHub Actions to full-length commit SHAs and monitor for tag drift.
CI is an isolated build sandbox.CI often holds release tokens, package credentials, cloud access, and repository write scope.Use least-privilege workflow tokens, scoped release jobs, egress policy, and short-lived credentials.
Repo config is just configuration.AI assistant hooks, task files, and rule files can become execution paths.Gate agent config changes, scan project-local hooks, and require explicit approval for startup commands.
Signed provenance proves safety.Malware can use legitimate signing and package infrastructure after credential theft.Combine provenance with runtime behavior, publisher identity, and anomaly detection.

What To Do Now

If your organization used codfish/semantic-release-action, assume any workflow that ran after the tag movement needs investigation.

Start with the obvious:

  • Disable workflows that reference the compromised action.
  • Rotate GitHub tokens, PATs, npm tokens, PyPI credentials, RubyGems credentials, and cloud secrets exposed to affected jobs.
  • Review workflow run logs after June 24, 2026 15:39 UTC.
  • Search repositories for unexpected .claude, .vscode, .github, assistant rule files, and dependency-update commits.
  • Audit GitHub Actions references that use moving tags instead of full commit SHAs.
  • Review branch protection and repository rulesets for attacker-created immutability or lockout rules.

Then do the less obvious:

  • Treat AI assistant configuration as executable code.
  • Block project-local startup hooks unless explicitly approved.
  • Put coding agents behind policy that can inspect file reads, shell execution, network egress, and credential access.
  • Separate release credentials from general CI.
  • Use runtime controls that can stop a build step when it starts reading memory, enumerating secrets, or using GitHub as an exfiltration channel.
CONTROL 01
Immutable dependencies
Pin actions to commit SHAs. Watch for tag changes. Treat rolling tags as convenience, not trust.
CONTROL 02
Agent hook review
Require review for .claude, .vscode/tasks.json, MCP config, rule files, and assistant startup commands.
CONTROL 03
Runtime enforcement
Observe what actions and agents actually do: process tree, file access, network egress, token use, and command execution.

The Bigger Pattern

This attack sits at the intersection of three trends:

  1. Release automation has production authority.
  2. Developer agents execute local context.
  3. Supply chain malware is moving from theft to persistence.

That combination is nasty.

The old model was “a malicious package runs during install.” The new model is “a malicious package modifies the repo so the agent keeps running it later.”

That changes the defender’s job.

Security teams cannot stop at static dependency scanning. They need to model how code, config, CI, IDEs, agents, credentials, and package registries interact at runtime. They need to know which systems can write to repos, which agents trust repo instructions, and which tokens can turn one compromised workflow into a publishing pipeline.

Rogue take
The next supply chain control plane is the agent runtime. If it can read untrusted repo content, execute commands, and touch credentials, it needs the same policy, isolation, and auditability as production infrastructure.

The codfish compromise is a warning shot.

Not because the technique is exotic. Because it is practical.

Mutable tags. Release tokens. Repo write access. Project-local agent config. Startup hooks. Trusted GitHub traffic. Package registry credentials.

None of those are fringe components. They are normal developer infrastructure.

That is exactly why this class of attack will keep working.