As tuas pipelines são código. Por isso lemo-las.

Análise estática dos teus ficheiros de workflow: injeções, actions não fixadas, tokens com privilégios a mais e desvios de OIDC.

Seis dialetos de CI alimentam um único parser: GitHub Actions, GitLab CI, Bitbucket, Azure DevOps, Jenkins, CircleCI.O commit a3f9c2e toca no release.yml. Duas execuções saem do build: #4821 e #4822.Na barreira, o release.yml é lido como o leria um atacante: trigger, permissões, cada uses: e run:.#4821 fica bloqueada: pull_request_target com contents: write e uma action não fixada nunca chegam ao job de deploy.#4822 segue para prod-eu: SHA fixado, token só de leitura, o título da PR fora da shell.

O que o scanner apanha

Seis falhas,
lidas no ficheiro.

Convertemos os teus workflows num AST e num grafo de fluxo de dados e aplicamos-lhes os nossos próprios packs de regras.

Por omissão, as permissões do GITHUB_TOKEN são write para quase tudo. Detetamos permissions: por definir e permissões amplas que não usas, e recomendamos o mínimo necessário para cada job.

permissions: write-all
permissions:
contents: read
id-token: write

PR não fiáveis a escrever em caches lidas por branches protegidos. Runners self-hosted reutilizados sem isolamento.

runs-on: self-hosted
runs-on: ubuntu-24.04

@v3, @main, @latest: cada referência flutuante é um futuro incidente de supply chain.

uses: actions/checkout@v3
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

Identidade federada com AWS, Azure e GCP a partir do GitHub, do GitLab e do CircleCI.

role/deploy › trust policy › sub
repo:acme/*
repo:acme/api:environment:production

Sempre que interpolas ${{ github.event.* }}, nomes de branch, títulos de PR ou o texto das issues num bloco run:, abres a porta a uma injeção de shell na tua própria pipeline.

run: echo "${{ github.event.pull_request.title }}"
env:
TITLE: ${{ github.event.pull_request.title }}
run: echo "$TITLE"

echo $SECRET, segredos passados como argumentos posicionais, segredos gravados em artefactos, segredos embutidos em camadas de contentor.

run: ./publish.sh ${{ secrets.NPM_TOKEN }}
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
run: ./publish.sh

Passa o cursor sobre uma linha assinalada para ver a correção.Toca numa nota para ver a correção.

Porquê um scanner estático

Apanha a má configuração
antes de o runner correr.

A maioria dos incidentes de pipeline já é visível no YAML. Lemo-lo como o leria um atacante.

cybedefendcommented onnotify.yml:10

pull_request.title reaches run: through inputs.message.

run: echo "${{ inputs.message }}"
env: { MSG: "${{ inputs.message }}" }
run: echo "$MSG"

Os ficheiros de workflow são examinados com o mesmo rigor que o código da tua aplicação: análise do AST, propagação de taint e análise de source a sink.

Como funciona o scanner

Liga o repo,
o resto é automático.

Liga o GitHub ou o GitLab. Lemos os teus ficheiros de pipeline a cada push, ou quando pedires.

.github/workflows/ci.yml
on: pushjobs:  test:    runs-on: ubuntu-24.04    steps:      - run: npm test

Nada a acrescentar: este ficheiro fica como está.

.gitlab-ci.yml

Nada a acrescentar: este ficheiro fica como está.

bitbucket-pipelines.yml

Nada a acrescentar: este ficheiro fica como está.

azure-pipelines.yml

Nada a acrescentar: este ficheiro fica como está.

Jenkinsfile

Nada a acrescentar: este ficheiro fica como está.

.circleci/config.yml

Nada a acrescentar: este ficheiro fica como está.

Como funciona,
em detalhe.

A documentação explica a instalação, a configuração e cada opção.

Ler a documentaçãoem inglês

Code Scanning / CI/CD Integrations

GitHub Action Setup for Local Code Scanning

A GitHub Action oficial e um workflow pronto a colar, além de guias para outras sete plataformas de CI.

FAQ

Perguntas frequentes sobre o scanner CI/CD.

A CybeDefend analisa os ficheiros da pipeline sem ser um passo dentro dela?

Exato. Ligas o repositório uma única vez. Os nossos scanners leem diretamente .github/workflows, .gitlab-ci.yml, Jenkinsfile e os restantes, e publicam as descobertas como comentários na linha afetada e no dashboard unificado. Não é preciso acrescentar nenhum passo à tua pipeline nem instalar um runner privilegiado.

Que formatos de pipeline são suportados?

Workflows do GitHub Actions (incluindo actions compostas e workflows reutilizáveis), YAML do GitLab CI (incluindo cadeias `include:`) e Jenkinsfile (Groovy declarativo e scripted). Também lemos as definições de actions (action.yml e os wrappers de Dockerfile), por isso seguimos os fluxos de taint entre actions. Acrescentamos outros dialetos a pedido dos clientes.

Como se deteta uma injeção em workflows se só é acionada com certos payloads de eventos?

Não precisamos do payload. Tratamos como não fiável cada valor que vem de `github.event.*`, `inputs.*`, `head_ref`, `pull_request.title/body` e das refs de branch e de tag de um fork, e seguimo-lo através de `env:`, `with:`, dos valores de output e das fronteiras das actions compostas. Se esse valor chegar a um bloco `run:`, a um `eval` numa action de JavaScript ou a um comando com substituição de shell, é uma descoberta, quer já tenhas sido atacado ou não.

A CybeDefend deteta GitHub Actions maliciosas ou com typosquatting?

Sim. Cada entrada `uses:` é cruzada com o feed de actions maliciosas da OpenSSF, a lista de publicadores verificados e as nossas próprias heurísticas de typosquatting sobre os nomes das actions. As tags não fixadas são assinaladas à parte, porque até uma action legítima se torna um risco de supply chain se não a fixares num SHA.

E os segredos nos ficheiros de workflow?

Tudo o que corresponde aos padrões de entropia e de fornecedor do nosso pack de regras de deteção de segredos é também assinalado nos ficheiros de CI/CD. Detetamos ainda segredos passados como argumentos posicionais da CLI (visíveis no `ps`), segredos escritos nos logs com `echo` e segredos embutidos nos inputs de workflows reutilizáveis. As descobertas são deduplicadas com as do scanner de segredos, para não as receberes duas vezes.

É possível analisar configurações de runners self-hosted?

Sim. Analisamos as diretivas `runs-on:`, detetamos runners que partilham o estado do sistema de ficheiros entre PR não fiáveis, assinalamos a falta de controlos do tipo `actions/cleanup` e avisamos sobre jobs que escalam para root ou montam o socket do Docker.

Instala o VibeDefend em 5 segundos.

Um só comando liga à CybeDefend todos os agentes de programação da tua máquina: as tuas regras de negócio, os teus referenciais de conformidade e proteções que bloqueiam ações destrutivas antes de serem executadas.

Instalar em 5 segundosNode 18.17+
npx -y @cybedefend/vibedefend@latest install
Deteta automaticamente
  • Claude CodeClaude Code
  • CursorCursor
  • OpenAI CodexOpenAI Codex
  • WindsurfWindsurf
  • GitHub CopilotVS Code Copilot