
Laboratorio di ricerca sulla sicurezza che riproduce CVE-2020-36762 (GHSA-h9gr-83jq-f3xc): iniezione di comandi bash tramite github.event.comment.body nel workflow dei commenti di ONSdigital/ras-collection-instrument
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 verbatim di
ONSdigital/ras-collection-instrumental commit493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03), 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 Action e le immagini dei runner sono bloccati a ciò che risolvevano al 2020-12-03; vedi
pinning.mdnell'output del sistema per ogni modifica apportata allo snapshot.Domande o obiezioni: [email protected]
Questo è il micro-servizio RAS Collection Instrument, responsabile del caricamento di esercizi di raccolta e strumenti di raccolta. Può anche essere utilizzato per scaricare gli strumenti di raccolta come file .xlsx e consente la ricerca di strumenti di raccolta tramite filtri di ricerca. Questo servizio ha la capacità di collegare e scollegare esercizi di raccolta con strumenti di raccolta. La relazione tra esercizi e strumenti è uno-a-molti, quindi un singolo esercizio di raccolta può avere più strumenti di raccolta. Ogni strumento di raccolta nello schema JSON ha un riferimento di unità campionaria, un tipo e un ID di riepilogo, oltre ad attributi aggiuntivi. Questo servizio comunica principalmente con il servizio degli esercizi di raccolta, oltre che con i servizi party, case e survey. Le informazioni di logging sugli strumenti di raccolta vengono inviate a rabbitmq.
Gli strumenti di raccolta sono memorizzati in una tabella strumenti con i seguenti campi:
type = il tipo di esercizio di raccolta (es. SEFT, EQ, ecc.) instrument_id = l'UUID dello strumento stamp = il timestamp che indica quando lo strumento di raccolta è stato creato survey_id = l'UUID del survey associato classifiers = i classificatori del survey survey = il survey stesso seft_file = il file seft dello strumento
Esistono tre diverse viste di endpoint: /collectioninstrument, utilizzata per la maggior parte degli endpoint, oltre a /survey_responses e /info.
Quando uno strumento di raccolta viene caricato per un esercizio di raccolta, scrive un messaggio sulla coda Seft.Instruments per il servizio rm-collection-exercise Quando viene caricata una risposta a un survey SEFT, scrive un messaggio sulla coda Seft.Responses per il servizio sdx-seft-consumer
È richiesta l'installazione di pipenv:
pip install pipenv
Per eseguire i test sono necessari un server rabbitmq e un database. Lo script tox crea ed esegue queste dipendenze all'interno di container Docker, che vengono distrutti dopo l'esecuzione dei test unitari.
pipenv install --dev
pipenv run tox
Per eseguire il servizio con le dipendenze richieste:
docker-compose up -d db rabbitmq
pipenv run python run.py
Per verificare che il servizio sia attivo:
curl http://localhost:8082/info
Il database verrà creato automaticamente all'avvio dell'applicazione.
Per eseguire il servizio in un container Docker è incluso uno script Compose:
docker-compose up -d
Le variabili d'ambiente disponibili per la configurazione sono elencate di seguito:
| Environment Variable | Description | Default |
|---|---|---|
| MAX_UPLOAD_FILE_NAME_LENGTH | Lunghezza massima dei nomi file | 50 |
| LOGGING_LEVEL | Livello del logger | INFO |
| JSON_SECRET_KEYS | Rappresentazione JSON delle chiavi | None |
| ONS_CRYPTOKEY | Una chiave utilizzata dal Cryptographer | None |
| SECURITY_USER_NAME | Nome utente che il client usa per autenticarsi con altre API | admin |
| SECURITY_USER_PASSWORD | Password che il client usa per autenticarsi con altre API | secret |
| COLLECTION_EXERCISE_SCHEMA | Posizione dello schema dello strumento di raccolta | application/schemas/collection_instrument_schema.json |
| CASE_URL | URL per il servizio case | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | URL per il servizio esercizi di raccolta | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | URL per il servizio survey | 'http://localhost:8080' |
| PARTY_URL | URL per il servizio party | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | URI per rabbitmq | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | URI per rabbitmq | None |
Queste sono impostate in config.py
Vai su /developer_scripts ed esegui import.py, rispondi alle richieste sulla riga di comando
collection_instrument_schema ha due campi attributo apparentemente identici: formType e formtype.entname1/2/3 e runame1/2/3, tra gli altri. Lo schema dovrebbe essere riprogettato, oppure avere una documentazione più specifica./collectioninstrument/count è restituire il numero di strumenti di raccolta. Perché il servizio deve fare questo? Non potrebbe essere realizzato con una query al database?