STIGNING

Artigo Técnico

Compromisso por Retarget de Tags no GitHub Actions: Colapso de Confiança Mutável em Pipelines CI

Expansão de privilégio no plano de controle por retag de Action de terceiros

25 de abr. de 2026 · DevSecOps Pipeline Compromise · 7 min

Publicação

Artigo

Voltar para o arquivo do blog

Briefing do artigo

Contexto

Programas de DevSecOps Pipeline Compromise exigem fronteiras explicitas de controle em distributed-systems, threat-modeling, incident-analysis sob operacao adversarial e degradada.

Pré-requisitos

  • Baseline de arquitetura e mapa de fronteiras para DevSecOps Pipeline Compromise.
  • Premissas de falha definidas e ownership de resposta a incidentes.
  • Pontos de controle observaveis para verificacao em deploy e runtime.

Quando aplicar

  • Quando devsecops pipeline compromise afeta diretamente autorizacao ou continuidade de servico.
  • Quando comprometimento de componente unico nao e um modo de falha aceitavel.
  • Quando decisoes de arquitetura precisam de evidencia para auditoria e assurance operacional.

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 plane
  • N: network layer
  • K: key lifecycle
  • I: identity boundary
  • O: 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 -> commit mudou 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:

I(St)=(ref_immutable=1)(provenance_verified=1)(secret_ttlτ)I(S_t) = \big(\text{ref\_immutable}=1\big) \land \big(\text{provenance\_verified}=1\big) \land \big(\text{secret\_ttl} \le \tau\big)

Condição de execução admissível:

T(St) admissible    I(St)=1T(S_t)\ \text{admissible} \iff I(S_t)=1

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:

E=Δt×W×PsE = \Delta t \times W \times P_s

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:

B=affected_repositoriestotal_repositories_using_third_party_actionsB = \frac{\text{affected\_repositories}}{\text{total\_repositories\_using\_third\_party\_actions}}

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 t aceitá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

Referências

Compartilhar artigo

LinkedInXEmail

Navegação do artigo

Artigos relacionados

DevSecOps Pipeline Compromise

Comprometimento de Cadeia de Suprimentos no tj-actions: Mutação de Tag e Caminho de Exfiltração de Segredos de CI

Referências mutáveis de action como falha de fronteira de confiança em CI com implicações empresariais de pipeline

Ler artigo relacionado

DevSecOps Pipeline Compromise

Backdoor no xz Utils: Colapso da Fronteira de Confiança em Build

Comprometimento de pipeline DevSecOps e implicações de controle arquitetural

Ler artigo relacionado

Cloud Control Plane Failure

Instabilidade do Plano de Controle PubSub no Azure East US: Erosão de Quórum sob Pressão de Reconstrução de Réplicas

Contenção de locks, failover malsucedido e acoplamento de domínios de rollback em um evento regional de plano de controle

Ler artigo relacionado

Identity / Key Management Failure

Falha de Governança no Ciclo de Vida de Chaves no Storm-0558

Colapso da fronteira de assinatura de identidade e implicações de confiança em nuvem

Ler artigo relacionado

Feedback

Este artigo foi útil?

Intake Técnico

Aplique este padrão no seu ambiente com revisão de arquitetura, restrições de implementação e critérios de assurance alinhados à sua classe de sistema.

Aplicar este padrão -> Intake Técnico