← All permissions
Repository permission·workflows:write
Workflows: Write
Tier 1 · High
Why Tier 1
Changes files under .github/workflows. A changed workflow runs with the repository's secrets and can ask for any token permission, so this is a direct path to secrets and cloud access.
Data plane permissions start at Tier 2. This one is raised for the reason above.
- Target
- Repository
- Plane
- DataWorkflows: Workflow files and runs, variables, deployments, environments and Pages.
- Granted by
- Fine-grained PAT, GitHub App
- Available on
- Every setup
Roles that include it
- T0OwnerThe organization and every repository in it
- T0All-repository adminEvery repository in the organization
- T1WriteOne repository
- T1MaintainOne repository
- T1AdminOne repository
- T1Collaborator on a personal repositoryOne repository owned by a personal account
- T1All-repository writeEvery repository in the organization
- T1All-repository maintainEvery repository in the organization
Classic scopes that reach it
Attack paths
Techniques it enables
- Have a workflow approve the PR Submit malicious code
- Add a workflow that dumps secrets Steal CI secrets and tokens
- Leave a dormant workflow behind Keep access
Escalations it starts
- Change a workflow, get its secrets: Every secret the repository's workflows can read, and cloud access through OIDC.
Reached through
- Add yourself to a team with repository access · from The Team maintainer role on a team with repository access
- Change a shared reusable workflow · from Contents: Write
- Claim the old name of a renamed Action · from An Action or reusable workflow whose owner renamed or deleted their account or repository
Abused in
Fixed or limited by
- Enable audit logging and export it to a SIEM for retention and detection
- Branch protection on default/release branches: required reviews + required status checks
- CODEOWNERS in place, required on sensitive paths
- Rulesets applied: push restriction, tag protection, sensitive file-path protection
- Set the default GITHUB_TOKEN permission to read-only at the org level
- Inventory every Actions secret and its visibility/scope; the results are usually surprising
- Cloud credentials migrated from static keys to OIDC federation, scoped to repo + branch