
Scansiona i workflow CI/CD di GitHub Actions per vulnerabilità di sicurezza, indicizza i risultati in un database grafico Neo4j e fornisce una libreria di query per rilevare misconfigurazioni, injection e rischi legati alla supply chain.
RAVEN (Risk Analysis and Vulnerability Enumeration for CI/CD) è un potente strumento di sicurezza progettato per eseguire scansioni massive dei workflow CI di GitHub Actions e digerire i dati scoperti in un database Neo4j. Sviluppato e mantenuto dal team di ricerca Cycode.
Con Raven, siamo stati in grado di identificare e segnalare vulnerabilità di sicurezza in alcuni dei repository più popolari ospitati su GitHub, tra cui:
Abbiamo elencato tutte le vulnerabilità scoperte con Raven nella Hall of Fame dello strumento.
Lo strumento fornisce le seguenti capacità per scansionare e analizzare potenziali vulnerabilità CI/CD:
Possibili utilizzi di Raven:
Questo strumento fornisce una soluzione affidabile e scalabile per l'analisi della sicurezza CI/CD, consentendo agli utenti di interrogare configurazioni errate e ottenere preziose informazioni sulla postura di sicurezza del proprio codebase.
Nell'ultimo anno, Cycode Labs ha condotto una ricerca approfondita sui problemi di sicurezza fondamentali dei sistemi CI/CD. Abbiamo esaminato le profondità di molti sistemi, migliaia di progetti e diverse configurazioni. La conclusione è chiara: il modello in cui la sicurezza è delegata agli sviluppatori ha fallito. Questo è stato dimostrato più volte nei nostri contenuti precedenti:
Ognuna delle vulnerabilità sopra ha caratteristiche uniche, rendendo quasi impossibile per gli sviluppatori rimanere aggiornati con le ultime tendenze di sicurezza. Sfortunatamente, ogni vulnerabilità condivide una caratteristica comune: ogni sfruttamento può avere un impatto su milioni di vittime.
È per questi motivi che è stato creato Raven, un framework per l'analisi della sicurezza dei workflow CI/CD (e GitHub Actions come primo caso d'uso). Nel nostro focus, abbiamo esaminato scenari complessi in cui ogni problema non è una minaccia di per sé, ma quando combinati, rappresentano una grave minaccia.
Per iniziare con Raven, segui queste istruzioni di installazione:
Passaggio 1: Installa il pacchetto Raven```bash pip3 install raven-cycode
**Step 2**: Configura un server Redis locale e un database 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
Un altro modo per configurare l'ambiente è eseguire il nostro file docker compose fornito:```bash git clone https://github.com/CycodeLabs/raven.git cd raven make setup
**Passo 3**: Esegui Raven Downloader
Modalità Account:```bash
raven download account --token $GITHUB_TOKEN --account-name RavenDemo
Modalità di scansione:```bash raven download crawl --token $GITHUB_TOKEN --min-stars 1000
**Passaggio 4**: Esegui Raven Indexer```bash
raven index
Passo 5: Ispeziona i risultati tramite il reporter```bash raven report --format raw
A questo punto, è possibile ispezionare i dati nel database Neo4j collegandosi a http://localhost:7474/browser/.
### Prerequisiti
- Python 3.9+
- Docker Compose v2.1.0+
- Docker Engine v1.13.0+
## Infrastruttura
Raven utilizza due contenitori docker principali: Redis e Neo4j.
Il comando `make setup` eseguirà un comando `docker compose` per preparare tale ambiente.

## Utilizzo
Lo strumento contiene tre funzionalità principali: `download`, `index` e `report`.
### Download
#### Scaricare i Repository di un Account```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
### Indice```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)
## Esempi
Recupera tutti i flussi di lavoro e le azioni associati a qualsiasi account (utente/organizzazione).```bash
raven download account --token $GITHUB_TOKEN --account-name microsoft --account-name google --debug
Esegui lo scraping di tutti i repository GitHub pubblicamente accessibili.```bash raven download crawl --token $GITHUB_TOKEN --min-stars 100 --max-stars 1000 --debug
Dopo aver completato il processo di download o se interrotto utilizzando Ctrl+C, procedi a indicizzare tutti i workflow e le azioni nel database Neo4j.```bash
raven index --debug
Ora possiamo generare un report utilizzando la nostra libreria di query.```bash raven report --severity high --tag injection --tag unauthenticated
## Limitazione di Velocità
Per una limitazione della velocità efficace, dovresti fornire un token Github.
Per gli utenti autenticati, si applicano le seguenti limitazioni di velocità:
- Ricerca codice - 30 query al minuto
- Qualsiasi altra API - 5000 all'ora
## Base di Conoscenza della Ricerca
- [Issue Injections](https://github.com/CycodeLabs/raven/blob/main/docs/Issue%20Injections/README.md)
- [Pull Request Injections](https://github.com/CycodeLabs/raven/blob/main/docs/Pull%20Request%20Injections/README.md)
- [Workflow Run Injections](https://github.com/CycodeLabs/raven/blob/main/docs/Multi%20Prerequisite%20Exploits/README.md)
- [CodeSee Injections](https://github.com/CycodeLabs/raven/blob/main/docs/Codesee%20Injections/README.md)
## Limitazioni Attuali
- È possibile eseguire un'azione esterna facendo riferimento a una cartella con un `Dockerfile` (senza `action.yml`). Attualmente, questo comportamento non è supportato.
- È possibile eseguire un'azione esterna facendo riferimento a un container docker tramite l'URL `docker://...`. Attualmente, questo comportamento non è supportato.
- È possibile eseguire un'azione facendo riferimento locale. Questo crea un comportamento complesso, poiché potrebbe provenire da un repository diverso che è stato precedentemente scaricato. Il comportamento attuale cerca di trovarlo nel repository esistente.
- Non stiamo modellando l'intera struttura del workflow. Se sono necessari campi aggiuntivi, invia una pull request secondo le linee guida per i [contributi](https://github.com/CycodeLabs/raven/blob/main/CONTRIBUTING.md).
## Lavoro di Ricerca Futuro
- Implementazione dell'analisi di taint. Esempio di caso d'uso - un utente può passare un titolo di pull request (che è un parametro controllabile) a un parametro dell'azione chiamato `data`. Quel parametro dell'azione può essere utilizzato in un comando run: `- run: echo ${{ inputs.data }}`, il che crea un percorso per un'esecuzione di codice.
- Espandere la ricerca per scoperte di uso improprio dannoso di `GITHUB_ENV`. Questo può utilizzare anche la precedente analisi di taint.
- Ricercare se `actions/github-script` ha un panorama di minacce interessante. Se sì, può essere modellato nel grafo.
## Licenza
[Apache License 2.0](https://github.com/CycodeLabs/raven/blob/main/LICENSE.md)
## Hall of Fame - Vulnerabilità Trovate e Divulgate Usando Raven
| Nome | Stelle | Correzione | Fonti Aggiuntive |
| ------ | -------- | ---- | -------------------- |
| [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/) |
## Vuoi saperne di più su Sicurezza CI/CD, AppSec e ASPM? Scopri Cycode
Se ti è piaciuto Raven, probabilmente adorerai la nostra piattaforma [Cycode](https://cycode.com/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page) che offre capacità ancora più avanzate per visibilità, prioritizzazione e correzione delle vulnerabilità lungo tutta la distribuzione del software.
Se sei interessato a una soluzione robusta e basata sulla ricerca per Pipeline Security, Application Security o ASPM, non esitare a contattarci o richiedere una demo usando il modulo [https://cycode.com/book-a-demo/](https://cycode.com/book-a-demo/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page).