
Ricostruzione quantitativa verificata formalmente dell'attacco alla supply chain di GitHub Actions di Trivy/TeamPCP (CVE-2026-33634): un modello di incidente TLA+/TLC, analisi probabilistica PRISM e uno studio su un corpus di 189 workflow.
Una ricostruzione quantitativa e formalmente verificata del compromesso della supply-chain di GitHub Actions Trivy / "TeamPCP" del marzo 2026 (CVE-2026-33634) — modellata in TLA+, controllata esaustivamente con TLC e quantificata con il model checker probabilistico PRISM.
Ogni numero nel paper si rigenera da questo repository. Il modello, le probabilità, le misurazioni del corpus e la calibrazione si riproducono tutti dal sorgente con un singolo comando per livello.
Un attaccante in grado di spostare un tag di versione fluttuante su un'Action molto utilizzata (trivy-action / setup-trivy) ha causato migliaia di pipeline downstream ad eseguire codice controllato dall'attaccante con credenziali di produzione al loro prossimo esecuzione di routine, facendo trapelare segreti che hanno seminato un worm npm di secondo stadio. Questo progetto si pone le domande a cui un rapporto di incidente non può rispondere formalmente:
| Domanda | Risultato |
|---|---|
| L'attacco documentato è raggiungibile? | Sì — TLC restituisce la traccia esatta del dossier in 3 passaggi |
| La rotazione parziale è sufficiente? | No (NoExfiltration fallisce); la rotazione completa sì |
| SHA-pinning in una popolazione mista | L'isolamento vale su 8.185 stati; violazione contenuta |
| P(compromissione), configurazione vulnerabile | 1.0; E[tempo] 6 giorni; P(≤30 giorni) 0.9985 |
| Cascata multi-stadio | P(raggiunge stadio 2) = q; E[primo downstream] 16 giorni; rotazione → 0 |
| Parametrico (forma chiusa) | E[giorni-alla-compromissione] = (p+1)/p; P(stadio 2) = q (esatto) |
| Corpus Layer-1 (189 workflow reali) | frazione di tag fluttuante f = 0.3698; copertura del costrutto 88.2% |
| Calibrazione (OpenSSF/OSV) | npm = 214.497 report (94.2%); Feb→Mar 2026: 329 → 1.048 (×3.19) |
| Ricerca automatizzata di mitigazione | LLM propone, PRISM verifica → ottimo solo rotazione (punteggio −0.05), convergente in 4 round |
TrivySupplyChain/layer1/) — un analizzatore statico su un corpus di workflow reali di GitHub Actions misura quanto spesso si verificano i costrutti modellati (14/14 test unitari; la frazione di tag fluttuante alimenta Layer 3).TrivySupplyChain/) — il modello TLA+ + 10 configurazioni TLC riproducono l'attacco e dimostrano quali mitigazioni lo chiudono (raggiungibilità, isolamento, raffinamento, superficie residua).TrivySupplyChain/layer3/) — il PRISM MDP/DTMC calcola probabilità, tempi previsti e la cascata multi-stadio, calibrati sul dataset di pacchetti malevoli OpenSSF e sulla cronologia documentata 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)
Dov'è
layer2/? Il Layer 2 (ricostruzione dell'incidente) è il livello superiore diTrivySupplyChain/— il modelloTrivySupplyChain.tla, le configurazionicfg_*.cfg, i moduliMC*.tla/SecureWorkflow.tlaerun-all.ps1. È stato costruito per primo come nucleo, quindi si trova nella radice;layer1/elayer3/sono i livelli di validazione aggiunti attorno.
Requisiti: Windows + un JDK (imposta JAVA_HOME); Python 3.10+ (Layer 1 e calibrazione); Node.js (solo per rigenerare i documenti Word); Git per Windows (fornisce le DLL runtime MinGW necessarie per la libreria nativa di PRISM). Gli strumenti TLA+ e PRISM sono inclusi nel repository.
# 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
I Layer 1–3 sono autonomi e non necessitano di chiave API. Solo il propositore del passo 4 è un LLM; il suo oracolo PRISM (asi_evolve/evaluate.py) funziona in modo indipendente ed è ciò che effettivamente valuta ogni politica.
I sorgenti .tla, .prism e .py sono portabili; solo gli script di esecuzione sono Windows PowerShell. Vedi TrivySupplyChain/README.md per i comandi manuali (cross-platform).
Layer 3 è solo Windows come fornito. PRISM viene qui fornito come sua libreria nativa Windows (
prism.dll, CUDD) più il runtime MinGW di Git-for-Windows, quindirun-layer3.ps1funziona solo su Windows. Un revisore Linux/macOS non può eseguire Layer 3 dal binario fornito — ma i modelli.prism/.propssono portabili: installa il PRISM upstream (https://www.prismmodelchecker.org) ed eseguili direttamente, ad es.prism layer3/trivy_mdp.prism layer3/trivy.props. I Layer 1–2 sono cross-platform (Python, e iltla2tools.jarfornito funziona ovunque con un JDK).
📄 Leggilo nel tuo browser: main.pdf — GitHub lo visualizza inline. Un download diretto è allegato alla release v1.0.0.
Trivy-USENIX-paper/main.tex è il documento nel formato a due colonne di USENIX Security. È autonomo (pacchetti CTAN standard) e compila su Overleaf o con qualsiasi motore TeX:
pdflatex main.tex && pdflatex main.tex # or: tectonic main.tex
Il paper compilato è main.pdf; il report di validazione compilato (Word) è QA -- Validation Results (Filled In).docx — entrambi in Trivy-USENIX-paper/.
main — l'analisi corrente e corretta. Costruisci da qui.pre-mercor-fix — una ricostruzione archivistica del progetto prima del rietichettamento Mercor→v1 (la violazione di Mercor è arrivata tramite il follow-on LiteLLM di stadio 2, non una diretta esecuzione di trivy-action). Solo riferimento; vedi PRE-MERCOR-FIX.md su quel ramo.Preprint di ricerca in corso di Franklin Hanna (affiliazione/email sono ancora placeholder in main.tex). I fatti dell'incidente sono tratti dal dossier pubblico (Aqua, GHSA, CVE-2026-33634, Unit 42, Microsoft, Wiz, ReversingLabs, Endor Labs, OpenSSF/OSV e altri). Le ipotesi di modellazione e i loro limiti sono dichiarati esplicitamente nella sezione Limiti e minacce alla validità del paper.
Se usi questo lavoro, cita la release archiviata (DOI Zenodo 10.5281/zenodo.21387135); i metadati leggibili da macchina sono in 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.Gli strumenti di terze parti inclusi mantengono le proprie licenze: PRISM è GPL (TrivySupplyChain/layer3/prism/COPYING.txt) e gli strumenti TLA+ sono MIT.