Incident Overview (Without Journalism)
Tier A (confirmed): tj-actions/changed-files foi publicado como comprometido na GitHub Advisory Database (CVE-2025-30066), com versões afetadas até 45.0.7, correção em 46.0.1 e indicação explícita de que múltiplas tags foram retargeteadas para um commit malicioso entre 14 e 15 de março de 2025.
Tier A (confirmed): A thread de issue do mantenedor registra suspeita de tags comprometidas em 14 de março de 2025, e a release v46.0.1 inclui orientação de incidente exigindo revisão das execuções de workflow no intervalo de 14-15 de março e rotação imediata de segredos quando saída decodificada suspeita for detectada.
Tier A (confirmed): A CISA emitiu alerta para esse comprometimento e posteriormente conectou atividade adjacente de comprometimento em reviewdog/action-setup@v1 (CVE-2025-30154), ampliando o raio operacional para dependências transitivas de Actions.
Tier B (inferred): O núcleo do incidente não foi apenas execução de código malicioso; foi abuso de referência mutável na semântica de confiança de CI, onde muitas organizações tratavam tags como âncoras de governança quase imutáveis.
Tier C (unknown): O caminho completo de acesso inicial do atacante aos repositórios relevantes de Action e o conjunto completo de repositórios downstream com credenciais de alto valor materialmente expostas não foi enumerado publicamente.
Bounded assumption statement: As conclusões arquiteturais abaixo assumem que workflows empresariais consumiam pelo menos uma action de terceiros por tag mutável e mantinham segredos reutilizáveis de longa duração no contexto do runner durante as janelas de comprometimento.
Primary institutional surface: Mission-Critical DevSecOps. Capability lines engaged: Reproducible and signed build pipelines; Policy-as-code enforcement; Immutable rollout and rollback control.
Failure Surface Mapping
Definição da superfície:
S = {C, N, K, I, O}C: control planeN: network layerK: key lifecycleI: identity boundaryO: operational orchestration
Falhas observadas por camada:
- Falha em
C: lógica de admissão de workflow confiou em tags mutáveis como identidades estáveis de execução. - Falha em
K: segredos expostos permaneceram válidos por tempo suficiente para preservar utilidade ao atacante após divulgação em log. - Falha em
O: contenção de emergência e rotação forçada de segredos não foram determinísticas em todos os repositórios. - Estresse em
I: confiança transitiva de actions ampliou delegação de identidade além de fronteiras de aprovação explícita da empresa.
Mapeamento de classe de falha:
- Primária: Byzantine (
action_ref -> commitmudou de forma adversarial enquanto permanecia sintaticamente válida). - Secundária: Omission (ausência de gate de política exigindo pin em SHA imutável e checagem de atestação).
- Secundária: Timing (atraso entre detecção e revogação de credenciais criou janela de exploração).
Formal Failure Modeling
Seja S_t o estado de segurança do workflow antes da execução t, e T(S_t) a transição produzida pela resolução de dependências e execução do job.
Invariante exigido para execução segura de action:
Condição de execução admissível:
Tier A (confirmed): Durante a janela do incidente, tags mutáveis foram repontadas para commit malicioso em pelo menos uma action amplamente usada.
Tier B (inferred): Para workloads afetados, ref_immutable=0 no tempo de decisão; portanto I(S_t)=0, mas a execução prosseguiu.
Vínculo operacional: exigir política em nível organizacional que bloqueie execução de workflow quando ref_immutable != 1 para actions de terceiros.
Adversarial Exploitation Model
Classes de atacante:
A_passive: monitora logs públicos de workflow em busca de vazamento de credenciais.A_active: modifica referências de action ou artefatos de release para introduzir comportamento de dump de segredos.A_internal: abusa de privilégios de mantenedor ou automação de release.A_supply_chain: pivota por dependências transitivas de actions.A_economic: monetiza credenciais vazadas por takeover de infraestrutura ou posicionamento em cadeia de suprimentos secundária.
Modelo de pressão de exploração:
Onde:
\Delta t: latência entre execução comprometida e revogação de segredos.W: largura da fronteira de confiança (quantos repositórios e workflows confiam implicitamente em referências mutáveis).P_s: escopo efetivo de privilégio das credenciais vazadas.
Tier A (confirmed): A orientação de incidente exigiu auditoria de execuções em janelas de tempo específicas e rotação de segredos potencialmente expostos.
Tier B (inferred): Em organizações grandes com workflows reutilizáveis centralizados, W tende a ser alto, tornando hardening local por repositório insuficiente.
Tier C (unknown): A distribuição de P_s entre organizações afetadas não foi reportada nas divulgações primárias.
Root Architectural Fragility
- Compressão de confiança: versões semânticas mutáveis e tags foram tratadas operacionalmente como âncoras de identidade imutáveis.
- Control-plane privilege escalation: o caminho de resolução de referências de action adquiriu autoridade implícita sobre workloads portadores de segredos.
- Key lifecycle failure: muitos segredos de CI eram long-lived e de escopo amplo, convertendo disclosure em risco persistente de acesso.
- Rollback/rollforward governance failure: controles de rollback de versão existiam, mas a orquestração de invalidação de segredos frequentemente atrasou em relação à remediação de código.
- CI/CD privilege leakage: cadeias transitivas de actions excederam fronteiras explícitas de aceitação de risco.
Tier B (inferred): A fragilidade durável é a mutabilidade no tempo de governança, não um único commit comprometido.
Code-Level Reconstruction
# Padrão vulnerável: tag mutável + credenciais de alto escopo no mesmo contexto.
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v4
- uses: tj-actions/changed-files@v45
- run: ./deploy.sh
env:
CLOUD_API_KEY: ${{ secrets.CLOUD_API_KEY }}
# Controlador de admissão de produção para actions de terceiros.
def admit_workflow_action(action_ref, attestation, secret_profile):
immutable_ref = is_full_length_commit_sha(action_ref)
verified_source = verify_attestation(attestation)
short_lived = secret_profile.max_ttl_minutes <= 15
minimal_scope = secret_profile.scope in {"read_only", "deploy_limited"}
if not (immutable_ref and verified_source and short_lived and minimal_scope):
return {"decision": "DENY", "reason": "supply_chain_invariant_violation"}
return {"decision": "ALLOW"}
Tier B (inferred): A imposição desse gate na admissão de workflow teria reduzido o comprometimento de exposição ampla de segredos para falhas localizadas de execução.
Operational Impact Analysis
Tier A (confirmed): Os advisories da CISA e do GitHub caracterizam potencial divulgação de PATs, access keys, tokens npm e chaves privadas em logs de workflow para execuções afetadas.
Tier B (inferred): Os resultados operacionais incluem carga imediata de rotação de credenciais, congelamento emergencial de workflows e aumento de latência de deploy durante rollout de pinning e remediação de política.
Tier B (inferred): Para organizações que usam templates de workflow compartilhados, a degradação de throughput é não linear porque a remediação bloqueia múltiplos times simultaneamente.
Modelo de blast radius:
Vínculo de decisão:
- Se
B >= 0.2, impor reemissão corporativa de credenciais de CI e centralização temporária de gate de deploy. - Se
0.05 <= B < 0.2, aplicar rotação faseada com prioridade para identidades de escopo produtivo. - Se
B < 0.05, manter contenção direcionada com controles obrigatórios de referência imutável.
Enterprise Translation Layer
- CTO: tratar resolução de dependências de CI como lógica crítica de plano de controle, não metadado de conveniência do desenvolvedor.
- CISO: reclassificar ingestão de Actions de terceiros como fronteira de confiança de supply chain com controles mandatórios baseados em evidência.
- DevSecOps: impor pin em SHA imutável, permissões mínimas de token, federação OIDC de curta duração e controles de egress em runtime.
- Board: definir apetite de risco para
\Delta taceitável e TTL máximo obrigatório de segredo em ecossistemas de CI.
STIGNING Hardening Model
Controles prescritivos:
- Isolamento do plano de controle: engine de política independente valida referências de action antes da execução no runner.
- Segmentação do ciclo de vida de chave: substituir segredos long-lived de repositório por credenciais cloud de curta duração emitidas por OIDC.
- Endurecimento de quorum: dupla aprovação para mudanças em templates de workflow organizacionais e política de allowed-actions.
- Reforço de observabilidade: centralizar telemetria de resolução de dependência de workflow, detecção de anomalia de logs e trilhas de uso de segredos.
- Envelope de rate limiting: limitar classes de workflow de alto privilégio durante investigação ativa de supply chain.
- Rollback seguro para migração: manter workflows de fallback testados com manifestos imutáveis de actions pré-aprovados.
ASCII structural diagram:
[Workflow Trigger]
|
v
[Policy Gate: ref immutability + attestation + token profile]
| pass
v
[Runner Sandbox] ---> [Egress Policy] ---> [Approved Endpoints]
|
v
[Short-lived OIDC Credential Broker]
|
v
[Cloud/API Access (scoped, expiring)]
Strategic Implication
Classification: governance failure.
Implicação de 5-10 anos:
- A resiliência de supply chain em CI será determinada por enforcement de imutabilidade de referência e proveniência verificável por política, não apenas por velocidade de rotação de segredos pós-incidente.
- Empresas convergirão para allowlists centralizadas de actions, requisitos de atestação e credenciais de workload vinculadas a identidade criptográfica.
- Ponteiros mutáveis de dependência em automação privilegiada se tornarão finding regulatório em setores de alta garantia.
References
- GitHub Advisory Database (CVE-2025-30066): https://github.com/advisories/ghsa-mrrh-fwg8-r2c3
- Alerta CISA (18 mar 2025; rev. 26 mar 2025): https://www.cisa.gov/news-events/alerts/2025/03/18/supply-chain-compromise-third-party-tj-actionschanged-files-cve-2025-30066-and-reviewdogaction
- Issue de incidente do mantenedor (
#2463): https://github.com/tj-actions/changed-files/issues/2463 - Release do mantenedor
v46.0.1: https://github.com/tj-actions/changed-files/releases/tag/v46.0.1 - GitHub Advisory Database (CVE-2025-30154): https://github.com/advisories/ghsa-qmg3-hpqr-gqvc
- GitHub Docs, secure use reference para hardening de Actions: https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions
Conclusion
O incidente demonstra que a confiança em CI colapsa quando referências mutáveis de dependência atravessam caminhos de execução privilegiados sem verificação imutável e sem ciclo de vida restrito de credenciais. Resiliência durável exige converter seleção de dependência de workflow em controle de admissão determinístico, imposto por política e verificável criptograficamente.
- STIGNING Infrastructure Risk Commentary Series
Engineering Under Adversarial Conditions