Zum Hauptinhalt springen

Leitfaden

GitHub Actions, GitLab CI und Dockerfiles scannen

Eine Pipeline-Fehlkonfiguration ist auch eine Schwachstelle — ein Workflow, der den Code eines Forks unter pull_request_target auscheckt, kann Repo-Secrets genauso effektiv leaken wie eine SQL-Injection eine Datenbank leaken kann. Hier ist genau, was gescannt wird, welcher Teil standardmäßig aktiv ist und welchen Sie einschalten müssen, mit den echten Regel-IDs dahinter.

Zwei getrennte Regelsätze, nicht einer

Das ist das Detail, das die meisten Vergleiche auslassen: Dockerfile-Hygiene und CI/CD-Pipeline-Sicherheit sind zwei unterschiedliche Regelkategorien mit unterschiedlichem Standardzustand. Das falsch zu verstehen bedeutet entweder, eine Abdeckung zu verpassen, die man für gegeben hielt, oder überrascht zu sein, dass ein Scan etwas nicht gemeldet hat.

Dockerfile-Hygiene — standardmäßig aktiv

Allgemeine Dockerfile-Regeln liegen unter der Kategorie SECURITY, in jedem Scan ohne Konfiguration aktiviert:

Regel Schweregrad Was erkannt wird
dockerfile_root_user HIGH Keine USER-Direktive — der Container läuft standardmäßig als Root.
dockerfile_copy_all MEDIUM COPY . . zieht den gesamten Build-Kontext ins Image, einschließlich .env, Credentials, SSH-Schlüssel.
dockerfile_unpinned_base MEDIUM Basis-Image nicht auf eine bestimmte Version fixiert.

CI/CD-Pipeline-Regeln — optional, standardmäßig aus

Das ist der Punkt, den man präzise formulieren sollte: die 38 Regeln, die den Inhalt von .github/workflows/*.yml und .gitlab-ci.yml prüfen — Expression-Injection, Berechtigungs-Scoping, nicht fixierte Actions, und die Regel unten — sind unter einer separaten CICD-Kategorie gruppiert, die standardmäßig deaktiviert ist, genau wie das Dependency-Scanning --with-deps benötigt. Dafür gibt es kein CLI-Flag; es ist eine Konfigurationseinstellung.

Aktivieren in audit.config.json:

"categories": {
  "cicd": { "enabled": true, "weight": 2 }
}

Vor dem ersten Scan eines Projekts setzen (oder den Regel-Cache mit --no-cache einmal leeren, wenn Sie es bei einem bereits gescannten Projekt umschalten) — dann normal ausführen.

Regel Schweregrad Was erkannt wird
pull_request_target_checkout HIGH pull_request_target kombiniert mit einem Checkout des Fork-Heads — erlaubt einem geforkten PR, Code mit Schreibzugriff und Secrets-Zugang auszuführen.
unpinned_action_version MEDIUM Eine Action, referenziert über Branch oder Tag (@main, @v4) statt eines vollständigen Commit-SHA.
gha_missing_permissions LOW Workflow hat keinen expliziten permissions:-Block, fällt auf breiteren Zugriff als nötig zurück.
docker_latest_tag LOW Ein image:-Schlüssel in CI-YAML, fixiert auf :latest — Hinweis: dies erfasst den YAML-Schlüssel image:/from:, nicht eine Dockerfile-FROM-Zeile (das ist eine andere, Dockerfile-Sprach-Regel, aktuell nicht enthalten).
workflow_not_in_codeowners LOW Workflow-Dateien nicht durch einen CODEOWNERS-Eintrag abgedeckt, sodass Änderungen an der CI-Logik keinen bestimmten Reviewer erfordern.

Insgesamt 38 Regeln in dieser Kategorie — die Tabelle oben ist eine Stichprobe, nicht die vollständige Liste.

Ein reales Beispiel, von Anfang bis Ende

❌ Verwundbar
on: pull_request_target
jobs:
  build:
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}
✅ Sicher
on: pull_request
jobs:
  build:
    steps:
      - uses: actions/checkout@v4

Die Behebung hier ist keine Parameteranpassung — sie ist ein Wechsel des auslösenden Events. pull_request_target läuft mit den Berechtigungen und Secrets des Basis-Repos, auch für geforkte PRs; pull_request nicht. Falls nach Prüfung tatsächlich privilegierte Operationen nötig sind, lautet die eigene Empfehlung der Regel, sie in einen separaten workflow_run-Job auszulagern, statt dem pull_request_target-Job einen Checkout-Schritt hinzuzufügen.

Häufig gestellte Fragen

Warum ist CI/CD-Scanning optional statt standardmäßig aktiv?

Derselbe Grund, warum Dependency-Scanning --with-deps benötigt: nicht jedes Projekt hat überhaupt ein .github/workflows oder .gitlab-ci.yml, und YAML-/Pipeline-Dateien standardmäßig bei jedem Projekt zu scannen würde bei denen, die gar kein CI/CD nutzen, null Funde melden (und Scan-Zeit kosten). Die optionale Aktivierung hält den Standard-Scan auf den Anwendungs-Quellcode fokussiert.

Erfasst docker_latest_tag die FROM-Zeile eines Dockerfiles?

Nein — das Muster erfasst einen YAML-Schlüssel image: oder from: (die Syntax innerhalb von .gitlab-ci.yml-Job-Definitionen), nicht die FROM node:latest-Zeile eines Dockerfiles, die keinen Doppelpunkt nach der Anweisung hat. Das ist ein realer, verifizierter Unterschied, keine der Form halber hinzugefügte Einschränkung — die beiden Syntaxen unterscheiden sich ausreichend, dass ein einziges Muster nicht beide abdeckt.

Ändert das Aktivieren von CICD auch das Scannen von Dockerfiles?

Nein — Dockerfile-Hygiene-Regeln (Root-User, COPY . ., nicht fixiertes Basis-Image) liegen in der immer aktiven Kategorie SECURITY, unabhängig von der CICD-Einstellung. Das Aktivieren von CICD fügt nur die Pipeline-YAML-spezifischen Regeln zusätzlich hinzu.

Ist das dieselbe Erkennung wie GitHubs eigenes Workflow-Linting?

Nein — GitHubs eigenes Tooling prüft die syntaktische Gültigkeit des Workflows. Diese Regeln prüfen auf spezifische, bekannt gefährliche Muster (Privilege Escalation via pull_request_target, Supply-Chain-Risiko durch nicht fixierte Actions), die ein syntaktisch gültiger Workflow trotzdem enthalten kann.

An einer echten Pipeline sehen

Öffnen Sie den Live-Demo-Bericht — keine Installation, keine Anmeldung — oder aktivieren Sie die CICD-Kategorie in Ihrem eigenen Projekt und scannen Sie es.

Live-Bericht öffnen CLI-Referenz ansehen