CircleCI Security
Informazioni di Base
CircleCI è una piattaforma di Integrazione Continua dove puoi definire modelli indicando cosa desideri che faccia con del codice e quando farlo. In questo modo puoi automatizzare i test o le distribuzioni direttamente dalla branch master del tuo repository, ad esempio.
Autorizzazioni
CircleCI eredita le autorizzazioni da github e bitbucket relative all'account che effettua l'accesso. Nel mio test ho verificato che finché hai autorizzazioni di scrittura sul repository in github, sarai in grado di gestire le impostazioni del progetto in CircleCI (impostare nuove chiavi ssh, ottenere chiavi api del progetto, creare nuove branch con nuove configurazioni di CircleCI...).
Tuttavia, è necessario essere un amministratore del repository per convertire il repository in un progetto CircleCI.
Variabili d'Ambiente e Segreti
Secondo la documentazione ci sono diversi modi per caricare valori nelle variabili d'ambiente all'interno di un flusso di lavoro.
Variabili d'ambiente integrate
Ogni contenitore eseguito da CircleCI avrà sempre specifiche variabili d'ambiente definite nella documentazione come CIRCLE_PR_USERNAME
, CIRCLE_PROJECT_REPONAME
o CIRCLE_USERNAME
.
Testo in chiaro
Puoi dichiararle in testo in chiaro all'interno di un comando:
Puoi dichiararli in chiaro all'interno dell'ambiente di esecuzione:
Puoi dichiararli in chiaro all'interno dell'ambiente del build-job:
Puoi dichiararli in chiaro all'interno dell'ambiente di un contenitore:
Segreti del Progetto
Questi sono segreti che saranno accessibili solo dal progetto (da qualsiasi branch). Puoi vederli dichiarati in https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables
La funzionalità "Importa Variabili" consente di importare variabili da altri progetti in questo.
Segreti di Contesto
Questi sono segreti che riguardano tutta l'organizzazione. Per default, qualsiasi repository sarà in grado di accedere a qualsiasi segreto memorizzato qui:
Tuttavia, nota che un gruppo diverso (anziché Tutti i membri) può essere selezionato per dare accesso ai segreti solo a persone specifiche. Attualmente, questo è uno dei modi migliori per aumentare la sicurezza dei segreti, per non permettere a tutti di accedervi ma solo a alcune persone.
Attacchi
Ricerca di Segreti in Testo Chiaro
Se hai accesso al VCS (come github) controlla il file .circleci/config.yml
di ogni repository su ogni branch e cerca potenziali segreti in testo chiaro memorizzati lì.
Enumerazione delle Variabili d'Ambiente Segrete e dei Contesti
Controllando il codice, puoi trovare tutti i nomi dei segreti che vengono utilizzati in ogni file .circleci/config.yml
. Puoi anche ottenere i nomi dei contesti da quei file o controllarli nella console web: https://app.circleci.com/settings/organization/github/<org_name>/contexts.
Esfiltrare i Segreti del Progetto
Per esfiltrare TUTTI i segreti del progetto e del contesto, è sufficiente avere accesso SCRITTURA a solo 1 repository nell'intera organizzazione di github (e il tuo account deve avere accesso ai contesti ma per default tutti possono accedere a ogni contesto).
La funzionalità "Importa Variabili" consente di importare variabili da altri progetti in questo. Pertanto, un attaccante potrebbe importare tutte le variabili del progetto da tutti i repository e poi esfiltrarle tutte insieme.
Tutti i segreti del progetto sono sempre impostati nell'env dei job, quindi chiamare env e oscurarlo in base64 esfiltrerà i segreti nella console di log web dei workflow:
Se non hai accesso alla console web ma hai accesso al repository e sai che viene utilizzato CircleCI, puoi semplicemente creare un workflow che viene attivato ogni minuto e che esfila i segreti verso un indirizzo esterno:
Estrarre i Segreti del Contesto
È necessario specificare il nome del contesto (questo permetterà anche di estrarre i segreti del progetto):
Se non hai accesso alla console web ma hai accesso al repository e sai che viene utilizzato CircleCI, puoi semplicemente modificare un flusso di lavoro che viene attivato ogni minuto e che esfila le segreti verso un indirizzo esterno:
Creare un nuovo file .circleci/config.yml
in un repository non è sufficiente per avviare una build su CircleCI. È necessario abilitarlo come progetto nella console di CircleCI.
Fuga verso il Cloud
CircleCI ti offre l'opzione di eseguire le tue build sulle loro macchine o sulle tue. Di default, le loro macchine si trovano in GCP, e inizialmente potresti non trovare nulla di rilevante. Tuttavia, se una vittima sta eseguendo i task sulle proprie macchine (potenzialmente, in un ambiente cloud), potresti trovare un endpoint di metadati cloud con informazioni interessanti.
Nota che negli esempi precedenti è stato tutto avviato all'interno di un contenitore Docker, ma puoi anche chiedere di avviare una macchina virtuale (che potrebbe avere autorizzazioni cloud diverse):
Oppure anche un contenitore Docker con accesso a un servizio Docker remoto:
Persistenza
È possibile creare token utente in CircleCI per accedere ai punti API con l'accesso degli utenti.
https://app.circleci.com/settings/user/tokens
È possibile creare token di progetto per accedere al progetto con le autorizzazioni date al token.
https://app.circleci.com/settings/project/github/<org>/<repo>/api
È possibile aggiungere chiavi SSH ai progetti.
https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
È possibile creare un lavoro cron in un branch nascosto in un progetto inaspettato che sta leakando tutte le variabili di ambiente del contesto ogni giorno.
Oppure creare in un branch / modificare un lavoro conosciuto che leakerà tutti i contesti e i segreti dei progetti ogni giorno.
Se sei un proprietario di GitHub puoi consentire orb non verificati e configurarne uno in un lavoro come backdoor
Puoi trovare una vulnerabilità di injection di comandi in qualche attività e iniettare comandi tramite un segreto modificandone il valore
Last updated