Translated ['src/pentesting-ci-cd/argocd-security.md', 'src/pentesting-c

This commit is contained in:
Translator
2026-07-06 15:54:45 +00:00
parent 421de0c7a8
commit 8f0f5c8e83
2 changed files with 270 additions and 50 deletions
+219
View File
@@ -0,0 +1,219 @@
# Argo CD Security
{{#include ../banners/hacktricks-training.md}}
## Informazioni di base
[Argo CD](https://argo-cd.readthedocs.io/) è una piattaforma di continuous delivery GitOps per Kubernetes. Monitora i repository Git, genera i manifest Kubernetes con strumenti come Helm, Kustomize, Jsonnet o config management plugins, e riconcilia lo stato live del cluster con lo stato desiderato memorizzato in Git.
Dal punto di vista di un attacker, considera Argo CD come un **motore di deployment con credenziali Kubernetes**. Un compromesso utile di Argo CD può portare a:
- Accesso a repository Git privati e credenziali del repository.
- Accesso ai secret del cluster Kubernetes usati da Argo CD.
- Esecuzione di codice nella generazione dei manifest in `argocd-repo-server`.
- Deployment non autorizzato di oggetti Kubernetes tramite repository Git trusted, applicazioni Argo CD o manipolazione della cache.
## Architettura e componenti interessanti
Common Kubernetes objects and services:
```bash
kubectl get pods,svc,endpoints,ingress -A | grep -iE 'argocd|argo-cd'
kubectl get applications,appprojects,applicationsets -A 2>/dev/null
kubectl get secrets,configmaps -n argocd 2>/dev/null
kubectl get networkpolicy -n argocd 2>/dev/null
```
Servizi interessanti:
- **`argocd-server`**: API pubblica, web UI, CLI API, autenticazione e autorizzazione.
- **`argocd-application-controller`**: confronta lo stato desiderato e quello effettivo, poi applica le risorse a Kubernetes.
- **`argocd-repo-server`**: clona repository, mette in cache i dati Git e esegue Helm/Kustomize/Jsonnet/plugins per generare i manifest. La porta gRPC predefinita è **8081**.
- **`argocd-redis`**: cache per dati di application, manifest e riferimenti Git. La porta Redis predefinita è **6379**.
- **`argocd-applicationset-controller`**: genera oggetti Argo CD `Application` da generatori come Git, SCM, cluster e pull request.
Da un pod compromesso o da un segmento di rete interno, verifica la raggiungibilità interna:
```bash
nc -vz <argocd-server> 443
nc -vz <argocd-repo-server> 8081
nc -vz <argocd-redis> 6379
```
## Attacchi Public API / UI
Se hai credenziali Argo CD o un'istanza esposta, inizia dalla normale superficie API:
```bash
argocd login <argocd-server>
argocd account get-user-info
argocd account list
argocd proj list
argocd app list
argocd repo list
argocd cluster list
argocd admin settings rbac can <subject> <action> <resource> <object>
```
Percorsi di attacco utili:
- **Application write access**: modifica `source.repoURL`, `source.path`, valori Helm, opzioni Kustomize, impostazioni plugin o opzioni di sync così Argo CD distribuisce manifest controllati dall'attaccante.
- **Project misconfiguration**: gli oggetti `AppProject` possono consentire `sourceRepos` ampi, `destinations` ampi, `clusterResourceWhitelist` non sicura o restrizioni deboli sui namespace.
- **Repository credential abuse**: i segreti del repository, le credenziali GitHub App, le chiavi SSH e i token possono consentire il push su repo fidati o l'aggiunta di dipendenze malevole.
- **Cluster credential abuse**: i segreti del cluster possono contenere bearer token o configurazione exec-provider usata da Argo CD per distribuire nei cluster di destinazione.
- **Local admin / project tokens**: i token Argo CD a lunga durata possono essere riusati tramite l'API finché non vengono revocati o scadono.
Enumera la configurazione da Kubernetes quando hai accesso di lettura al cluster:
```bash
kubectl get applications.argoproj.io -A -o yaml
kubectl get appprojects.argoproj.io -A -o yaml
kubectl get applicationsets.argoproj.io -A -o yaml
kubectl get secrets -n argocd -o yaml | grep -nE 'repoURL|sshPrivateKey|password|bearerToken|githubApp|tlsClientCertData|tlsClientCertKey'
kubectl get cm -n argocd argocd-cm argocd-rbac-cm argocd-cmd-params-cm -o yaml
```
## Abuso di Trusted Git Repository
Se puoi fare push su un repository trusted da Argo CD, di solito puoi influenzare ciò che viene deployato. L'impatto dipende dai confini di `AppProject` e dai permessi del service account usato dall'application controller.
Posizioni comuni dei payload:
- Raw Kubernetes YAML sotto un path dell'application.
- Template Helm chart e `values.yaml`.
- Kustomize overlays, remote bases e generator.
- Input di Jsonnet o config management plugin.
- File generator di ApplicationSet che creano o aggiornano oggetti `Application`.
Controlla se l'app usa automated sync, pruning, self-heal, sync windows o approvazioni manuali:
```bash
kubectl get applications.argoproj.io -A \
-o custom-columns='NS:.metadata.namespace,APP:.metadata.name,PROJECT:.spec.project,AUTOSYNC:.spec.syncPolicy.automated,REPO:.spec.source.repoURL,PATH:.spec.source.path,DEST:.spec.destination.server'
```
## Abuso diretto di `argocd-repo-server`
Non assumere che la API pubblica di Argo CD sia l'unica attack surface. I componenti interni di Argo CD comunicano con `argocd-repo-server` tramite gRPC. Se pod arbitrari possono raggiungere repo-server, richieste interne controllate dall'attacker possono bypassare i controlli normalmente applicati da `argocd-server`.
Controlli pratici:
```bash
kubectl get svc -n argocd argocd-repo-server -o yaml
kubectl get endpoints -n argocd argocd-repo-server -o wide
nc -vz <argocd-repo-server> 8081
```
Segnali interessanti:
- L'endpoint gRPC di repo-server è raggiungibile da pod non-Argo CD.
- I NetworkPolicies mancano o consentono solo egress in allow-list senza negare ingress.
- repo-server ha accesso a custom config management plugins, strumenti di decryption o content del repository da più tenant.
- Redis è raggiungibile da pod non-Argo CD, consentendo l'ispezione o la manipolazione della cache se le credenziali sono disponibili o non richieste.
## Unauthenticated Repo-Server RCE via Kustomize Options
Nel luglio 2026, Synacktiv ha divulgato una catena di code execution non autenticata in `repo-server` di Argo CD quando un attacker può raggiungere il servizio gRPC interno. L'attacco sfrutta l'accesso diretto a `/repository.RepoServerService/GenerateManifest` e `KustomizeOptions` controllati dall'attacker.
La primitive pericolosa consiste nel forzare repo-server a clonare content del repository controllato dall'attacker ed eseguire Kustomize con supporto Helm:
```bash
kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh
```
Input Kustomize malevolo minimo necessario per attivare l'elaborazione Helm:
```yaml
helmCharts:
- name: pwn
version: 0.0.1
```
Perché funziona:
- `argocd-repo-server` clona il repository prima del rendering.
- `--helm-command ./payload.sh` viene risolto in modo relativo al repository clonato.
- L'esecuzione di codice non richiede injection di metacaratteri della shell se l'attaccante può controllare il repository renderizzato e le opzioni di build di Kustomize.
Al momento della disclosure di Synacktiv del 1 luglio 2026, è stato segnalato che il problema non aveva un fix ufficiale né un CVE. Consideralo prima di tutto un problema di network-exposure: lo sfruttamento richiede raggiungibilità verso la porta gRPC interna di repo-server.
## Redis Cache Poisoning to Deploy Manifests
Dopo l'esecuzione di codice in `argocd-repo-server`, oppure dopo accesso diretto a Redis con credenziali valide, ispeziona le entry della cache supportate da Redis. Argo CD in genere memorizza valori JSON compressi con gzip.
Prefissi di chiavi interessanti:
```text
mfst|... # cached rendered manifests
git-refs|... # Git branch/ref to commit mappings
app|... # application resource/cache data
cluster|... # cluster cache information
```
L'attacco di cache poisoning descritto da Synacktiv sfrutta due elementi di stato:
1. Modificare la voce di cache del manifest `mfst|...` pertinente per includere un manifest Kubernetes controllato dall'attaccante.
2. Modificare il mapping `git-refs|...` correlato in modo che Argo CD creda che il branch sia stato spostato e poi riconcili di nuovo verso la revisione in cache.
Impatto:
- Con Auto Sync abilitato, Argo CD può applicare automaticamente il manifest in cache avvelenato.
- Senza Auto Sync, il payload può comunque essere applicato quando un utente sincronizza manualmente l'applicazione.
- L'impatto finale è limitato dalla destination dell'applicazione target e dai permessi Kubernetes disponibili ad Argo CD.
## ApplicationSet Attacks
ApplicationSet è particolarmente sensibile perché crea o aggiorna oggetti `Application` a partire dall'output del generator.
Review:
```bash
kubectl get applicationsets.argoproj.io -A -o yaml
kubectl get appprojects.argoproj.io -A -o yaml
```
Pattern interessanti:
- I generatori git leggono file scrivibili dall'attaccante che controllano app names, paths, projects o destinations.
- I generatori pull request per repository pubblici in cui contributor non trusted possono influenzare le generated applications.
- I campi template che consentono broad destination clusters/namespaces.
- AppProjects che permettono `sourceRepos: ["*"]` o broad `destinations`.
- Generated applications che ereditano automated sync e pruning.
## Post-Exploitation
Da una shell del pod Argo CD, dai priorità a:
```bash
env
cat /proc/1/environ 2>/dev/null | tr '\0' '\n'
find /var/run/secrets /app/config -type f -maxdepth 4 2>/dev/null
mount | grep -E 'secret|token|config'
```
Obiettivi utili:
- Rubare `REDIS_PASSWORD` o materiale Redis TLS/client.
- Estrarre credenziali del repository da secrets montati o Argo CD Kubernetes secrets.
- Identificare le credenziali del cluster usate da Argo CD.
- Leggere generated manifests e l'output dei plugin che possono includere secrets iniettati.
- Verificare se custom plugins, SOPS, Helm secrets, Vault plugins o cloud CLIs espongono decryption keys e cloud credentials.
## Detection & Hardening
Controlli importanti:
- Limita la porta **8081** di `argocd-repo-server` e la porta **6379** di Redis con NetworkPolicies in modo che solo i componenti Argo CD previsti possano raggiungerli.
- Nelle distribuzioni Helm, verifica che le network policies vengano effettivamente create. I valori dell'Argo CD Helm chart hanno storicamente impostato la creazione delle network policy dei componenti su disabled.
- Mantieni `argocd-server` come punto di ingresso autenticato. I servizi interni non dovrebbero essere raggiungibili da workload arbitrari.
- Disabilita gli strumenti e i plugin di config management non usati.
- Limita `AppProject` `sourceRepos`, `destinations`, namespace permissions e cluster-scoped resources.
- Evita di archiviare repository credentials ampie che un utente Argo CD a basso privilegio possa far riutilizzare.
- Monitora le richieste al repo-server, le Kustomize build options, le esecuzioni dei plugin, le scritture Redis e accessi inattesi alle chiavi `mfst|` / `git-refs|`.
- Ruota gli utenti locali Argo CD, i project tokens, le repository credentials e le cluster credentials dopo una compromissione.
Useful commands:
```bash
kubectl get networkpolicy -n argocd
kubectl get networkpolicy -A | grep -i argocd
kubectl describe networkpolicy -n argocd argocd-repo-server-network-policy 2>/dev/null
kubectl describe networkpolicy -n argocd argocd-redis-network-policy 2>/dev/null
```
## Nota di Static Analysis: Typed API Requests in CodeQL
Per i servizi Go che usano handler gRPC/REST, i default CodeQL remote sources possono perdere i flussi una volta che linput grezzo è stato unmarshaled in typed request objects. Un modello utile per i servizi in stile Argo CD è:
- Receiver type come `Server` o `Service`.
- Il primo parametro è `context.Context`.
- Il secondo parametro è un typed request object.
Modella quel secondo parametro come remote source e aggiungi custom sinks per gli argomenti di `exec.Command` / `exec.CommandContext`. Questo aiuta a trovare flussi dai campi delle internal API request verso i command execution helpers.
## References
- [Synacktiv - Caught in the Octopus Trap: Unauthenticated RCE in Argo CD with CodeQL](https://www.synacktiv.com/en/publications/caught-in-the-octopus-trap-unauthenticated-rce-in-argo-cd-with-codeql)
- [Argo CD docs - Security considerations](https://argo-cd.readthedocs.io/en/stable/operator-manual/security/)
- [Argo CD docs - High Availability](https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/)
- [Argo CD docs - repo-server command reference](https://argo-cd.readthedocs.io/en/stable/operator-manual/server-commands/argocd-repo-server/)
- [Argo CD - repo-server NetworkPolicy manifest](https://github.com/argoproj/argo-cd/blob/master/manifests/base/repo-server/argocd-repo-server-network-policy.yaml)
- [Argo CD docs - metrics](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/)
- [Argo Helm - chart values reference](https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/README.md)
- [Kustomize - Helm chart generator example](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/chart.md)
@@ -6,51 +6,51 @@
## VCS
VCS sta per **Version Control System**, questi sistemi consentono agli sviluppatori di **gestire il proprio codice sorgente**. Il più comune è **git** e di solito troverai aziende che lo usano in una delle seguenti **platforms**:
VCS sta per **Version Control System**, questi sistemi permettono agli sviluppatori di **gestire il proprio codice sorgente**. Il più comune è **git** e di solito troverai aziende che lo usano in una delle seguenti **platforms**:
- Github
- Gitlab
- Bitbucket
- Gitea
- Gitblit
- Cloud providers (offrono le proprie platforms VCS)
- Cloud providers (offrono le proprie piattaforme VCS)
## CI/CD Pipelines
Le CI/CD pipelines consentono agli sviluppatori di **automatizzare l'esecuzione del codice** per vari scopi, inclusi build, test e deploy delle applicazioni. Questi workflow automatizzati vengono **attivati da azioni specifiche**, come push di codice, pull request o task pianificati. Sono utili per semplificare il processo dallo sviluppo alla produzione.
I CI/CD pipelines permettono agli sviluppatori di **automatizzare l'esecuzione del codice** per vari scopi, inclusi build, test e deploy delle applicazioni. Questi workflow automatizzati sono **attivati da azioni specifiche**, come push di codice, pull request o task pianificati. Sono utili per snellire il processo dallo sviluppo alla produzione.
Tuttavia, questi sistemi devono essere **eseguiti da qualche parte** e di solito con **credenziali privilegiate per deployare codice o accedere a informazioni sensibili**.
Tuttavia, questi sistemi devono essere **eseguiti da qualche parte** e di solito con **credenziali privilegiate per deployare il codice o accedere a informazioni sensibili**.
## VCS Pentesting Methodology
> [!NOTE]
> Anche se alcune platforms VCS consentono di creare pipelines, per questa sezione analizzeremo solo i potenziali attacchi al controllo del source code.
> Anche se alcune platforms VCS consentono di creare pipeline, per questa sezione analizzeremo solo i possibili attacchi al controllo del codice sorgente.
Le platforms che contengono il source code del tuo progetto contengono informazioni sensibili e le persone devono essere molto attente ai permessi concessi all'interno di questa platform. Questi sono alcuni problemi comuni nelle platforms VCS che un attacker potrebbe abusare:
Le platforms che contengono il codice sorgente del tuo progetto contengono informazioni sensibili e le persone devono essere molto attente con i permessi concessi dentro questa platform. Questi sono alcuni problemi comuni tra le platforms VCS che un attacker potrebbe abusare:
- **Leaks**: Se il tuo codice contiene leaks nei commit e l'attacker può accedere al repo (perché è pubblico o perché ha accesso), potrebbe scoprire i leaks.
- **Access**: Se un attacker può **accedere a un account dentro la platform VCS** potrebbe ottenere **maggiore visibilità e permessi**.
- **Register**: Alcune platforms consentiranno semplicemente agli utenti esterni di creare un account.
- **SSO**: Alcune platforms non consentiranno agli utenti di registrarsi, ma permetteranno a chiunque di accedere con un SSO valido (quindi un attacker potrebbe usare il proprio account github per entrare, per esempio).
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... esistono diversi tipi di token che un user potrebbe rubare per accedere in qualche modo a un repo.
- **Webhooks**: Le platforms VCS consentono di generare webhooks. Se non sono **protetti** con secret non visibili, un **attacker potrebbe abusarne**.
- **Register**: Alcune platforms permetteranno semplicemente agli utenti esterni di creare un account.
- **SSO**: Alcune platforms non permetteranno agli utenti di registrarsi, ma consentiranno a chiunque di accedere con un SSO valido (quindi un attacker potrebbe usare il suo account github per entrare, ad esempio).
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... ci sono diversi tipi di token che un user potrebbe rubare per accedere in qualche modo a un repo.
- **Webhooks**: Le platforms VCS permettono di generare webhooks. Se non sono **protetti** con secret non visibili, un **attacker potrebbe abusarne**.
- Se non è presente alcun secret, l'attacker potrebbe abusare del webhook della third party platform
- Se il secret è nell'URL, accade lo stesso e l'attacker ha anche il secret
- **Code compromise:** Se un malicious actor ha qualche tipo di accesso **write** ai repos, potrebbe provare a **iniettare codice malevolo**. Per avere successo potrebbe dover **bypassare le branch protections**. Queste azioni possono essere eseguite con obiettivi diversi in mente:
- Compromettere la main branch per **compromettere production**.
- Compromettere la main (o altre branches) per **compromettere le macchine degli sviluppatori** (poiché di solito eseguono test, terraform o altre cose dentro il repo sulle loro macchine).
- **Compromettere la pipeline** (vedi la prossima sezione)
- **Code compromise:** Se un malicious actor ha qualche tipo di accesso in **write** sui repo, potrebbe provare a **iniettare codice malevolo**. Per avere successo potrebbe dover **bypassare le branch protections**. Queste azioni possono essere eseguite con obiettivi diversi in mente:
- Compromettere la main branch per **compromettere la produzione**.
- Compromettere la main (o altre branches) per **compromettere le macchine degli sviluppatori** (poiché di solito eseguono test, terraform o altro dentro il repo sulle loro macchine).
- **Compromettere la pipeline** (check next section)
## Pipelines Pentesting Methodology
Il modo più comune per definire una pipeline è usare un **CI configuration file hostato nel repository** che la pipeline builda. Questo file descrive l'ordine dei job eseguiti, le condizioni che influenzano il flusso e le impostazioni dell'ambiente di build.\
Questi file in genere hanno un nome e un formato coerenti, per esempio — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI) e i file YAML di GitHub Actions situati sotto .github/workflows. Quando viene attivato, il job della pipeline **scarica il codice** dalla sorgente selezionata (ad esempio commit / branch), e **esegue i comandi specificati nel CI configuration file** su quel codice.
Il modo più comune per definire una pipeline è usare un **file di configurazione CI ospitato nel repository** che la pipeline builda. Questo file descrive l'ordine dei job eseguiti, le condizioni che influenzano il flusso e le impostazioni dell'ambiente di build.\
Questi file hanno tipicamente un nome e un formato coerenti, per esempio — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), e i file YAML di GitHub Actions situati sotto .github/workflows. Quando viene attivato, il job della pipeline **scarica il codice** dalla sorgente selezionata (ad es. commit / branch) e **esegue i comandi specificati nel file di configurazione CI** su quel codice.
Pertanto, l'obiettivo finale dell'attacker è in qualche modo **compromettere quei file di configurazione** o i **comandi che eseguono**.
Pertanto l'obiettivo finale dell'attacker è in qualche modo **compromettere quei file di configurazione** o i **comandi che eseguono**.
> [!TIP]
> Alcuni hosted builder consentono ai contributor di scegliere il Docker build context e il percorso del Dockerfile. Se il context è controllato dall'attacker, puoi impostarlo fuori dal repo (ad esempio, "..") per ingerire file dell'host durante la build ed esfiltrare secret. Vedi:
> Alcuni builder hosted consentono ai contributor di scegliere il Docker build context e il path del Dockerfile. Se il context è controllato dall'attacker, può impostarlo fuori dal repo (ad esempio, "..") per ingestire file dell'host durante la build ed exfiltrare secrets. Vedi:
>
>{{#ref}}
>docker-build-context-abuse.md
@@ -58,59 +58,60 @@ Pertanto, l'obiettivo finale dell'attacker è in qualche modo **compromettere qu
### PPE - Poisoned Pipeline Execution
Il percorso Poisoned Pipeline Execution (PPE) sfrutta i permessi in un SCM repository per manipolare una CI pipeline ed eseguire comandi dannosi. Gli user con i permessi necessari possono modificare i file di configurazione CI o altri file usati dal job della pipeline per includere comandi malevoli. Questo "avvelena" la CI pipeline, portando all'esecuzione di questi comandi malevoli.
Il percorso Poisoned Pipeline Execution (PPE) sfrutta i permessi in un repository SCM per manipolare una CI pipeline ed eseguire comandi dannosi. Gli utenti con i permessi necessari possono modificare i file di configurazione CI o altri file usati dal job della pipeline per includere comandi malevoli. Questo "avvelena" la CI pipeline, portando all'esecuzione di questi comandi malevoli.
Per avere successo in un attacco PPE, un malicious actor deve essere in grado di:
Perché un malicious actor abbia successo nell'eseguire un attacco PPE, deve essere in grado di:
- Avere **write access alla platform VCS**, poiché di solito le pipelines vengono attivate quando viene eseguito un push o una pull request. (Vedi la VCS pentesting methodology per un riepilogo dei modi per ottenere accesso).
- Avere **write access alla piattaforma VCS**, poiché di solito le pipeline vengono attivate quando viene eseguito un push o una pull request. (Controlla la VCS pentesting methodology per un riepilogo dei modi per ottenere accesso).
- Nota che a volte una **external PR conta come "write access"**.
- Anche se ha permessi di scrittura, deve assicurarsi di poter **modificare il file di configurazione CI o altri file da cui la config dipende**.
- Anche se ha permessi di write, deve essere sicuro di poter **modificare il file di config CI o altri file da cui dipende la config**.
- Per questo, potrebbe dover essere in grado di **bypassare le branch protections**.
Ci sono 3 varianti di PPE:
- **D-PPE**: Un attacco **Direct PPE** si verifica quando l'actor **modifica il file CI config** che verrà eseguito.
- **I-DDE**: Un attacco **Indirect PPE** si verifica quando l'actor **modifica** un **file** da cui dipende il file CI config che verrà eseguito (**rely on**), come un make file o una terraform config.
- **Public PPE or 3PE**: In alcuni casi le pipelines possono essere **attivate da user che non hanno write access nel repo** (e che potrebbero persino non far parte dell'org) perché possono inviare una PR.
- **3PE Command Injection**: Di solito, le CI/CD pipelines **impostano environment variables** con **informazioni sulla PR**. Se quel valore può essere controllato da un attacker (come il titolo della PR) ed è **usato** in un **punto pericoloso** (come l'esecuzione di **sh commands**), un attacker potrebbe **iniettare comandi lì dentro**.
- **D-PPE**: Un attacco **Direct PPE** si verifica quando l'attacker **modifica il file CI config** che verrà eseguito.
- **I-DDE**: Un attacco **Indirect PPE** si verifica quando l'attacker **modifica** un **file** su cui il file CI config che verrà eseguito **fa affidamento** (come un make file o una terraform config).
- **Public PPE or 3PE**: In alcuni casi le pipeline possono essere **attivate da utenti che non hanno write access nel repo** (e che potrebbero non far nemmeno parte dell'org) perché possono inviare una PR.
- **3PE Command Injection**: Di solito, le pipeline CI/CD **imposteranno variabili d'ambiente** con **informazioni sulla PR**. Se quel valore può essere controllato da un attacker (come il titolo della PR) ed è **usato** in un **punto pericoloso** (come l'esecuzione di **sh commands**), un attacker potrebbe **iniettare comandi lì dentro**.
### Exploitation Benefits
Conoscendo le 3 varianti per avvelenare una pipeline, vediamo cosa potrebbe ottenere un attacker dopo un'exploit riuscito:
Sapendo le 3 varianti per avvelenare una pipeline, vediamo cosa potrebbe ottenere un attacker dopo un'exploitazione riuscita:
- **Secrets**: Come detto in precedenza, le pipelines richiedono **privilegi** per i loro job (recuperare il codice, buildarlo, deployarlo...) e questi privilegi di solito sono **concessi nei secret**. Questi secret sono solitamente accessibili tramite **env variables o file all'interno del sistema**. Pertanto un attacker cercherà sempre di esfiltrare quanti più secret possibile.
- A seconda della platform della pipeline, l'attacker **potrebbe dover specificare i secret nella config**. Questo significa che, se l'attacker non può modificare il CI configuration pipeline (**I-PPE** per esempio), potrebbe **solo esfiltrare i secret che quella pipeline ha**.
- **Computation**: Il codice viene eseguito da qualche parte; a seconda di dove viene eseguito, un attacker potrebbe riuscire a pivotare ulteriormente.
- **On-Premises**: Se le pipelines vengono eseguite on premises, un attacker potrebbe finire in una **internal network con accesso a più risorse**.
- **Cloud**: L'attacker potrebbe accedere ad **altre macchine nel cloud** ma potrebbe anche **esfiltrare** token di IAM roles/service accounts **da esse** per ottenere **ulteriore accesso nel cloud**.
- **Platforms machine**: A volte i job verranno eseguiti sulle **macchine della platform delle pipelines**, che di solito si trovano in un cloud con **nessun altro accesso**.
- **Select it:** A volte la **platform delle pipelines avrà configurato più macchine** e, se puoi **modificare il file di configurazione CI**, puoi **indicare dove vuoi eseguire il codice malevolo**. In questa situazione, un attacker probabilmente eseguirà una reverse shell su ogni macchina possibile per provare a sfruttarla ulteriormente.
- **Compromise production**: Se sei dentro la pipeline e la versione finale viene buildata e deployata da lì, potresti **compromettere il codice che finirà per essere eseguito in production**.
- **Secrets**: Come detto prima, le pipeline richiedono **privilegi** per i loro job (recuperare il codice, buildarlo, deployarlo...) e questi privilegi sono solitamente **concessi in secrets**. Questi secrets sono di solito accessibili tramite **variabili d'ambiente o file dentro il sistema**. Pertanto un attacker cercherà sempre di exfiltrare quanti più secrets possibile.
- A seconda della piattaforma della pipeline, l'attacker **potrebbe dover specificare i secrets nella config**. Questo significa che se l'attacker non può modificare la pipeline di configurazione CI (**I-PPE** ad esempio), potrebbe **solo exfiltrare i secrets che quella pipeline ha**.
- **Computation**: Il codice viene eseguito da qualche parte, a seconda di dove viene eseguito un attacker potrebbe essere in grado di pivotare ulteriormente.
- **On-Premises**: Se le pipeline vengono eseguite on premises, un attacker potrebbe finire in una **rete interna con accesso a più risorse**.
- **Cloud**: L'attacker potrebbe accedere ad altre macchine nel cloud ma potrebbe anche **exfiltrare** token IAM roles/service accounts **da esse** per ottenere **ulteriore accesso dentro il cloud**.
- **Platforms machine**: A volte i job verranno eseguiti dentro le **macchine della platform delle pipeline**, che di solito sono dentro un cloud con **nessun altro accesso**.
- **Select it:** A volte la **platform delle pipeline avrà configurato diverse macchine** e se puoi **modificare il file di configurazione CI** puoi **indicare dove vuoi eseguire il codice malevolo**. In questa situazione, un attacker probabilmente eseguirà una reverse shell su ogni macchina possibile per provare a sfruttarla ulteriormente.
- **Compromise production**: Se sei dentro la pipeline e la versione finale viene buildata e deployata da lì, potresti **compromettere il codice che andrà in esecuzione in produzione**.
### Dependency & Registry Supply-Chain Abuse
Compromettere una CI/CD pipeline o rubarne le credenziali può permettere a un attacker di passare da **pipeline execution** a **ecosystem-wide code execution** backdoorando dependencies o release tooling:
Compromettere una CI/CD pipeline o rubarne le credenziali può permettere a un attacker di passare dall'**esecuzione nella pipeline** all'**esecuzione di codice su tutta l'ecosystem** inserendo backdoor nelle dependencies o negli strumenti di release:
- **Install-time code execution via package hooks**: pubblica una versione del package che aggiunge hook `preinstall`, `postinstall`, `prepare` o simili, così il payload viene eseguito automaticamente sulle workstation degli sviluppatori e sui CI runners durante l'installazione delle dependencies.
- **Secondary execution paths**: anche se i target installano con `--ignore-scripts`, un package malevolo può comunque registrare un **common CLI name** nel campo `bin` così che il wrapper controllato dall'attacker venga symlinkato in `PATH` ed eseguito più tardi quando il comando viene usato.
- **Runtime bootstrapping**: un piccolo installer può scaricare un secondo runtime o toolchain durante l'installazione (per esempio Bun o un interpreter impacchettato) e poi avviare il payload principale con esso, evitando requisiti locali di dependency.
- **Credential harvesting from build environments**: una volta che il codice gira dentro CI, controlla le environment variables, `~/.npmrc`, `~/.git-credentials`, SSH keys, cloud CLI configs e strumenti locali come `gh auth token`. Su GitHub Actions, cerca anche secret e artifacts specifici del runner.
- **Workflow injection with stolen GitHub tokens**: un token con permessi **`repo` + `workflow`** è sufficiente per creare un branch, fare commit di un file malevolo dentro `.github/workflows/`, attivarlo, raccogliere gli artifacts/log generati e poi eliminare il branch/workflow run temporaneo per ridurre le tracce.
- **Wormable registry propagation**: i token npm rubati dovrebbero essere verificati per i permessi di **publish** e per capire se bypassano la 2FA. Se lo fanno, enumera i package scrivibili, scarica i loro tarball, inietta un loader come `setup.mjs`, imposta `preinstall` per eseguirlo, incrementa la patch version e ripubblica. Questo trasforma un compromesso CI in auto-esecuzione downstream in altri ambienti.
- **Install-time code execution via package hooks**: pubblica una versione del package che aggiunge hook come `preinstall`, `postinstall`, `prepare` o simili, così il payload viene eseguito automaticamente sulle workstation degli sviluppatori e sui CI runners durante l'installazione delle dependencies.
- **Secondary execution paths**: anche se i target installano con `--ignore-scripts`, un package malevolo può comunque registrare un **nome CLI comune** nel campo `bin` così che il wrapper controllato dall'attacker venga symlinkato in `PATH` ed eseguito più tardi quando il comando viene usato.
- **Runtime bootstrapping**: un piccolo installer può scaricare un secondo runtime o toolchain durante l'installazione (per esempio Bun o un interpreter impacchettato) e poi lanciare con esso il main payload, evitando i requisiti delle dependencies locali.
- **Credential harvesting from build environments**: una volta che il codice gira dentro CI, controlla variabili d'ambiente, `~/.npmrc`, `~/.git-credentials`, chiavi SSH, config dei cloud CLI e strumenti locali come `gh auth token`. Su GitHub Actions, cerca anche secrets e artifacts specifici del runner.
- **Workflow injection with stolen GitHub tokens**: un token con permessi **`repo` + `workflow`** è sufficiente per creare un branch, fare commit di un file malevolo dentro `.github/workflows/`, attivarlo, raccogliere gli artifacts/log prodotti e poi eliminare il branch/workflow run temporaneo per ridurre le tracce.
- **Wormable registry propagation**: i token npm rubati dovrebbero essere verificati per i permessi di **publish** e per capire se bypassano 2FA. Se , enumera i package scrivibili, scarica i loro tarball, inietta un loader come `setup.mjs`, imposta `preinstall` per eseguirlo, incrementa la patch version e ripubblica. Questo trasforma un compromesso CI in auto-esecuzione a valle in altri ambienti.
#### Practical checks during an assessment
- Esamina l'automazione di release per hook del package manager aggiunti a `package.json`, `bin` entries inattese o version bumps che modificano solo l'artefact di release.
- Controlla se CI memorizza credenziali di registry a lunga durata in file in chiaro come `~/.npmrc` invece di usare OIDC a breve durata o trusted publishing.
- Verifica se i token GitHub disponibili in CI possono scrivere workflow files o creare branches/tags.
- Se si sospetta un package compromesso, ispeziona il tarball pubblicato e non solo il Git repository, perché il loader/runtime malevolo potrebbe esistere solo nell'artefact pubblicato.
- Cerca esecuzioni inattese del package manager dentro CI come `npm install` invece di `npm ci`, download/esecuzione inattesi di Bun, o nuovi workflow artifacts generati da transient branches.
- Esamina l'automazione di release per hook del package manager aggiunti a `package.json`, entry `bin` inattese o bump di versione che modificano solo l'artefatto di release.
- Verifica se la CI conserva credenziali di registry a lunga durata in file in chiaro come `~/.npmrc` invece di usare OIDC a breve durata o trusted publishing.
- Verifica se i token GitHub disponibili in CI possono scrivere file di workflow o creare branch/tag.
- Se si sospetta un package compromesso, ispeziona il tarball pubblicato e non solo il repository Git, perché il loader/runtime malevolo potrebbe esistere solo nell'artefatto pubblicato.
- Cerca esecuzioni inattese del package manager dentro CI come `npm install` invece di `npm ci`, download/esecuzione inattesi di Bun, o nuovi artifacts di workflow generati da branch temporanei.
- Esamina anche i motori di deploy GitOps come target CI/CD. L'enumerazione specifica di Argo CD, l'abuso del repo-server e gli attacchi di Redis cache poisoning sono trattati in [Argo CD Security](argocd-security.md).
## More relevant info
### Tools & CIS Benchmark
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) è uno strumento open-source per auditare il tuo software supply chain stack per la sicurezza e la compliance basata su un nuovo [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). L'audit si concentra sull'intero processo SDLC, dove può rivelare rischi dal code time fino al deploy time.
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) è uno strumento open-source per l'audit della tua software supply chain stack per la conformità alla sicurezza basata su un nuovo [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). L'audit si concentra sull'intero processo SDLC, dove può rivelare rischi dal code time al deploy time.
### Top 10 CI/CD Security Risk
@@ -118,12 +119,12 @@ Controlla questo articolo interessante sui top 10 rischi CI/CD secondo Cider: [*
### Labs
- Su ogni platform che puoi eseguire localmente troverai come avviarla in locale così puoi configurarla come vuoi per testarla
- Su ogni platform che puoi eseguire localmente troverai come avviarla localmente così puoi configurarla come vuoi per testarla
- Gitea + Jenkins lab: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat)
### Automatic Tools
- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** è uno strumento di static code analysis per infrastructure-as-code.
- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** è uno strumento di analisi statica del codice per infrastructure-as-code.
## References