T08 · Insecure Dependencies
- Location
SKILL.md:520- Finding
Mutable GitHub Action Tags in Privileged Deployment Workflows
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:351,SKILL.md:520,SKILL.md:539,SKILL.md:550, andSKILL.md:573
Vulnerability Type: Supply-chain risk from mutable GitHub Action references
Risk Level: MediumVulnerable Code
yaml - uses: dorny/paths-filter@v3yaml - name: Deploy via SSH uses: appleboy/ssh-action@v1 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} port: ${{ secrets.VPS_PORT }}yaml - name: Deploy via rsync uses: burnett01/rsync-deployments@7yaml - name: Restart service uses: appleboy/ssh-action@v1 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} port: ${{ secrets.VPS_PORT }}yaml - uses: appleboy/ssh-action@v1 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }}The Skill also explicitly requires mutable major-version tags:
markdown 3. **Always pin action versions** to major tags (e.g., `@v6`), never `@latest` or `@main`.Technical Analysis
GitHub Action major-version tags such as
@v1,@v3, and@7are mutable references. The repository owner of an action can move such a tag to a different commit after the workflow has been reviewed. Consequently, the code executed by a generated workflow can change without any corresponding modification in the consuming repository.This is particularly sensitive for the SSH and rsync deployment actions because their steps receive production connection information and private SSH keys. A compromised upstream action release, maintainer account, or mutable tag could cause attacker-controlled code to execute inside the workflow runner with access to the step's inputs and available credentials.
No currently malicious upstream action was ...[truncated 1522 chars]
- Remediation
View remediation
Remediation Suggestions
-
Pin every third-party GitHub Action to a reviewed, full 40-character commit SHA rather than a branch or version tag.
-
Preserve readability by adding the corresponding release number in a comment:
yaml - uses: appleboy/ssh-action@0123456789abcdef0123456789abcdef01234567 # v1.x.y -
Apply SHA pinning to first-party actions as well, including
actions/checkoutand runtime setup actions. -
Use Dependabot or Renovate to propose controlled SHA updates that can be reviewed before adoption.
-
Restrict each workflow's
permissionsblock to the minimum required capabilities. -
Protect production jobs with GitHub Environments, required reviewers, branch restrictions, and environment-scoped secrets.
-
Use a dedicated deployment account with no interactive login, no unrestricted
sudo, and access limited to the required application directory and service. -
Prefer short-lived credentials or an identity-federation mechanism over reusable SSH private keys where the deployment platform supports it.
-
Review the source and release provenance of every third-party action before adding or updating it.
-
