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.
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.
PR não fiáveis a escrever em caches lidas por branches protegidos. Runners self-hosted reutilizados sem isolamento.
@v3, @main, @latest: cada referência flutuante é um futuro incidente de supply chain.
Identidade federada com AWS, Azure e GCP a partir do GitHub, do GitLab e do CircleCI.
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.
echo $SECRET, segredos passados como argumentos posicionais, segredos gravados em artefactos, segredos embutidos em camadas de contentor.
Passa o cursor sobre uma linha assinalada para ver a correção.Toca numa nota para ver a correção.
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.
.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.
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.
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.ymlon: pushjobs: test: runs-on: ubuntu-24.04 steps: - run: npm test
Nada a acrescentar: este ficheiro fica como está.
.gitlab-ci.ymlNada a acrescentar: este ficheiro fica como está.
bitbucket-pipelines.ymlNada a acrescentar: este ficheiro fica como está.
azure-pipelines.ymlNada a acrescentar: este ficheiro fica como está.
JenkinsfileNada a acrescentar: este ficheiro fica como está.
.circleci/config.ymlNada 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êsCode 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.
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.
npx -y @cybedefend/vibedefend@latest installClaude Code
CursorOpenAI Codex
WindsurfVS Code Copilot