Skip to content

feat: pin actions e tripwire publish-watch (postmortem TanStack)#34

Merged
rlueder merged 1 commit into
mainfrom
feat/tanstack-hardening
May 14, 2026
Merged

feat: pin actions e tripwire publish-watch (postmortem TanStack)#34
rlueder merged 1 commit into
mainfrom
feat/tanstack-hardening

Conversation

@rlueder
Copy link
Copy Markdown
Member

@rlueder rlueder commented May 14, 2026

Resumo

Endurecimento dos templates de workflow após o postmortem do TanStack (2026-05-11). A entrada do ataque (pull_request_target + cache poisoning + extração de OIDC) não existe aqui, mas duas lições independentes do postmortem se aplicam:

  1. Refs flutuantes de actions — toda actions/checkout@v6, pnpm/action-setup@v5, etc. agora aponta para SHA imutável + comentário de versão (formato suportado pelo Renovate).
  2. Sem tripwire em registry — TanStack soube do incidente por um terceiro 30 min depois. Novo workflow publish-watch.yml roda em cron de 15 min, compara npm view <pkg> version contra as tags git locais e abre issue security/publish-watch quando há divergência.

Mudanças

  • SHA pin em todos os workflows reusáveis (_publish, _release, _checks, _deploy-site, publish-tag, review, doctor) + no novo publish-watch. Cobre actions/*, pnpm/action-setup, actions/create-github-app-token, cloudflare/wrangler-action, slackapi/slack-github-action.
  • renovate.json: preset helpers:pinGitHubActionDigests + regra pinDigests: true no grupo github-actions — novas actions adicionadas pelos consumers já entram fixadas.
  • publish-watch.yml (novo): cron */15 * * * *, lê pacotes públicos do workspace via pnpm m ls --json, valida que cada <pkg>@<latestNpm> existe como tag local (formato <name>@<ver> ou v<ver>). Mensagens em pt-BR. Não enumera categorias de ameaças.
  • templates.manifest.yml: registra publish-watch.yml com required_when: publishes_to_npm.
  • precisa sync: imprime lembrete pós-sync sobre criar o environment npm-publish com revisor requerido (passo manual no UI do GitHub que o CLI não consegue automatizar) e sobre o cron novo do publish-watch.

Itens fora desta PR

  • Cache segregation (PR vs release context) — refator significativo (trocar o cache nativo de setup-node por actions/cache@<sha> com chave por github.event_name) para um ganho de defense-in-depth baixo, dado que não temos pull_request_target. PR separado se valer a pena.
  • Sync nos consumers — fhir-brasil / datasus-brasil / medbench-brasil precisam de PRs próprias rodando precisa sync após o merge + publish deste CLI. Será feito em sequência.

Verificação

  • pnpm format:check, pnpm turbo run lint typecheck test passaram localmente
  • Todos os workflows fazem parse como YAML válido
  • Nenhuma ref flutuante @v[0-9] em ações externas (grep)
  • Configurar environment npm-publish em Settings → Environments com revisor requerido (já presente nos consumers; conferir após sync)

- pin de todas as actions externas em SHA + comentário de versão nos
  workflows reusáveis (_publish, _release, _checks, _deploy-site,
  publish-tag, review, doctor) e no novo publish-watch
- helpers:pinGitHubActionDigests no renovate.json para garantir que
  novas actions adicionadas pelos consumers já entrem fixadas
- publish-watch.yml: cron de 15 min comparando `npm view <pkg> version`
  contra as tags git locais; abre issue `security`/`publish-watch`
  quando a versão publicada não tem tag correspondente — tripwire para
  publicação fora do fluxo (workflow comprometido, token vazado,
  republicação manual)
- precisa sync agora lembra do passo manual de criar o environment
  npm-publish (com revisor requerido) e do cron novo do publish-watch

Sync necessário em fhir-brasil, datasus-brasil, medbench-brasil após
o release deste pacote (semantic-release publica o CLI ao merge).

Motivação: postmortem do TanStack (2026-05-11) — embora a entrada do
ataque (pull_request_target + cache poisoning + OIDC) não exista aqui,
o postmortem destacou refs flutuantes de actions e ausência de tripwire
em registry como riscos independentes de supply chain.
@github-actions
Copy link
Copy Markdown

Automated Review — Round 1

Summary

The PR introduces a new workflow for publishing watch and modifies multiple GitHub workflows and scripts for improved notifications and environment dependency checks. However, there are several issues related to potential performance drawbacks and security concerns with hardcoding action versions.

Changes

  • Introduced a new workflow 'publish-watch.yml'.
  • Updated action versions in existing workflows.

🔍 Found 6 suggestions (see inline comments)

Reviewed by OpenAI gpt-4o-mini (fallback) | 7,207 in / 385 out | $0.0013 — Round 1 of 2

@@ -55,9 +58,60 @@ export async function runSync(opts: SyncOptions): Promise<void> {
),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The method readFileSync is called multiple times on the same file, which results in unnecessary I/O operations. Consider storing the file contents in a variable to improve performance.

@@ -18,9 +18,9 @@ jobs:
runs-on: ubuntu-latest
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dependencies on specific SHA commits for actions (e.g., actions/checkout) can lead to potential security issues if those commits become vulnerable or deprecated. Instead, consider using tagged versions to ensure stability while allowing updates.

@@ -33,7 +33,7 @@ jobs:
steps:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to previous comments, hardcoding specific commit hashes for actions introduces risks. It’s better to rely on specific version tags for the respective GitHub actions for better security.

@@ -41,13 +41,13 @@ jobs:
contents: read
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As previously noted, using fixed SHAs for actions can be insecure. Change to version tags.

@@ -44,7 +44,7 @@ jobs:
- name: Check for package changes across pushed commits
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same issue with fixed commit hashes applies here. It's recommended to work with stable action version tags instead.

@@ -30,11 +30,11 @@ jobs:
should_run: ${{ steps.check.outputs.should_run }}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoding commit hashes for actions creates security vulnerabilities; it's preferable to use stable versions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant