
Laboratorio di ricerca sulla sicurezza: riproduzione controllata di GHSA-3g6g-gq4r-xjm9 / CVE-2026-35580 (iniezione di shell tramite input workflow_dispatch di GitHub Actions) contro uno snapshot bloccato di NationalSecurityAgency/emissary
Artefatto di ricerca automatizzato — non è il progetto upstream.
Questo repository è un laboratorio usa e getta costruito da un sistema automatizzato per una tesi magistrale presso l'Université Laval sulla riproduzione di vulnerabilità pubblicate nei workflow di GitHub Actions. È uno snapshot integrale di
NationalSecurityAgency/emissaryal commit898488b489615581ea66d17954742c8e4ffb0323(2026-01-09), ridistribuito sotto la licenza del progetto stesso, il cui file è incluso invariato in questo snapshot.Il progetto upstream non è coinvolto, non è mai preso di mira, e la vulnerabilità studiata qui è già pubblica. Ogni segreto e variabile in questo repository è un valore fittizio generato casualmente — nessuna credenziale reale è presente. I riferimenti alle azioni e le immagini dei runner sono bloccati a ciò a cui risolvevano il 2026-01-09; consulta
pinning.mdnell'output del sistema per ogni modifica apportata allo snapshot.Domande o obiezioni: [email protected]

