
Scannt GitHub Actions CI/CD-Workflows auf Sicherheitsschwachstellen, indiziert Funde in eine Neo4j-Graphdatenbank und stellt eine Abfragebibliothek zur Erkennung von Fehlkonfigurationen, Injection-Angriffen und Lieferkettenrisiken bereit.
RAVEN (Risk Analysis and Vulnerability Enumeration for CI/CD) ist ein leistungsstarkes Sicherheitstool, das entwickelt wurde, um massive Scans von GitHub Actions CI-Workflows durchzuführen und die entdeckten Daten in einer Neo4j-Datenbank zu verarbeiten. Entwickelt und gepflegt vom Forschungsteam von Cycode.
Mit Raven konnten wir Sicherheitslücken in einigen der beliebtesten Repositorys auf GitHub identifizieren und melden, darunter:
Wir haben alle mit Raven entdeckten Schwachstellen in der Hall of Fame des Tools aufgelistet.
Das Tool bietet die folgenden Fähigkeiten zum Scannen und Analysieren potenzieller CI/CD-Sicherheitslücken:
Mögliche Verwendungen für Raven:
Dieses Tool bietet eine zuverlässige und skalierbare Lösung für die CI/CD-Sicherheitsanalyse und ermöglicht es Benutzern, schlechte Konfigurationen abzufragen und wertvolle Einblicke in die Sicherheitslage ihrer Codebasis zu gewinnen.
Im vergangenen Jahr hat Cycode Labs umfangreiche Forschungen zu grundlegenden Sicherheitsproblemen von CI/CD-Systemen durchgeführt. Wir haben die Tiefen vieler Systeme, Tausende von Projekten und mehrere Konfigurationen untersucht. Die Schlussfolgerung ist klar – das Modell, bei dem die Sicherheit an Entwickler delegiert wird, ist gescheitert. Dies wurde in unseren vorherigen Inhalten mehrfach bewiesen:
Jede der oben genannten Schwachstellen hat einzigartige Merkmale, die es Entwicklern nahezu unmöglich machen, mit den neuesten Sicherheitstrends Schritt zu halten. Leider haben alle Schwachstellen eines gemeinsam – jede Ausnutzung kann Millionen von Opfern betreffen.
Aus diesen Gründen wurde Raven entwickelt, ein Framework für die Sicherheitsanalyse von CI/CD-Workflows (und GitHub Actions als erster Anwendungsfall). In unserem Fokus untersuchten wir komplexe Szenarien, in denen jedes Problem für sich allein keine Bedrohung darstellt, aber in Kombination eine ernsthafte Bedrohung darstellt.
Um mit Raven zu beginnen, befolgen Sie diese Installationsanweisungen:
Schritt 1: Installieren Sie das Raven-Paket```bash pip3 install raven-cycode
**Schritt 2**: Richten Sie einen lokalen Redis-Server und eine Neo4j-Datenbank ein```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
Eine andere Möglichkeit, die Umgebung einzurichten, ist die Ausführung unserer bereitgestellten Docker Compose Datei:```bash git clone https://github.com/CycodeLabs/raven.git cd raven make setup
**Schritt 3**: Raven Downloader ausführen
Kontomodus:```bash
raven download account --token $GITHUB_TOKEN --account-name RavenDemo
Crawl-Modus:```bash raven download crawl --token $GITHUB_TOKEN --min-stars 1000
**Schritt 4**: Raven Indexer ausführen```bash
raven index
Schritt 5: Überprüfen Sie die Ergebnisse über den Reporter```bash raven report --format raw
An diesem Punkt ist es möglich, die Daten in der Neo4j-Datenbank zu inspizieren, indem Sie http://localhost:7474/browser/ verbinden.
### Voraussetzungen
- Python 3.9+
- Docker Compose v2.1.0+
- Docker Engine v1.13.0+
## Infrastruktur
Raven verwendet zwei primäre Docker-Container: Redis und Neo4j.
`make setup` führt einen `docker compose` Befehl aus, um diese Umgebung vorzubereiten.

## Verwendung
Das Tool enthält drei Hauptfunktionen, `download` und `index` und `report`.
### Download
#### Account-Repositories herunterladen```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)
## Beispiele
Ruft alle Workflows und Aktionen ab, die mit einem beliebigen Konto (Benutzer/Organisation) verknüpft sind.```bash
raven download account --token $GITHUB_TOKEN --account-name microsoft --account-name google --debug
Scrape alle öffentlich zugänglichen GitHub-Repositories.```bash raven download crawl --token $GITHUB_TOKEN --min-stars 100 --max-stars 1000 --debug
Nach Abschluss des Downloadvorgangs oder bei Unterbrechung durch Strg+C fahren Sie fort, alle Workflows und Aktionen in die Neo4j-Datenbank zu indizieren.```bash
raven index --debug
Jetzt können wir einen Bericht mit unserer Abfragebibliothek erstellen.```bash raven report --severity high --tag injection --tag unauthenticated
## Rate Limiting
Für effektives Rate Limiting sollten Sie ein Github-Token bereitstellen.
Für authentifizierte Benutzer gelten die folgenden Ratenbegrenzungen:
- Code-Suche – 30 Abfragen pro Minute
- Jede andere API – 5000 pro Stunde
## Research Knowledge Base
- [Issue-Injektionen](https://github.com/CycodeLabs/raven/blob/main/docs/Issue%20Injections/README.md)
- [Pull-Request-Injektionen](https://github.com/CycodeLabs/raven/blob/main/docs/Pull%20Request%20Injections/README.md)
- [Workflow-Run-Injektionen](https://github.com/CycodeLabs/raven/blob/main/docs/Multi%20Prerequisite%20Exploits/README.md)
- [CodeSee-Injektionen](https://github.com/CycodeLabs/raven/blob/main/docs/Codesee%20Injections/README.md)
## Aktuelle Einschränkungen
- Es ist möglich, eine externe Aktion auszuführen, indem man auf einen Ordner mit einer `Dockerfile` (ohne `action.yml`) verweist. Derzeit wird dieses Verhalten nicht unterstützt.
- Es ist möglich, eine externe Aktion auszuführen, indem man über die URL `docker://...` auf einen Docker-Container verweist. Derzeit wird dieses Verhalten nicht unterstützt.
- Es ist möglich, eine Aktion auszuführen, indem man sie lokal referenziert. Dies erzeugt ein komplexes Verhalten, da sie aus einem anderen Repository stammen kann, das zuvor ausgecheckt wurde. Das derzeitige Verhalten versucht, sie im vorhandenen Repository zu finden.
- Wir modellieren nicht die gesamte Workflow-Struktur. Wenn zusätzliche Felder benötigt werden, reichen Sie bitte einen Pull-Request gemäß den [Beitrag](https://github.com/CycodeLabs/raven/blob/main/CONTRIBUTING.md)-Richtlinien ein.
## Zukünftige Forschungsarbeit
- Implementierung von Taint-Analyse. Beispielanwendungsfall – ein Benutzer kann einen Pull-Request-Titel (ein kontrollierbarer Parameter) an einen Aktionsparameter namens `data` übergeben. Dieser Aktionsparameter kann in einem Befehl verwendet werden: `- run: echo ${{ inputs.data }}`, was einen Pfad für eine Codeausführung schafft.
- Erweitern Sie die Forschung auf Ergebnisse von schädlichem Missbrauch von `GITHUB_ENV`. Dies kann auch die vorherige Taint-Analyse nutzen.
- Untersuchen Sie, ob `actions/github-script` eine interessante Bedrohungslandschaft hat. Wenn ja, kann es im Graphen modelliert werden.
## License
[Apache License 2.0](https://github.com/CycodeLabs/raven/blob/main/LICENSE.md)
## Hall of Fame – Gefundene und offengelegte Schwachstellen mit Raven
| Name | Sterne | Fix | Zusätzliche Quellen |
| ------ | -------- | ---- | -------------------- |
| [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/) |
## Möchten Sie mehr über CI/CD-Sicherheit, AppSec und ASPM erfahren? Schauen Sie sich Cycode an
Wenn Ihnen Raven gefallen hat, werden Sie wahrscheinlich unsere [Cycode](https://cycode.com/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page)-Plattform lieben, die noch erweiterte Funktionen für Sichtbarkeit, Priorisierung und Behebung von Schwachstellen in der Software-Lieferkette bietet.
Wenn Sie an einer robusten, forschungsgestützten Pipeline-Sicherheits-, Anwendungssicherheits- oder ASPM-Lösung interessiert sind, zögern Sie nicht, uns zu kontaktieren oder eine Demo über das Formular [https://cycode.com/book-a-demo/](https://cycode.com/book-a-demo/?utm_source=github_website&utm_medium=referral&utm_campaign=raven_page) anzufordern.