Le tue pipeline sono codice. Quindi le leggiamo.
Analisi statica dei tuoi file di workflow. Injection, action non pinnate, token con troppi privilegi, drift della configurazione OIDC.
Sei dialetti CI alimentano un solo parser: GitHub Actions, GitLab CI, Bitbucket, Azure DevOps, Jenkins, CircleCI.Il commit a3f9c2e modifica release.yml. Dalla build partono due run: #4821 e #4822.Al gate, release.yml viene letto come lo leggerebbe un attaccante: trigger, permessi, ogni uses: e run:.#4821 è bloccata: pull_request_target con contents: write e un'action non pinnata non arrivano mai al job di deploy.#4822 va in prod-eu: SHA pinnato, token in sola lettura, il titolo della PR tenuto fuori dalla shell.
Sei falle di pipeline,
trovate nel file.
Convertiamo i tuoi workflow in un AST e in un grafo del flusso dei dati, poi applichiamo i nostri rule pack.
Per impostazione predefinita il GITHUB_TOKEN ha permessi write su quasi tutto. Rileviamo permissions: non impostati e scope troppo ampi che non usi, e suggeriamo il set minimo per ogni job.
PR non fidate che scrivono in cache lette da branch protetti. Riuso di self-hosted runner senza isolamento.
@v3, @main, @latest: ogni riferimento mobile è un futuro incidente di supply chain.
Identità federata AWS, Azure e GCP da GitHub, GitLab e CircleCI.
Ogni volta che inserisci ${{ github.event.* }}, nomi di branch, titoli di PR o il testo delle issue in un blocco run:, esponi la tua stessa pipeline alla shell injection.
echo $SECRET, secret passati come argomenti posizionali, secret loggati negli artefatti, secret incorporati nei layer del container.
Passa il mouse su una riga segnalata per vedere la correzione.Tocca una nota per vedere la correzione.
Intercetta la misconfig
prima che il runner giri.
La maggior parte degli incidenti di pipeline è già visibile nello YAML. Lo leggiamo come lo legge un attaccante.
.github/workflows/release.yml:12sourcemessage: ${{ github.event.pull_request.title }}.github/workflows/notify.yml:4hopmessage: { type: string }.github/workflows/notify.yml:10sinkrun: echo "${{ inputs.message }}"
notify.yml:10pull_request.title reaches run: through inputs.message.
I file di workflow vengono analizzati con lo stesso rigore del tuo codice applicativo: parsing dell'AST, propagazione del taint, analisi da source a sink.
Collega il repo,
il resto è automatico.
Collega GitHub o GitLab. Leggiamo i tuoi file di pipeline a ogni push, o su richiesta.
.github/workflows/ci.ymlon: pushjobs: test: runs-on: ubuntu-24.04 steps: - run: npm test
Niente da aggiungere: questo file resta com'è.
.gitlab-ci.ymlNiente da aggiungere: questo file resta com'è.
bitbucket-pipelines.ymlNiente da aggiungere: questo file resta com'è.
azure-pipelines.ymlNiente da aggiungere: questo file resta com'è.
JenkinsfileNiente da aggiungere: questo file resta com'è.
.circleci/config.ymlNiente da aggiungere: questo file resta com'è.
Come funziona,
nel dettaglio.
La documentazione spiega l'installazione, la configurazione e ogni opzione.
Leggi la documentazionein ingleseCode Scanning / CI/CD Integrations
GitHub Action Setup for Local Code Scanning
La GitHub Action ufficiale e un workflow pronto da incollare, più le guide per altre sette piattaforme di CI.
Domande frequenti sullo scanner CI/CD.
Analizzate i file della pipeline dall'esterno, senza aggiungere uno step?
Esatto. Collega il repo una volta. I nostri scanner leggono direttamente .github/workflows, .gitlab-ci.yml, Jenkinsfile e gli altri, poi riportano i finding come commenti inline sulla riga incriminata e nella dashboard unificata. Nessuno step da aggiungere alla tua pipeline, nessun runner privilegiato da installare.
Quali formati di pipeline supportate?
Workflow di GitHub Actions (compresi i workflow compositi e riutilizzabili), YAML di GitLab CI (comprese le catene `include:`) e Jenkinsfile (Groovy dichiarativo e scripted). Leggiamo anche le definizioni delle action (action.yml e i wrapper Dockerfile), così seguiamo il taint anche da un'action all'altra. Altri dialetti vengono aggiunti su richiesta dei clienti.
Come trovate una workflow injection che si attiva solo con certi payload?
Il payload non ci serve. Marchiamo come contaminato (tainted) ogni valore che arriva da `github.event.*`, `inputs.*`, `head_ref`, `pull_request.title/body` e dai ref di branch e tag provenienti da un fork, e lo seguiamo attraverso `env:`, `with:`, i valori di output e i confini delle composite action. Se il valore contaminato raggiunge un blocco `run:`, un `eval` in una action JavaScript o un comando con sostituzione di shell, è un finding, anche se nessuno ha ancora sfruttato la falla.
Intercettate GitHub Action malevole o di typosquatting?
Sì. Ogni voce `uses:` viene confrontata con il feed OpenSSF delle action malevole, con l'elenco dei publisher verificati e con le nostre euristiche di typosquatting sui nomi delle action. I tag non pinnati vengono segnalati a parte, perché anche un'action legittima diventa un rischio di supply chain se non la fissi a uno SHA.
E i secret nei file di workflow?
Tutto ciò che corrisponde ai pattern di entropia e dei provider del nostro rule pack Secret Detection viene segnalato anche nei file CI/CD. Rileviamo inoltre i secret passati come argomenti posizionali della CLI (visibili con `ps`), quelli scritti nei log con `echo` e quelli incorporati negli input dei workflow riutilizzabili. I finding vengono deduplicati con lo scanner dei secret, così non li vedi due volte.
Potete analizzare configurazioni di runner self-hosted?
Sì. Analizziamo le direttive `runs-on:`, rileviamo i runner che condividono lo stato del filesystem tra PR non affidabili, segnaliamo l'assenza di protezioni come `actions/cleanup` e avvisiamo sui job che ottengono i privilegi di root o montano il socket Docker.
Installa VibeDefend in 5 secondi.
Un solo comando collega ogni agente di coding sul tuo computer a CybeDefend: le tue regole di business, i tuoi framework di compliance e protezioni che bloccano le chiamate distruttive prima che vengano eseguite.
npx -y @cybedefend/vibedefend@latest installClaude Code
CursorOpenAI Codex
WindsurfVS Code Copilot