Emissary è un motore di workflow basato sui dati e su architettura P2P che opera in una rete P2P eterogenea, potenzialmente ampiamente distribuita e multi-livello, di risorse di calcolo. Gli itinerari dei workflow non sono pre-pianificati come nei motori di workflow convenzionali, ma vengono scoperti man mano che vengono scoperte maggiori informazioni sui dati. In genere non c'è interazione con l'utente in un workflow Emissary; piuttosto, i dati vengono elaborati in modo orientato agli obiettivi fino a raggiungere uno stato di completamento.
Emissary è altamente configurabile, ma in questa implementazione di base non fa quasi nulla. Ci si aspetta che gli utenti di questo framework forniscano classi che estendono emissary.place.ServiceProviderPlace per eseguire lavoro sui payload di emissary.core.IBaseDataObject.
Si possono fare diverse cose e il workflow è gestito in fasi, ad es. STUDY, ID, COORDINATE, TRANSFORM, ANALYZE, IO, REVIEW.
Le classi responsabili di dirigere il workflow sono emissary.core.MobileAgent e le classi derivate da essa, che gestiscono il percorso di un insieme di oggetti payload correlati attraverso il workflow e emissary.directory.DirectoryPlace che gestisce i servizi disponibili, il loro costo e la loro qualità e mantiene connessa la rete P2P.
Leggi la guida DEVELOPING.md per informazioni sull'installazione dei componenti richiesti, sul recupero del codice sorgente, sulla compilazione e sull'esecuzione di Emissary.
Esegui mvn clean package per compilare, testare e impacchettare Emissary
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.132 s
[INFO] Finished at: 2022-01-10T22:31:05Z
[INFO] ------------------------------------------------------------------------
C'è uno script bash in Emissary che esegue tutto. Si trova nella directory di livello superiore di Emissary. Lo script esegue la classe emissary.Emissary che dispone di diversi comandi Picocli disponibili per gestire diverse funzioni.
Se lo script emissary viene eseguito senza alcun argomento, otterrai un elenco di tutti i sottocomandi di configurazione e una breve descrizione.
./emissary
Eseguire ./emissary help ti darà lo stesso output dell'esecuzione senza argomenti. Se vuoi vedere informazioni più
dettagliate su un comando, aggiungi il nome del comando dopo help. Ad esempio, per vedere tutti gli
argomenti con le descrizioni per il comando server, esegui:
./emissary help server
Il resto dei comandi ha tutti argomenti (-b o --projectBase) che possono essere impostati, ma devono corrispondere a PROJECT_BASE.
La directory di configurazione è impostata di default su /config ma può anche essere passata con (-c o --config). Quando si esegue dal checkout git, dovresti usare target come projectBase. Sentiti libero di modificare i file di configurazione in target/config prima di iniziare.
La registrazione (logging) è gestita da logback. Puoi puntare a un file personalizzato con l'argomento --logbackConfig.
Consulta help -c per ogni comando per ottenere maggiori informazioni.
Questo comando avvierà un server Emissary e inizializzerà tutti i luoghi (places), un luogo di ritiro (pickup place) e i filtri di consegna (drop off filters) configurati. Si avvierà in modalità standalone se -m o --mode non è specificato. Di default, il numero di MobileAgents viene calcolato in base alle specifiche della macchina. Sui computer moderni, questo può essere elevato. Puoi controllare il numero di agenti con -a o --agents. Ecco un esempio di esecuzione.
./emissary server -a 2
Senza ulteriore configurazione, si avvierà su http://localhost:8001. Se navighi su quell'URL, dovrai inserire il nome utente e la password definiti in target/config/jetty-users.properties, che sono emissary e emissary123.
Il PickUpPlace predefinito è configurato per leggere file da target/data/InputData. Se copi file in quella directory, vedrai Emissary elaborarli. Tieni presente che sono configurati solo toUpper e toLower, quindi l'output non sarà molto interessante.
Interrompi il servizio dall'accettare lavoro
./emissary server --pause
Consenti a un servizio in pausa di accettare lavoro
./emissary server --unpause
Invalida i servizi che sono aggiornabili (refreshable). Questo è un aggiornamento "leggero" che è un approccio senza tempi di inattività che invalida un ServiceProviderRefreshablePlace. Quando il luogo viene poi estratto da DirectoryPlace, il luogo viene ricreato usando le stesse chiavi per DirectoryPlace e Namespace, ma il configuratore viene ricaricato e il luogo è in grado di ricaricare un sottoinsieme delle sue configurazioni.
./emissary server --invalidate
Forza l'aggiornamento dei servizi. Questo è un aggiornamento "duro": il server viene messo in pausa e si attende che i MobileAgents si svuotino. Una volta che il server è completamente inattivo, tutte le chiavi esistenti di ServiceProviderRefreshablePlace vengono rimosse da DirectoryPlace e Namespace, e i luoghi vengono completamente ricreati. Ciò consente modifiche ai nomi dei servizi, ai proxy, alle liste di negazione, ecc. Il server viene quindi ripreso per riprendere l'elaborazione. Qualsiasi errore nell'aggiornamento metterebbe il server in uno stato non valido, quindi il server viene arrestato.
./emissary server --refresh
Arresta il servizio
./emissary server --stop
Forza l'arresto del servizio
./emissary server --kill
Il comando agents mostra il numero di MobileAgents per l'host configurato e cosa stanno facendo quegli
agenti. Di default, la porta è 9001, ma puoi usare -p o --port per cambiarla.
Supponendo che tu stia eseguendo sulla porta 8001 dal comando server precedente, prova:
./emissary agents -p 8001
Pool è una vista compressa degli agenti per un nodo. Anche questo, di default, usa la porta 9001. Per eseguirlo per il server standalone avviato sopra, esegui
./emissary pool -p 8001
Questo comando è più utile per un cluster poiché fornisce una vista più digeribile di ogni nodo.
Il comando Env richiede che un server sia in esecuzione. Chiederà al server alcuni valori di configurazione, come PROJECT_BASE e BIN_DIR. Senza argomenti, scaricherà una risposta json non formattata.
./emissary env
Ma puoi anche scaricare una risposta adatta per essere sorgente (sourced) in bash.
./emissary env --bashable
L'avvio del server Emissary chiama effettivamente questo endpoint e scarica $PROJECT_BASE}/env.sh
con le variabili configurate. Questo viene fatto affinché gli script di shell possano source $PROJECT_BASE}/env.sh
e poi avere quelle variabili disponibili senza doversi preoccupare di configurarle altrove.
Il comando config ti permette di vedere la configurazione effettiva per un luogo/servizio/classe specificato. Poiché Emissary usa
i flavor, questo comando mostrerà la configurazione risultante di una classe dopo che tutti i flavor sono stati applicati. Questo comando può
essere usato per connettersi a un nodo Emissary in esecuzione specificando -h per l'host (default è localhost) e -p per
la porta (default è 8001). Per connettersi a un Emissary in esecuzione localmente sulla porta 8001, uno qualsiasi dei seguenti comandi funzionerà:
./emissary config --place emissary.place.sample.ToLowerPlace
./emissary config --place emissary.place.sample.ToLowerPlace -h localhost -p 8001
Facoltativamente, puoi specificare la modalità offline usando --offline per usare i file di configurazione specificati nella tua
CONFIG_DIR locale:
./emissary config --place emissary.place.sample.ToLowerPlace --offline
In modalità offline, puoi fornire flavor per vedere le differenze nelle configurazioni:
./emissary config --place emissary.place.sample.ToLowerPlace --offline --flavor STANDALONE,TESTING
Questi sono utili per vedere la configurazione effettiva, ma possiamo anche eseguire in modalità verbose per
vedere tutti i file di configurazione insieme all'output finale. Questo è controllato con il
flag --detailed:
./emissary config --place emissary.place.sample.ToLowerPlace --detailed
o in modalità offline:
./emissary config --place emissary.place.sample.ToLowerPlace --offline --detailed
Emissary è divertente in standalone, ma eseguire un cluster è più appropriato per il lavoro reale. Il modo per eseguire in cluster è simile allo standalone, ma devi usare -m cluster per dire al nodo di connettersi ad altri nodi. In modalità cluster, Emissary avvierà anche il PickUpClient invece del PickUpPlace, quindi dovrai avviare un feeder.
Guarda il file target/config/peers.cfg per vedere i peer di rendezvous. In questo caso, ce ne sono 3. I nodi in esecuzione sulla porta 8001 e 9001 sono solo nodi Emissary. Il nodo in esecuzione sulla porta 7001 è il feeder. Quindi avviamo 8001 e 9001 in due terminali diversi.
./emissary server -a 2 -m cluster
./emissary server -a 2 -m cluster -p 9001
Poiché questi nodi conoscono tutti le porte 8001, 9001 e 7001, vedrai errori nei log mentre continuano a tentare di connettersi.
Nota: nelle distribuzioni del mondo reale non eseguiamo più processi Emissary sullo stesso nodo. Puoi configurare il nome host con -h.
Con i nodi avviati sulle porte 8001 e 9001, dobbiamo avviare il feeder. Il comando feed usa la porta 7001 di default, ma dobbiamo impostare una directory da cui il feeder leggerà. I file inseriti in quella directory saranno disponibili per i nodi worker da prendere e il lavoro dovrebbe essere distribuito tra il cluster. Avvia il feed con
mkdir ~/Desktop/feed1
./emissary feed -i ~/Desktop/feed1/
Dovresti essere in grado di raggiungere http://localhost:8001, http://localhost:9001 e http://localhost:7001 nel browser e guardare i luoghi configurati. Inserisci alcuni file in ~/Desktop/feed1 e guarda i 2 nodi elaborarli. Potrebbe volerci un minuto prima che inizino l'elaborazione.
Gli agenti in modalità cluster mostrano ancora una volta i dettagli sui mobileAgents. Inizia dal nodo che configuri (localhost:9001 di default), poi contatta tutti i nodi che conosce e ottiene le stesse informazioni. Eseguilo con:
./emissary agents --cluster
Il pool in modalità cluster fa anche la stessa cosa del pool in standalone. Inizia dal nodo (localhost:9001) di default poi va a tutti i nodi che conosce e aggrega una vista compressa del cluster. Eseguilo con
./emissary pool --cluster
La topologia parla con il nodo configurato (localhost:8001 di default) e parla con ogni nodo che conosce. La risposta è ciò che tutti quei nodi conoscono, così puoi costruire una topologia di rete del tuo cluster. Eseguilo con
./emissary topology
Il keystore e la password del keystore sono nel file emissary.client.EmissaryClient-SSL.cfg. Incluso e configurato di default c'è un keystore di esempio che puoi usare per testare questa funzionalità. Non raccomandiamo l'uso del keystore di esempio in ambienti di produzione. Per usare il tuo keystore, modifica i valori di configurazione nel file emissary.client.EmissaryClient-SSL.cfg.
Standalone
./emissary server -p 8443 --ssl --disableSniHostCheck
Cluster
./emissary server -p 8443 --ssl --disableSniHostCheck --mode cluster
./emissary server -p 9443 --ssl --disableSniHostCheck --mode cluster
mkdir ~/Desktop/feed1
./emissary feed -p 7443 --ssl --disableSniHostCheck -i ~/Desktop/feed1/
Se hai domande o dubbi su questo progetto, puoi contattarci a: [email protected]
Per domande sulla sicurezza e segnalazione di vulnerabilità, fai riferimento a SECURITY.md