Tus pipelines son código. Por eso los leemos.

Análisis estático de tus archivos de workflow: inyecciones, actions sin fijar, tokens con demasiados privilegios y deriva de OIDC.

Seis dialectos de CI alimentan un solo parser: GitHub Actions, GitLab CI, Bitbucket, Azure DevOps, Jenkins, CircleCI.El commit a3f9c2e toca release.yml. Dos ejecuciones salen del build: #4821 y #4822.En la barrera, release.yml se lee como lo leería un atacante: trigger, permisos, cada uses: y run:.#4821 queda bloqueada: pull_request_target con contents: write y una action sin fijar nunca llegan al job de deploy.#4822 sale a prod-eu: SHA fijado, token de solo lectura, el título de la PR fuera del shell.

Lo que detecta el escáner

Seis fallos,
leídos en el archivo.

Convertimos tus workflows en un AST y un grafo de flujo de datos, y les aplicamos nuestros propios packs de reglas.

Por defecto, los permisos de GITHUB_TOKEN son write para casi todo. Detectamos permissions: sin definir y permisos amplios que no usas, y recomendamos el mínimo necesario para cada job.

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

PR no confiables que escriben en cachés que leen las ramas protegidas. Runners autoalojados reutilizados sin aislamiento.

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

@v3, @main, @latest: cada referencia flotante es un futuro incidente de supply chain.

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

Identidad federada con AWS, Azure y GCP desde GitHub, GitLab y CircleCI.

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

Cada vez que interpolas ${{ github.event.* }}, nombres de rama, títulos de PR o el texto de las issues en un bloque run:, abres la puerta a una inyección de shell en tu propio pipeline.

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

echo $SECRET, secretos pasados como argumentos posicionales, secretos volcados en artefactos, secretos incrustados en capas de contenedor.

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

Pasa el cursor por una línea marcada para ver su corrección.Toca una nota para ver su corrección.

Por qué un escáner estático

Caza la mala configuración
antes de que corra el runner.

La mayoría de los incidentes de pipeline ya se ven en el YAML. Lo leemos como lo leería un atacante.

cybedefendcommented onnotify.yml:10

pull_request.title reaches run: through inputs.message.

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

Los archivos de workflow se examinan con el mismo rigor que el código de tu aplicación: análisis del AST, propagación de taint y análisis de source a sink.

Cómo funciona el escáner

Conecta el repo,
el resto es automático.

Conecta GitHub o GitLab. Leemos tus archivos de pipeline en cada push, o cuando lo pidas.

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

Nada que añadir: este archivo se queda tal cual.

.gitlab-ci.yml

Nada que añadir: este archivo se queda tal cual.

bitbucket-pipelines.yml

Nada que añadir: este archivo se queda tal cual.

azure-pipelines.yml

Nada que añadir: este archivo se queda tal cual.

Jenkinsfile

Nada que añadir: este archivo se queda tal cual.

.circleci/config.yml

Nada que añadir: este archivo se queda tal cual.

Cómo funciona,
en detalle.

La documentación explica la instalación, la configuración y cada opción.

Leer la documentaciónen inglés

Code Scanning / CI/CD Integrations

GitHub Action Setup for Local Code Scanning

La GitHub Action oficial y un workflow listo para pegar, además de guías para otras siete plataformas de CI.

FAQ

Preguntas frecuentes sobre el escáner CI/CD.

¿CybeDefend analiza mis archivos de pipeline sin ser un paso dentro del pipeline?

Exacto. Conectas el repositorio una sola vez. Nuestros escáneres leen directamente .github/workflows, .gitlab-ci.yml, Jenkinsfile y el resto, y publican los hallazgos como comentarios en la línea afectada y en el dashboard unificado. No hay que añadir ningún paso a tu pipeline ni instalar un runner privilegiado.

¿Qué formatos de pipeline admite CybeDefend?

Workflows de GitHub Actions (incluidas las actions compuestas y los workflows reutilizables), YAML de GitLab CI (incluidas las cadenas `include:`) y Jenkinsfile (Groovy declarativo y scripted). También leemos las definiciones de actions (action.yml y los wrappers de Dockerfile), así que seguimos los flujos de taint entre actions. Añadimos otros dialectos a petición de los clientes.

¿Cómo se detecta una inyección en workflows si solo se dispara con ciertos payloads de eventos?

No necesitamos el payload. Tratamos como no confiable cada valor que llega de `github.event.*`, `inputs.*`, `head_ref`, `pull_request.title/body` y de las refs de rama y de tag de un fork, y lo seguimos a través de `env:`, `with:`, los valores de output y los límites de las actions compuestas. Si ese valor llega a un bloque `run:`, a un `eval` en una action de JavaScript o a un comando con sustitución de shell, es un hallazgo, te hayan atacado ya o no.

¿Detecta CybeDefend GitHub Actions maliciosas o con typosquatting?

Sí. Cada entrada `uses:` se cruza con el feed de actions maliciosas de OpenSSF, la lista de publishers verificados y nuestras propias heurísticas de typosquatting sobre los nombres de las actions. Los tags sin fijar se señalan aparte, porque hasta una action legítima se convierte en un riesgo de supply chain si no la fijas a un SHA.

¿Y los secretos en archivos de workflow?

Todo lo que coincide con los patrones de entropía y de proveedor de nuestro pack de reglas de detección de secretos también se señala en los archivos de CI/CD. Además detectamos secretos pasados como argumentos posicionales de la CLI (visibles en `ps`), secretos escritos en los logs con `echo` y secretos incrustados en los inputs de workflows reutilizables. Los hallazgos se deduplican con los del escáner de secretos para que no te lleguen dos veces.

¿Se pueden analizar las configuraciones de runners autoalojados?

Sí. Analizamos las directivas `runs-on:`, detectamos runners que comparten el estado del sistema de archivos entre PR no confiables, señalamos la ausencia de controles del tipo `actions/cleanup` y avisamos de los jobs que escalan a root o montan el socket de Docker.

Instala VibeDefend en 5 segundos.

Un solo comando conecta a CybeDefend todos los agentes de programación de tu máquina: tus reglas de negocio, tus marcos normativos y protecciones que bloquean las acciones destructivas antes de que se ejecuten.

Instala en 5 segundosNode 18.17+
npx -y @cybedefend/vibedefend@latest install
Detección automática
  • Claude CodeClaude Code
  • CursorCursor
  • OpenAI CodexOpenAI Codex
  • WindsurfWindsurf
  • GitHub CopilotVS Code Copilot