ghtier
← Back to Application plane incidents
ApplicationMarch 2025

tj-actions/changed-files supply-chain compromise (CVE-2025-30066)

The attacker used a previously obtained GitHub token with write permissions to push a commit disguised as renovate[bot], slipped into a legitimate auto-merged PR, then retroactively repointed multiple version tags at the malicious commit, affecting over 23,000 repositories. The payload dumped runner memory to logs, exposing access keys, PATs, npm tokens, and private RSA keys. Upstream, reviewdog/action-setup (CVE-2025-30154) was backdoored first, and researchers traced the original target to Coinbase's agentkit repo. The permission abused, contents:write on an Action repo, implies tag-write, which implies control of every consumer pinning by tag.

Permissions abused

contents:write on an Action repo (tag rewrite)

On the permission reference

Reported by: Unit42

How it unfolded

  1. 1

    An upstream dependency is backdoored first

    Attackers compromised reviewdog/action-setup (CVE-2025-30154), a dependency of the tj-actions release process, obtaining a GitHub token with write permissions in the process.

  2. 2

    A commit is disguised as a routine bot contribution

    Using that write token, the attacker pushed a commit to tj-actions/changed-files crafted to look like an automated renovate[bot] update, and it was folded into a legitimate pull request that auto-merged.

  3. 3

    Release tags are retroactively repointed

    The attacker then force-moved multiple existing version tags to point at the malicious commit. Every consuming workflow pinning by tag — not by commit SHA — silently ran the tampered action on its very next run.

  4. 4

    The payload dumps runner memory into public logs

    The injected code printed the CI runner's process memory straight into the workflow's own log output, a public artifact on public repositories, exposing access keys, PATs, npm tokens, and private RSA keys.

  5. 5

    23,000+ repositories are exposed in one sweep

    Because tj-actions/changed-files was so widely consumed, the tag retarget alone reached every downstream repository's next workflow run; researchers traced the original intended target to Coinbase's agentkit repository.

Mitigations

  • Pin third-party Actions to a full commit SHA, never a mutable tag or branch — a tag can be retargeted with no warning

  • Restrict which Actions can run to GitHub-verified creators or an internal allow-list

  • Enable dependency review on pull requests — surfaces unexpected Action version bumps before merge

  • Apply tag-protection rulesets on your own releases — tags can't be silently force-moved after publication

  • Treat workflow log output as a secret-exposure surface — avoid any step that could dump environment variables or process memory into it

Frameworks

Part of

Contained. First seen March 2025. Mapping by ghtier, not yet reviewed. Threat landscape