
Analyse les workflows CI/CD GitHub Actions pour détecter les vulnérabilités de sécurité, indexe les résultats dans une base de données graphique Neo4j et fournit une bibliothèque de requêtes pour repérer les erreurs de configuration, les injections et les risques liés à la chaîne d'approvisionnement.
RAVEN (Risk Analysis and Vulnerability Enumeration for CI/CD) est un puissant outil de sécurité conçu pour effectuer des analyses massives des workflows CI/CD GitHub Actions et traiter les données découvertes dans une base de données Neo4j. Développé et maintenu par l'équipe de recherche de Cycode.
Avec Raven, nous avons pu identifier et signaler des vulnérabilités de sécurité dans certains des dépôts les plus populaires hébergés sur GitHub, notamment :
Nous avons listé toutes les vulnérabilités découvertes avec Raven dans le Hall of Fame de l'outil.
L'outil offre les fonctionnalités suivantes pour analyser et détecter les vulnérabilités CI/CD potentielles :
Utilisations possibles de Raven :
Cet outil fournit une solution fiable et scalable pour l'analyse de sécurité CI/CD, permettant aux utilisateurs d'interroger les mauvaises configurations et d'obtenir des informations précieuses sur la posture de sécurité de leur codebase.
Au cours de l'année écoulée, Cycode Labs a mené des recherches approfondies sur les problèmes de sécurité fondamentaux des systèmes CI/CD. Nous avons examiné les profondeurs de nombreux systèmes, des milliers de projets et plusieurs configurations. La conclusion est claire : le modèle dans lequel la sécurité est déléguée aux développeurs a échoué. Cela a été prouvé à plusieurs reprises dans notre contenu précédent :
Chacune des vulnérabilités ci-dessus a des caractéristiques uniques, rendant presque impossible pour les développeurs de se tenir au courant des dernières tendances en matière de sécurité. Malheureusement, chaque vulnérabilité partage un point commun : chaque exploitation peut avoir un impact sur des millions de victimes.
C'est pour ces raisons que Raven a été créé, un framework pour l'analyse des workflows de sécurité CI/CD (et GitHub Actions comme premier cas d'utilisation). Dans notre focus, nous avons examiné des scénarios complexes où chaque problème n'est pas une menace en soi, mais lorsqu'ils sont combinés, ils constituent une menace grave.
Pour commencer avec Raven, suivez ces instructions d'installation :
Étape 1 : Installez le package Raven```bash pip3 install raven-cycode
**Étape 2**: Configurer un serveur Redis local et une base de données 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
Une autre façon de configurer l'environnement est d'exécuter notre fichier docker compose fourni :```bash git clone https://github.com/CycodeLabs/raven.git cd raven make setup
**Étape 3**: Exécutez Raven Downloader
Mode compte :```bash
raven download account --token $GITHUB_TOKEN --account-name RavenDemo
Mode crawl:```bash raven download crawl --token $GITHUB_TOKEN --min-stars 1000
**Étape 4**: Exécutez Raven Indexer```bash
raven index
Étape 5: Inspectez les résultats via le reporter```bash raven report --format raw
À ce stade, il est possible d'inspecter les données dans la base de données Neo4j, en se connectant à http://localhost:7474/browser/.
### Prérequis
- Python 3.9+
- Docker Compose v2.1.0+
- Docker Engine v1.13.0+
## Infrastructure
Raven utilise deux conteneurs docker principaux : Redis et Neo4j.
`make setup` exécutera une commande `docker compose` pour préparer cet environnement.

## Utilisation
L'outil contient trois fonctionnalités principales : `download`, `index` et `report`.
### Téléchargement
#### Télécharger les dépôts du compte```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
### Index```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)
## Exemples
Récupérez tous les workflows et actions associés à n'importe quel compte (utilisateur/organisation).```bash
raven download account --token $GITHUB_TOKEN --account-name microsoft --account-name google --debug
Récupérer tous les dépôts GitHub accessibles publiquement.```bash raven download crawl --token $GITHUB_TOKEN --min-stars 100 --max-stars 1000 --debug
Après avoir terminé le processus de téléchargement ou après une interruption avec Ctrl+C, procédez à l'indexation de tous les workflows et actions dans la base de données Neo4j.```bash
raven index --debug
Maintenant, nous pouvons générer un rapport en utilisant notre bibliothèque de requêtes.```bash raven report --severity high --tag injection --tag unauthenticated
## Limitation de débit
Pour une limitation de débit efficace, vous devez fournir un token GitHub.
Pour les utilisateurs authentifiés, la limitation suivante s'applique :
- Recherche de code - 30 requêtes par minute
- Toute autre API - 5000 par heure
## Base de connaissances de recherche
- [Injections d'issues](https://github.com/CycodeLabs/raven/blob/main/docs/Issue%20Injections/README.md)
- [Injections de Pull Requests](https://github.com/CycodeLabs/raven/blob/main/docs/Pull%20Request%20Injections/README.md)
- [Injections d'exécutions de workflow](https://github.com/CycodeLabs/raven/blob/main/docs/Multi%20Prerequisite%20Exploits/README.md)
- [Injections CodeSee](https://github.com/CycodeLabs/raven/blob/main/docs/Codesee%20Injections/README.md)
## Limitations actuelles
- Il est possible d'exécuter une action externe en référençant un dossier contenant un `Dockerfile` (sans `action.yml`). Actuellement, ce comportement n'est pas pris en charge.
- Il est possible d'exécuter une action externe en référençant un conteneur docker via l'URL `docker://...`. Actuellement, ce comportement n'est pas pris en charge.
- Il est possible d'exécuter une action en la référençant localement. Cela crée un comportement complexe, car elle peut provenir d'un autre dépôt qui a été extrait précédemment. Le comportement actuel essaie de la trouver dans le dépôt existant.
- Nous ne modélisons pas toute la structure du workflow. Si des champs supplémentaires sont nécessaires, veuillez soumettre une pull request conformément aux directives de [contribution](https://github.com/CycodeLabs/raven/blob/main/CONTRIBUTING.md).
## Travaux de recherche futurs
- Implémentation de l'analyse de contamination (taint analysis). Exemple d'utilisation : un utilisateur peut passer le titre d'une pull request (qui est un paramètre contrôlable) à un paramètre d'action nommé `data`. Ce paramètre d'action peut être utilisé dans une commande d'exécution : `- run: echo ${{ inputs.data }}`, ce qui crée une voie pour une exécution de code.
- Étendre la recherche pour les découvertes d'utilisation abusive de `GITHUB_ENV`. Cela pourrait également utiliser l'analyse de contamination précédente.
- Rechercher si `actions/github-script` présente un paysage de menaces intéressant. Si c'est le cas, il peut être modélisé dans le graphe.
## Licence
[Licence Apache 2.0](https://github.com/CycodeLabs/raven/blob/main/LICENSE.md)
## Hall of Fame - Vulnérabilités découvertes et divulguées grâce à Raven
| Nom | Étoiles | Correction | Sources supplémentaires |
| ------ | -------- | ---- | -------------------- |
| [freeCodeCamp/freeCodeCamp](https://github.com/freeCodeCamp/freeCodeCamp) |  | Mise à jour du package CodeSee, [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) |  | Mise à jour du package CodeSee | [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) |  | Mise à jour du package CodeSee | [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) |  | Workflow désactivé | [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/) |
## Vous voulez en savoir plus sur la sécurité CI/CD, AppSec et ASPM ? Découvrez Cycode
Si vous avez aimé Raven, vous adorerez probablement notre plateforme [Cycode](https://cycode.com/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page) qui offre des capacités encore plus avancées en matière de visibilité, de priorisation et de correction des vulnérabilités dans le cycle de livraison logicielle.
Si vous êtes intéressé par une solution robuste et axée sur la recherche en matière de sécurité des pipelines, de sécurité des applications ou d'ASPM, n'hésitez pas à nous contacter ou à demander une démo via le formulaire [https://cycode.com/book-a-demo/](https://cycode.com/book-a-demo/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page).