StepSecurity Details Compromise of codfish/semantic-release-action GitHub Action

Summary
StepSecurity reports that attackers hijacked codfish/semantic-release-action tags on June 24, 2026, delivering a Bun payload that targets CI secrets and propagates through repositories, developer AI-tool configurations, SSH hosts, and package registries.
Key points
- StepSecurity says an attacker force-pushed a malicious commit on June 24, 2026, and redirected version tags; workflows using moved tags could run the payload.
- The modified action changed from a Docker runner to a composite action that installs Bun and runs the payload with always() guards.
- Static analysis describes attempts to harvest GitHub OIDC tokens and Personal Access Tokens, encrypt collected material, and use GitHub commit messages for dead-drop commands.
- The payload is designed to plant malicious files and hooks targeting 13 AI coding assistants, propagate to SSH hosts, and publish secondary packages to npm, PyPI, and RubyGems.
- StepSecurity reports runtime monitoring observed GitHub API traffic. The article also says Harden-Runner can detect suspicious activity and stop a process before a runner-memory read completes.
- The article recommends pinning actions to full commit SHAs; it also describes StepSecurity policies for blocking compromised actions and detecting moved-tag references.
Article Details
- Attack Vectors
- The attacker force-pushed a malicious commit to codfish/semantic-release-action and redirected version tags to it, causing workflows using those mutable tags to run the payload.
- The modified composite action installs Bun and runs an obfuscated JavaScript payload with `if: always()` guards, including when earlier workflow steps fail.
- The payload searches public GitHub commit messages for operator instructions and a token, then uses GitHub APIs for command retrieval and secret exfiltration.
- The payload harvests GitHub tokens and other credentials, attempts to read secrets from the GitHub Actions runner's process memory, and commits malicious files to accessible repositories.
- The payload adds AI-assistant and editor startup hooks to repository files and local configurations, and attempts SSH propagation using hosts found in `~/.ssh/known_hosts` and `~/.ssh/config`.
- With registry credentials, the payload can publish secondary malicious packages to npm, PyPI, and RubyGems.
- Defensive Notes
- Pin GitHub Actions to full-length commit SHAs rather than mutable version tags.
- Check and disable attacker-created repository rulesets that make compromised tags immutable before attempting recovery.
- Use compromised-action blocking and imposter-commit detection to prevent workflows from running compromised or tag-drifted action commits.
- Monitor runner process, file-access, and network activity; the article reports Harden-Runner detecting an attempted read of Runner.Worker process memory and terminating the process.
- Review repositories and developer-machine AI assistant and editor configurations for injected hooks and malicious files.
MITRE ATT&CK
T1018 · Remote System DiscoveryThe payload extracts SSH targets from `~/.ssh/known_hosts` and `~/.ssh/config`.T1021.004 · SSHThe payload executes itself on discovered hosts over SSH.T1041 · Exfiltration Over C2 ChannelThe article reports that the payload exfiltrates an encrypted envelope of collected secrets through GitHub API traffic, which also serves as its command channel.T1059.004 · Unix ShellThe malicious composite action invokes `bun run` from a bash step.T1059.007 · JavaScriptThe action runs the obfuscated JavaScript payload in `index.js` using Bun.T1102.001 · Dead Drop ResolverThe payload searches public GitHub commit messages for dead-drop tokens and signed operator commands.T1195.002 · Compromise Software Supply ChainThe attacker compromised the codfish/semantic-release-action supply chain by force-pushing a malicious commit and redirecting version tags used by downstream workflows.T1528 · Steal Application Access TokenThe payload steals GitHub OIDC tokens and Personal Access Tokens, and retrieves an operator GitHub token from the dead drop.T1552.001 · Credentials In FilesThe payload searches local configuration and credential files, including `.npmrc`, `~/.pypirc`, and gem credentials, for registry credentials.T1570 · Lateral Tool TransferThe payload copies `index.js` to discovered hosts with `scp` before executing it remotely.
Vendors
Products
Bunthe action from a Docker-based runner to a composite action, adding two steps — one to install the Bun runtime via oven-sh/setup-bun and one to execute the payload via bun run, both guarded with if: always() soClaude Code.claude/settings.json — Claude Code settings with a SessionStart hook pointing at .claude/index.jscodfish/semantic-release-actionOn June 24, 2026 at 15:39:06 UTC, an attacker force-pushed a malicious commit to codfish/semantic-release-action and redirected several version tags to point at the malicious commit. Any workflow that ran against one ofGitHub Actionsagainst one of these tags after that timestamp executed the attacker's payload directly inside the GitHub Actions runner. The payload steals GitHub OIDC tokens, harvests Personal Access Tokens matching known GitHubHarden-RunnerStepSecurity Harden-Runner Runtime Analysis
