
Reconstrução formalmente verificada e quantitativa do ataque à cadeia de suprimentos do GitHub Actions do Trivy/TeamPCP (CVE-2026-33634): um modelo de incidente TLA+/TLC, análise probabilística PRISM e um estudo de corpus de 189 workflows.
Uma reconstrução quantitativa formalmente verificada do comprometimento da cadeia de suprimentos do GitHub Actions Trivy / "TeamPCP" de março de 2026 (CVE-2026-33634) — modelada em TLA+, verificada exaustivamente com TLC e quantificada com o verificador de modelos probabilísticos PRISM.
Cada número no artigo é regenerado a partir deste repositório. O modelo, as probabilidades, as medições do corpus e a calibragem são todos reproduzidos a partir da fonte com um único comando por camada.
Um atacante que conseguiu mover uma tag de versão flutuante em uma Action amplamente utilizada (trivy-action / setup-trivy) fez com que milhares de pipelines downstream executassem código controlado pelo atacante com credenciais de produção em sua próxima execução de rotina, vazando segredos que semearam um worm npm de segundo estágio. Este projeto faz as perguntas que um relatório de incidente não pode responder formalmente:
TrivySupplyChain/layer1/) — um analisador estático sobre um corpus de workflows reais do GitHub Actions mede com que frequência as construções modeladas ocorrem (14/14 testes unitários; a fração de tag flutuante alimenta a Camada 3).TrivySupplyChain/) — o modelo TLA+ + 10 configurações do TLC reproduzem o ataque e provam quais mitigações o fecham (alcançabilidade, isolamento, refinamento, superfície residual).TrivySupplyChain/layer3/) — o MDP/DTMC do PRISM calcula probabilidades, tempos esperados e a cascata de múltiplos estágios, calibrados contra o conjunto de dados de pacotes maliciosos do OpenSSF e a linha do tempo documentada de fevereiro a março (Feb→Mar).TrivySupplyChain/ The model + verification harness
TrivySupplyChain.tla Core TLA+ transition system
MCTrace.tla, SecureWorkflow.tla, MCRefine.tla
cfg_*.cfg 10 TLC configurations (the validation table)
tools/tla2tools.jar Bundled TLA+ / TLC 2.19
layer1/ Corpus analyzer (Python) + fixtures + tests
layer3/ PRISM models (.prism/.props) + bundled PRISM 4.10.1
asi_evolve/ LLM mitigation-search loop (run_evolve.py) over the verified
PRISM oracle + an archived executed run (example_run.json)
run-all.ps1 Reproduce all 10 TLC checks
env-check.ps1 One-shot environment doctor
Trivy-USENIX-paper/ USENIX paper: main.tex (compiles standalone), main.pdf,
and the filled-in validation-results .docx
Trivy-TeamPCP-Dossier.md Incident dossier — the sourced evidence base (read-only)
Onde está
layer2/? A Camada 2 (reconstrução do incidente) é o nível superior deTrivySupplyChain/— o modeloTrivySupplyChain.tla, as configuraçõescfg_*.cfg, os módulosMC*.tla/SecureWorkflow.tlaerun-all.ps1. Foi construída primeiro como o núcleo, então reside na raiz;layer1/elayer3/são as camadas de validação adicionadas ao redor.
Requisitos: Windows + um JDK (defina JAVA_HOME); Python 3.10+ (Camada 1 e calibragem); Node.js (apenas para regenerar os documentos Word); Git para Windows (fornece as DLLs de runtime MinGW que a biblioteca nativa do PRISM precisa). As ferramentas TLA+ e o PRISM estão incluídos no repositório.
# 0. verify the toolchain
powershell -File TrivySupplyChain\env-check.ps1
# 1. Layer 2 — all 10 TLC checks (reachability, mitigations, isolation, refinement)
powershell -File TrivySupplyChain\run-all.ps1
# 2. Layer 1 — corpus analysis (unit tests + measured floating-tag fraction)
powershell -File TrivySupplyChain\layer1\run-layer1.ps1
# 3. Layer 3 — PRISM: probabilities, multi-stage cascade, parametric, calibration
powershell -File TrivySupplyChain\layer3\run-layer3.ps1
# 4. (optional) ASI-Evolve mitigation search — Claude Opus proposes policies,
# PRISM verifies each one. Needs the Anthropic SDK + an API key.
pip install -r TrivySupplyChain\asi_evolve\requirements.txt
python TrivySupplyChain\asi_evolve\run_evolve.py
As camadas 1–3 são autocontidas e não precisam de chave de API. Apenas o proponente do passo 4 é um LLM; seu oráculo PRISM (asi_evolve/evaluate.py) é executado de forma independente e é o que realmente pontua cada política.
Os fontes .tla, .prism e .py são portáveis; apenas os scripts de execução são Windows PowerShell. Veja TrivySupplyChain/README.md para os comandos manuais (multiplataforma).
A Camada 3 é apenas Windows como fornecida. O PRISM é enviado aqui como sua biblioteca nativa Windows (
prism.dll, CUDD) mais o runtime MinGW do Git para Windows, entãorun-layer3.ps1é executado apenas no Windows. Um revisor Linux/macOS não pode executar a Camada 3 a partir do binário fornecido — mas os modelos.prism/.propssão portáveis: instale o PRISM oficial (https://www.prismmodelchecker.org) e execute-os diretamente, ex.prism layer3/trivy_mdp.prism layer3/trivy.props. As camadas 1–2 são multiplataforma (Python, e otla2tools.jarincluído é executado em qualquer lugar com um JDK).
📄 Leia no seu navegador: main.pdf — o GitHub renderiza inline. Um download direto está anexado ao lançamento v1.0.0.
Trivy-USENIX-paper/main.tex é o artigo no formato de duas colunas do USENIX Security. Ele é autocontido (pacotes CTAN padrão) e compila no Overleaf ou com qualquer engine TeX:
pdflatex main.tex && pdflatex main.tex # or: tectonic main.tex
O artigo compilado é main.pdf; o relatório de validação preenchido (Word) é QA -- Validation Results (Filled In).docx — ambos em Trivy-USENIX-paper/.
main — a análise atual e corrigida. Construa a partir daqui.pre-mercor-fix — uma reconstrução arquivística do projeto antes da reetiquetagem Mercor→v1 (a violação da Mercor veio através do seguimento LiteLLM de estágio 2, não uma execução direta do trivy-action). Apenas referência; veja PRE-MERCOR-FIX.md nesse ramo.Pré-impressão de pesquisa em andamento por Franklin Hanna (afiliação/email ainda são placeholders em main.tex). Os fatos do incidente são extraídos do dossiê público (Aqua, GHSA, CVE-2026-33634, Unit 42, Microsoft, Wiz, ReversingLabs, Endor Labs, OpenSSF/OSV e outros). As suposições de modelagem e seus limites são declarados explicitamente na seção de Limitações e Ameaças à Validade do artigo.
Se você usar este trabalho, por favor cite o lançamento arquivado (DOI Zenodo 10.5281/zenodo.21387135); os metadados legíveis por máquina estão em CITATION.cff.
@software{hanna_2026_trivy_teampcp,
author = {Hanna, Franklin},
title = {Formal Analysis of the Trivy / TeamPCP GitHub Actions
Supply-Chain Attack (CVE-2026-33634)},
year = {2026},
version = {v1.0.0},
publisher = {Zenodo},
doi = {10.5281/zenodo.21387135},
url = {https://doi.org/10.5281/zenodo.21387135}
}
Trivy-USENIX-paper/) — CC BY 4.0.Ferramentas de terceiros incluídas mantêm suas próprias licenças: PRISM é GPL (TrivySupplyChain/layer3/prism/COPYING.txt) e as ferramentas TLA+ são MIT.
| Pergunta | Resultado |
|---|
| O ataque documentado é alcançável? | Sim — TLC retorna o rastro exato do dossiê de 3 passos |
| Rotação parcial suficiente? | Não (NoExfiltration falha); rotação completa sim |
| Pinning de SHA em uma população mista | Isolamento mantém-se em 8.185 estados; violação contida |
| P(comprometimento), configuração vulnerável | 1.0; E[tempo] 6 dias; P(≤30 dias) 0.9985 |
| Cascata de múltiplos estágios | P(atingir estágio 2) = q; E[primeiro downstream] 16 dias; rotação → 0 |
| Paramétrico (forma fechada) | E[dias-para-comprometimento] = (p+1)/p; P(estágio 2) = q (exato) |
| Camada-1 corpus (189 workflows reais) | fração de tag flutuante f = 0.3698; cobertura de construção 88.2% |
| Calibragem (OpenSSF/OSV) | npm = 214.497 reports (94.2%); Feb→Mar 2026: 329 → 1.048 (×3.19) |
| Busca automatizada de mitigação | LLM propõe, PRISM verifica → ótimo apenas-rotação (score −0.05), convergido em 4 rodadas |