
Analiza flujos de trabajo de CI/CD de GitHub Actions en busca de vulnerabilidades de seguridad, indexa los hallazgos en una base de datos de grafos Neo4j y proporciona una biblioteca de consultas para detectar configuraciones erróneas, inyecciones y riesgos en la cadena de suministro.
RAVEN (Risk Analysis and Vulnerability Enumeration for CI/CD) es una poderosa herramienta de seguridad diseñada para realizar escaneos masivos de flujos de trabajo de CI de GitHub Actions y digerir los datos descubiertos en una base de datos Neo4j. Desarrollada y mantenida por el equipo de investigación de Cycode.
Con Raven, pudimos identificar y reportar vulnerabilidades de seguridad en algunos de los repositorios más populares alojados en GitHub, incluyendo:
Enumeramos todas las vulnerabilidades descubiertas usando Raven en el Salón de la Fama de la herramienta.
La herramienta ofrece las siguientes capacidades para escanear y analizar posibles vulnerabilidades de CI/CD:
Posibles usos de Raven:
Esta herramienta proporciona una solución confiable y escalable para el análisis de seguridad de CI/CD, permitiendo a los usuarios consultar configuraciones incorrectas y obtener información valiosa sobre la postura de seguridad de su base de código.
En el último año, Cycode Labs llevó a cabo una extensa investigación sobre los problemas de seguridad fundamentales de los sistemas CI/CD. Examinamos las profundidades de muchos sistemas, miles de proyectos y varias configuraciones. La conclusión es clara: el modelo en el que la seguridad se delega a los desarrolladores ha fracasado. Esto se ha demostrado varias veces en nuestro contenido anterior:
Cada una de las vulnerabilidades anteriores tiene características únicas, lo que hace casi imposible para los desarrolladores mantenerse al día con las últimas tendencias de seguridad. Desafortunadamente, cada vulnerabilidad comparte una característica común: cada explotación puede afectar a millones de víctimas.
Fue por estas razones que se creó Raven, un framework para el análisis de seguridad de flujos de trabajo CI/CD (y GitHub Actions como primer caso de uso). En nuestro enfoque, examinamos escenarios complejos donde cada problema no es una amenaza por sí solo, pero cuando se combinan, representan una amenaza grave.
Para comenzar con Raven, sigue estas instrucciones de instalación:
Paso 1: Instala el paquete Raven```bash pip3 install raven-cycode
**Paso 2**: Configurar un servidor Redis local y una base de datos Neo4j```bash
docker run -d --name raven-neo4j -p7474:7474 -p7687:7687 --env NEO4J_AUTH=neo4j/123456789 --volume raven-neo4j:/data neo4j:5.12
docker run -d --name raven-redis -p6379:6379 --volume raven-redis:/data redis:7.2.1
Otra forma de configurar el entorno es ejecutando nuestro archivo docker compose proporcionado:```bash git clone https://github.com/CycodeLabs/raven.git cd raven make setup
**Paso 3**: Ejecutar Raven Downloader
Modo de cuenta:```bash
raven download account --token $GITHUB_TOKEN --account-name RavenDemo
Modo de rastreo:```bash raven download crawl --token $GITHUB_TOKEN --min-stars 1000
**Paso 4**: Ejecutar Raven Indexer```bash
raven index
Paso 5: Inspecciona los resultados a través del reporter```bash raven report --format raw
En este punto, es posible inspeccionar los datos en la base de datos Neo4j, conectándose a http://localhost:7474/browser/.
### Requisitos previos
- Python 3.9+
- Docker Compose v2.1.0+
- Docker Engine v1.13.0+
## Infraestructura
Raven utiliza dos contenedores docker principales: Redis y Neo4j.
`make setup` ejecutará un comando `docker compose` para preparar ese entorno.

## Uso
La herramienta contiene tres funcionalidades principales: `download`, `index` y `report`.
### Descarga
#### Descargar repositorios de la cuenta```bash
usage: raven download account [-h] --token TOKEN [--debug] [--redis-host REDIS_HOST] [--redis-port REDIS_PORT] [--clean-redis] (--account-name ACCOUNT_NAME | --personal)
options:
-h, --help show this help message and exit
--token TOKEN GITHUB_TOKEN to download data from Github API (Needed for effective rate-limiting)
--debug Whether to print debug statements, default: False
--redis-host REDIS_HOST
Redis host, default: localhost
--redis-port REDIS_PORT
Redis port, default: 6379
--clean-redis, -cr Whether to clean cache in the redis, default: False
--account-name ACCOUNT_NAME
Account name for downloading the workflows, can be used multiple times
--personal Download repositories owned by the authenticated user
usage: raven download crawl [-h] --token TOKEN [--debug] [--redis-host REDIS_HOST] [--redis-port REDIS_PORT] [--clean-redis] [--max-stars MAX_STARS] [--min-stars MIN_STARS]
options: -h, --help show this help message and exit --token TOKEN GITHUB_TOKEN to download data from Github API (Needed for effective rate-limiting) --debug Whether to print debug statements, default: False --redis-host REDIS_HOST Redis host, default: localhost --redis-port REDIS_PORT Redis port, default: 6379 --clean-redis, -cr Whether to clean cache in the redis, default: False --max-stars MAX_STARS Maximum number of stars for a repository --min-stars MIN_STARS Minimum number of stars for a repository, default: 1000
### Índice```bash
usage: raven index [-h] [--redis-host REDIS_HOST] [--redis-port REDIS_PORT] [--clean-redis] [--neo4j-uri NEO4J_URI] [--neo4j-user NEO4J_USER] [--neo4j-pass NEO4J_PASS]
[--clean-neo4j] [--debug]
options:
-h, --help show this help message and exit
--redis-host REDIS_HOST
Redis host, default: localhost
--redis-port REDIS_PORT
Redis port, default: 6379
--clean-redis, -cr Whether to clean cache in the redis, default: False
--neo4j-uri NEO4J_URI
Neo4j URI endpoint, default: neo4j://localhost:7687
--neo4j-user NEO4J_USER
Neo4j username, default: neo4j
--neo4j-pass NEO4J_PASS
Neo4j password, default: 123456789
--clean-neo4j, -cn Whether to clean cache, and index from scratch, default: False
--debug Whether to print debug statements, default: False
usage: raven report [-h] [--redis-host REDIS_HOST] [--redis-port REDIS_PORT] [--clean-redis] [--neo4j-uri NEO4J_URI] [--neo4j-user NEO4J_USER] [--neo4j-pass NEO4J_PASS] [--clean-neo4j] [--tag {injection,unauthenticated,fixed,priv-esc,supply-chain,best-practice,endoflife,reconnaissance}] [--severity {info,low,medium,high,critical}] [--query_ids RQ-1,..,RQ-16] [--queries-path QUERIES_PATH] [--format {raw,json}] {slack} ...
positional arguments: {slack} slack Send report to slack channel
options: -h, --help show this help message and exit --redis-host REDIS_HOST Redis host, default: localhost --redis-port REDIS_PORT Redis port, default: 6379 --clean-redis, -cr Whether to clean cache in the redis, default: False --neo4j-uri NEO4J_URI Neo4j URI endpoint, default: neo4j://localhost:7687 --neo4j-user NEO4J_USER Neo4j username, default: neo4j --neo4j-pass NEO4J_PASS Neo4j password, default: 123456789 --clean-neo4j, -cn Whether to clean cache, and index from scratch, default: False --tag {injection,unauthenticated,fixed,priv-esc,supply-chain,best-practice,endoflife,reconnaissance}, -t {injection,unauthenticated,fixed,priv-esc,supply-chain,best-practice,endoflife,reconnaissance} Filter queries with specific tag --severity {info,low,medium,high,critical}, -s {info,low,medium,high,critical} Filter queries by severity level (default: info) --query_ids RQ-1,..,RQ-16, -id RQ-1,..,RQ-16 Filter queries by query ids (example: RQ-2,RQ-8) --queries-path QUERIES_PATH, -dp QUERIES_PATH Queries folder (default: library) --format {raw,json}, -f {raw,json} Report format (default: raw)
## Ejemplos
Recupera todos los flujos de trabajo y acciones asociados con cualquier cuenta (usuario/organización).```bash
raven download account --token $GITHUB_TOKEN --account-name microsoft --account-name google --debug
Extraer todos los repositorios públicos de GitHub.```bash raven download crawl --token $GITHUB_TOKEN --min-stars 100 --max-stars 1000 --debug
Después de finalizar el proceso de descarga o si se interrumpe usando Ctrl+C, proceda a indexar todos los flujos de trabajo y acciones en la base de datos Neo4j.```bash
raven index --debug
Ahora, podemos generar un informe usando nuestra biblioteca de consultas.```bash raven report --severity high --tag injection --tag unauthenticated
## Límite de tasa
Para una limitación de tasa efectiva, debes proporcionar un token de Github.
Para usuarios autenticados, se aplica la siguiente limitación de tasa:
- Búsqueda de código - 30 consultas por minuto
- Cualquier otra API - 5000 por hora
## Base de conocimiento de investigación
- [Inyecciones de Issues](https://github.com/CycodeLabs/raven/blob/main/docs/Issue%20Injections/README.md)
- [Inyecciones de Pull Request](https://github.com/CycodeLabs/raven/blob/main/docs/Pull%20Request%20Injections/README.md)
- [Inyecciones de Workflow Run](https://github.com/CycodeLabs/raven/blob/main/docs/Multi%20Prerequisite%20Exploits/README.md)
- [Inyecciones de CodeSee](https://github.com/CycodeLabs/raven/blob/main/docs/Codesee%20Injections/README.md)
## Limitaciones actuales
- Es posible ejecutar una acción externa referenciando una carpeta con un `Dockerfile` (sin `action.yml`). Actualmente, este comportamiento no es compatible.
- Es posible ejecutar una acción externa referenciando un contenedor docker a través de la URL `docker://...`. Actualmente, este comportamiento no es compatible.
- Es posible ejecutar una acción referenciándola localmente. Esto crea un comportamiento complejo, ya que puede provenir de un repositorio diferente que se haya verificado anteriormente. El comportamiento actual intenta encontrarla en el repositorio existente.
- No estamos modelando toda la estructura del workflow. Si se necesitan campos adicionales, por favor envía un pull request de acuerdo con las [guías de contribución](https://github.com/CycodeLabs/raven/blob/main/CONTRIBUTING.md).
## Trabajo de investigación futuro
- Implementación de análisis de manchas (taint analysis). Ejemplo de caso de uso: un usuario puede pasar el título de un pull request (que es un parámetro controlable) a un parámetro de acción llamado `data`. Ese parámetro de acción puede ser usado en un comando run: `- run: echo ${{ inputs.data }}`, lo que crea una ruta para la ejecución de código.
- Expandir la investigación para hallazgos de uso malicioso de `GITHUB_ENV`. Esto también puede utilizar el análisis de manchas anterior.
- Investigar si `actions/github-script` tiene un panorama de amenazas interesante. Si es así, puede ser modelado en el grafo.
## Licencia
[Licencia Apache 2.0](https://github.com/CycodeLabs/raven/blob/main/LICENSE.md)
## Salón de la Fama - Vulnerabilidades encontradas y divulgadas usando Raven
| Nombre | Estrellas | Corrección | Fuentes adicionales |
| ------ | -------- | ---- | -------------------- |
| [freeCodeCamp/freeCodeCamp](https://github.com/freeCodeCamp/freeCodeCamp) |  | CodeSee package update, [0871341](https://github.com/freeCodeCamp/freeCodeCamp/commit/0871341c9cbf96ab455bc3e0bce636e2ef2a2be2) | [Blog](https://cycode.com/blog/cycode-secures-thousands-of-open-source-projects/) |
| [Significant-Gravitas/AutoGPT](https://github.com/Significant-Gravitas/AutoGPT) |  | [cdae7f8](https://github.com/Significant-Gravitas/AutoGPT/pull/6313/commits/cdae7f84ce0b2879fdcc1fa04956cdaa42a07bfb) | | [storybookjs/storybook](https://github.com/storybookjs/storybook) |  | [ffb8558](https://github.com/storybookjs/storybook/commit/ffb8558b7e5df4644299e5ec7009ade6ca1a721c) | [Blog](https://cycode.com/ci-story-how-we-found-critical-vulnerabilities-in-storybook-project/) |
| [tiangolo/fastapi](https://github.com/tiangolo/fastapi) |  | [9efab1b](https://github.com/tiangolo/fastapi/commit/9efab1bd96ef061edf1753626573a0a2be1eef09) | [LinkedIn](https://www.linkedin.com/feed/update/urn:li:activity:7011753940283203584/) |
| [withastro/astro](https://github.com/withastro/astro) |  | [650fb1a](https://github.com/withastro/astro/commit/650fb1aa51a1c843c10bc89a11732b45a6345b00) | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
| [statelyai/xstate](https://github.com/statelyai/xstate) |  | CodeSee package update | [Blog](https://cycode.com/blog/cycode-secures-thousands-of-open-source-projects/) |
| [bazelbuild/bazel](https://github.com/bazelbuild/bazel) |  | [3561f07](https://github.com/bazelbuild/continuous-integration/commit/3561f079e0414d31ebba923815695e1e714937cb) | [Blog](https://cycode.com/blog/cycode-discovers-a-supply-chain-vulnerability-in-bazel/) |
| [docker-slim/docker-slim](https://github.com/docker-slim/docker-slim) |  | CodeSee package update | [Blog](https://cycode.com/blog/cycode-secures-thousands-of-open-source-projects/) |
| [microsoft/fluentui](https://github.com/microsoft/fluentui) |  | [2ea6195](https://github.com/microsoft/fluentui/commit/2ea6195152131766641311ee5604e746b578d8e7) | [Blog](https://cycode.com/blog/analyzing-the-vulnerability-that-could-have-compromised-microsoft-365-users/) |
| [tiangolo/sqlmodel](https://github.com/tiangolo/sqlmodel) |  | [cf36b2d](https://github.com/tiangolo/sqlmodel/commit/cf36b2d9baccf527bc61071850f102e2cd8bf6bf) | [LinkedIn](https://www.linkedin.com/feed/update/urn:li:activity:7011753940283203584/) |
| [tiangolo/typer](https://github.com/tiangolo/typer) |  | [0c106a1](https://github.com/tiangolo/typer/commit/0c106a169e5e3c7df6f98e32a6d8405c985b695a) | [LinkedIn](https://www.linkedin.com/feed/update/urn:li:activity:7011753940283203584/) |
| [juspay/hyperswitch](https://github.com/juspay/hyperswitch) |  | [a052f9a](https://github.com/juspay/hyperswitch/pull/2797/commits/a052f9a9c921ec0ff8c526097841be5777faf835) | |
| [autogluon/autogluon](https://github.com/autogluon/autogluon) |  | [ca18fa9](https://github.com/autogluon/autogluon/commit/ca18fa9fa2071f670125fd19700cf3570a6b5119) | |
| [apache/camel](https://github.com/apache/camel) |  | [02e512a](https://github.com/apache/camel/pull/11879/commits/02e512ae1ab0a471e80d86096ea79b45789aa105) | | [liquibase/liquibase](https://github.com/liquibase/liquibase) |  | [3278525](https://github.com/liquibase/liquibase/commit/3278525eaf974daea20808926f9a6816aecd01a7) | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
| [ossf/scorecard](https://github.com/ossf/scorecard) |  | [c9f582b](https://github.com/ossf/scorecard/commit/c9f582b620a57a1a476f4e3add505ff50c51a774) | |
| [Ombi-app/Ombi](https://github.com/Ombi-app/Ombi) |  | [5cc0d77](https://github.com/Ombi-app/Ombi/commit/5cc0d7727d72fe1fee8a3f6c3874d44a5b785de4) | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
| [wireapp/wire-ios](https://github.com/wireapp/wire-ios) |  | [9d39d6c](https://github.com/wireapp/wire-ios/commit/9d39d6c93b5a58a0bc8c1aba10e0d67756359630) | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
| [cloudscape-design/components](https://github.com/cloudscape-design/components) |  | [2921d2d](https://github.com/cloudscape-design/.github/commit/2921d2d1420fef5b849d5aecbcfb9138ac6b9dcc) | |
| [DynamoDS/Dynamo](https://github.com/DynamoDS/Dynamo) |  | Disabled workflow | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
| [fauna/faunadb-js](https://github.com/fauna/faunadb-js) |  | [ee6f53f](https://github.com/fauna/faunadb-js/commit/ee6f53f9c985bde41976743530e3846dee058587) | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
| [apache/incubator-kie-kogito-runtimes](https://github.com/apache/incubator-kie-kogito-runtimes) |  | [53c18e5](https://github.com/apache/incubator-kie-kogito-runtimes/commit/53c18e5372e5306e0aa580f201f820b80359ad11) | [Blog](https://cycode.com/github-actions-vulnerabilities/) |
## ¿Quieres más de Seguridad CI/CD, AppSec y ASPM? Visita Cycode
Si te gustó Raven, probablemente te encantará nuestra plataforma [Cycode](https://cycode.com/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page) que ofrece capacidades aún más mejoradas para visibilidad, priorización y remediación de vulnerabilidades en toda la entrega de software.
Si estás interesado en una solución robusta, impulsada por investigación, de Seguridad de Pipeline, Seguridad de Aplicaciones o ASPM, no dudes en contactarnos o solicitar una demostración usando el formulario [https://cycode.com/book-a-demo/](https://cycode.com/book-a-demo/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page).