Secretus logo
newsgithub-actionsmini-shai-huludsupply-chain

GitHub Actions Re-Enabled With Malicious Tags: Rotate CI Secrets, Then Pin the SHA

Socket and independent reporting document two compromised GitHub Actions returning with malicious tags still in place. Find affected workflows, rotate exposed secrets, and pin trusted commits.

·7 min read·Secretus Editorial

A blocked dependency can become dangerous again without any change in your workflow file. Socket reports that two GitHub Actions compromised during the May 2026 Mini Shai-Hulud campaign became reachable again on September 16 with their malicious release tags still pointing at the old payload. The affected repositories were disabled again by September 25, but workflows that ran while they were reachable may already have exposed the secrets available to their jobs.

The two actions are actions-cool/issues-helper and actions-cool/maintain-one-comment. The lesson is bigger than these names: a mutable tag is another party's decision about what your build will execute. A temporary outage is not proof that the action is safe when it returns.

What the sources establish

Socket says the actions were compromised on May 18, 2026 and disabled by GitHub on May 19. On September 16, both repositories became accessible again, while their release tags still resolved to the malicious content. Socket observed that a workflow referencing a tag such as actions-cool/issues-helper@v2.2.1 would download and run the payload when the job started. The repositories were disabled again on September 25.

The Hacker News independently reported the re-enablement and described the original payload as harvesting sensitive credentials from CI/CD runners. It also reported that the affected workflows commonly run on a schedule or when someone opens an issue or pull request. That makes the exposure easy to miss: no maintainer needs to merge a new workflow change for an old tag reference to resolve differently.

Socket estimates about 15,000 dependent repositories for issues-helper. That is a dependency-graph figure, not a count of compromised repositories or stolen secrets. Actual exposure depends on whether a repository used either action, how it referenced the action, whether a job ran after September 16, and which credentials the job could reach.

What remains unknown

The public reports do not identify why the repositories were re-enabled, how many downstream workflows ran, which repositories were affected, or which secrets were accessed. They do not establish that every dependent repository was compromised. A failed job may indicate that GitHub blocked the repository before the action executed; a successful run needs a closer review of its logs and the permissions available to the job.

A workflow pinned to a full commit SHA from before May 18 is described by Socket as outside this particular reactivation path. That is not a general guarantee for every old SHA: verify the commit, the action's provenance and the permissions of the calling job before declaring it clean.

A practical response for repository owners

  1. Inventory before assuming. Search every repository and workflow for both action names, including reusable workflows and generated configuration. Treat every version-tag reference as affected until you have verified the exact commit it resolved to during the exposure window.
  2. Disable or replace the action. Remove the housekeeping step where possible. If the workflow still needs it, use a known-clean full commit SHA that predates the compromise and record why that SHA is trusted. Do not replace one mutable tag with another.
  3. Rotate what the job could use. For every run after September 16, list the repository, environment and organization secrets available to the job. Revoke and reissue cloud credentials, package registry tokens, deploy keys, signing material and other long-lived values at their issuer. A short-livedGITHUB_TOKEN normally expires with the job, but review its permissions and any downstream token or deployment it could create.
  4. Read the run history. Look for the affected action being downloaded, unexpected setup steps, a sudden change from a short setup to a multi-minute run, or jobs that resumed after a period of setup failures. Preserve relevant logs before routine retention removes them, without copying their secret values into an issue or incident chat.
  5. Check the repository and release boundary. Review commits, tags, releases, workflow changes, package publications and cloud activity from the exposure window. If a job had write access, treat the repository and every downstream artifact it could publish as part of the investigation.
  6. Make SHA pinning the default. Pin third-party actions to full commit SHAs, restrictGITHUB_TOKEN permissions to the minimum, and require review for changes to workflow files. Pinning does not remove the need to audit a compromised commit, but it stops an upstream tag move from silently changing your build.

Do not put the replacement secret in the incident thread

CI incidents create a tempting handoff: one engineer revokes a token, another creates its replacement and a third needs it to repair the deployment. The incident channel and pull request are useful for recording the action, but they are poor places for the value itself. They persist, spread to everyone on the response team and may be visible to integrations that were never meant to receive the credential.

Verify the recipient through a contact route that was known before the incident. Create the replacement at the issuer, give it only the scope and lifetime required for the repair, and deliver it through an approved short-lived channel. After the operator configures the pipeline, store the value in the organization's managed secret system rather than pasting it back into chat.

Where Secretus helps—and where it does not

Secretus can carry a temporary replacement token, deploy credential or recovery value in a one-time encrypted link after the recipient and destination have been independently verified. That reduces persistent plaintext copies during the human handoff. It does not scan workflows, determine whether a GitHub Action ran, revoke a cloud credential or make a mutable tag trustworthy. Those controls belong in repository policy, the credential issuer and the incident investigation.

Sources