Pentesting CI/CD Methodology

Unterstütze HackTricks

VCS

VCS steht für Versionskontrollsystem, dieses System ermöglicht Entwicklern, ihren Quellcode zu verwalten. Das gebräuchlichste ist git und du wirst normalerweise Unternehmen finden, die es auf einer der folgenden Plattformen verwenden:

  • Github

  • Gitlab

  • Bitbucket

  • Gitea

  • Cloud-Anbieter (sie bieten ihre eigenen VCS-Plattformen an)

Pipelines

Pipelines ermöglichen es Entwicklern, die Ausführung von Code zu automatisieren (zum Bauen, Testen, Bereitstellen... Zwecke), nachdem bestimmte Aktionen auftreten: Ein Push, ein PR, Cron... Sie sind äußerst nützlich, um alle Schritte von der Entwicklung bis zur Produktion zu automatisieren.

Diese Systeme müssen jedoch irgendwo ausgeführt werden und normalerweise mit privilegierten Anmeldeinformationen, um Code bereitzustellen.

VCS Pentesting Methodologie

Auch wenn einige VCS-Plattformen die Erstellung von Pipelines erlauben, werden wir in diesem Abschnitt nur potenzielle Angriffe auf die Kontrolle des Quellcodes analysieren.

Plattformen, die den Quellcode deines Projekts enthalten, enthalten sensible Informationen und die Menschen müssen sehr vorsichtig mit den innerhalb dieser Plattform gewährten Berechtigungen sein. Dies sind einige häufige Probleme auf VCS-Plattformen, die Angreifer ausnutzen könnten:

  • Leaks: Wenn dein Code Leaks in den Commits enthält und der Angreifer auf das Repo zugreifen kann (weil es öffentlich ist oder weil er Zugang hat), könnte er die Leaks entdecken.

  • Zugriff: Wenn ein Angreifer auf ein Konto innerhalb der VCS-Plattform zugreifen kann, könnte er mehr Sichtbarkeit und Berechtigungen erlangen.

  • Registrierung: Einige Plattformen erlauben externen Benutzern nur, ein Konto zu erstellen.

  • SSO: Einige Plattformen erlauben es Benutzern nicht, sich zu registrieren, erlauben jedoch jedem, mit einem gültigen SSO zuzugreifen (ein Angreifer könnte beispielsweise sein Github-Konto verwenden, um einzutreten).

  • Anmeldeinformationen: Benutzername+Pwd, persönliche Tokens, SSH-Schlüssel, Oauth-Tokens, Cookies... es gibt verschiedene Arten von Tokens, die ein Benutzer stehlen könnte, um auf irgendeine Weise auf ein Repo zuzugreifen.

  • Webhooks: VCS-Plattformen erlauben die Generierung von Webhooks. Wenn sie nicht geschützt sind mit nicht sichtbaren Geheimnissen, könnte ein Angreifer sie ausnutzen.

  • Wenn kein Geheimnis vorhanden ist, könnte der Angreifer den Webhook der Drittanbieterplattform ausnutzen.

  • Wenn das Geheimnis in der URL ist, passiert dasselbe und der Angreifer hat auch das Geheimnis.

  • Code-Kompromittierung: Wenn ein böswilliger Akteur eine Art von Schreibzugriff auf die Repos hat, könnte er versuchen, bösartigen Code einzuschleusen. Um erfolgreich zu sein, muss er möglicherweise Branch-Schutzmaßnahmen umgehen. Diese Aktionen können mit unterschiedlichen Zielen im Hinterkopf durchgeführt werden:

  • Den Hauptbranch kompromittieren, um die Produktion zu gefährden.

  • Den Hauptbranch (oder andere Branches) kompromittieren, um Entwicklermaschinen zu gefährden (da sie normalerweise Tests, Terraform oder andere Dinge innerhalb des Repos auf ihren Maschinen ausführen).

  • Die Pipeline kompromittieren (siehe nächsten Abschnitt).

Pipelines Pentesting Methodologie

Der gebräuchlichste Weg, eine Pipeline zu definieren, besteht darin, eine CI-Konfigurationsdatei, die im Repository gehostet wird, zu verwenden, das die Pipeline erstellt. Diese Datei beschreibt die Reihenfolge der ausgeführten Jobs, Bedingungen, die den Ablauf beeinflussen, und Einstellungen der Build-Umgebung. Diese Dateien haben typischerweise einen konsistenten Namen und ein konsistentes Format, zum Beispiel — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI) und die GitHub Actions YAML-Dateien, die sich unter .github/workflows befinden. Wenn sie ausgelöst werden, zieht der Pipeline-Job den Code aus der ausgewählten Quelle (z.B. Commit / Branch) und führt die im CI-Konfigurationsdatei angegebenen Befehle gegen diesen Code aus.

Daher ist das ultimative Ziel des Angreifers, irgendwie diese Konfigurationsdateien oder die Befehle, die sie ausführen, zu kompromittieren.

PPE - Vergiftete Pipeline-Ausführung

Der Vergiftete Pipeline-Ausführungs (PPE) Pfad nutzt Berechtigungen in einem SCM-Repository aus, um eine CI-Pipeline zu manipulieren und schädliche Befehle auszuführen. Benutzer mit den erforderlichen Berechtigungen können CI-Konfigurationsdateien oder andere Dateien, die vom Pipeline-Job verwendet werden, ändern, um bösartige Befehle einzufügen. Dies "vergiftet" die CI-Pipeline und führt zur Ausführung dieser bösartigen Befehle.

Damit ein böswilliger Akteur erfolgreich einen PPE-Angriff durchführen kann, muss er in der Lage sein:

  • Schreibzugriff auf die VCS-Plattform zu haben, da Pipelines normalerweise ausgelöst werden, wenn ein Push oder ein Pull-Request durchgeführt wird. (Überprüfe die VCS-Pentesting-Methodologie für eine Zusammenfassung der Möglichkeiten, Zugriff zu erhalten).

  • Beachte, dass manchmal ein externer PR als "Schreibzugriff" zählt.

  • Selbst wenn er Schreibberechtigungen hat, muss er sicherstellen, dass er die CI-Konfigurationsdatei oder andere Dateien, auf die die Konfiguration angewiesen ist, ändern kann.

  • Dazu muss er möglicherweise in der Lage sein, Branch-Schutzmaßnahmen zu umgehen.

Es gibt 3 PPE-Varianten:

  • D-PPE: Ein Direkter PPE-Angriff tritt auf, wenn der Akteur die CI-Konfigurationsdatei ändert, die ausgeführt werden soll.

  • I-DDE: Ein Indirekter PPE-Angriff tritt auf, wenn der Akteur eine Datei ändert, auf die die CI-Konfigurationsdatei, die ausgeführt werden soll, angewiesen ist (wie eine Make-Datei oder eine Terraform-Konfiguration).

  • Öffentlicher PPE oder 3PE: In einigen Fällen können die Pipelines von Benutzern ausgelöst werden, die keinen Schreibzugriff im Repo haben (und die möglicherweise nicht einmal Teil der Organisation sind), weil sie einen PR senden können.

  • 3PE-Befehlsinjektion: Normalerweise setzen CI/CD-Pipelines Umgebungsvariablen mit Informationen über den PR. Wenn dieser Wert von einem Angreifer kontrolliert werden kann (wie der Titel des PR) und in einem gefährlichen Ort (wie der Ausführung von sh-Befehlen) verwendet wird, könnte ein Angreifer Befehle dort injizieren.

Ausbeutungsgewinne

Wenn man die 3 Varianten kennt, um eine Pipeline zu vergiften, schauen wir uns an, was ein Angreifer nach einer erfolgreichen Ausbeutung erhalten könnte:

  • Geheimnisse: Wie bereits erwähnt, erfordern Pipelines Berechtigungen für ihre Jobs (den Code abrufen, ihn bauen, bereitstellen...) und diese Berechtigungen werden normalerweise in Geheimnissen gewährt. Diese Geheimnisse sind normalerweise über Umgebungsvariablen oder Dateien im System zugänglich. Daher wird ein Angreifer immer versuchen, so viele Geheimnisse wie möglich zu exfiltrieren.

  • Abhängig von der Pipeline-Plattform muss der Angreifer möglicherweise die Geheimnisse in der Konfiguration angeben. Das bedeutet, dass, wenn der Angreifer die CI-Konfigurationspipeline nicht ändern kann (I-PPE zum Beispiel), er nur die Geheimnisse exfiltrieren könnte, die diese Pipeline hat.

  • Berechnung: Der Code wird irgendwo ausgeführt, abhängig davon, wo er ausgeführt wird, könnte ein Angreifer in der Lage sein, weiter zu pivotieren.

  • On-Premises: Wenn die Pipelines vor Ort ausgeführt werden, könnte ein Angreifer in einem internen Netzwerk mit Zugang zu mehr Ressourcen enden.

  • Cloud: Der Angreifer könnte auf andere Maschinen in der Cloud zugreifen, könnte aber auch IAM-Rollen/Dienstkonten-Tokens von dort exfiltrieren, um weiteren Zugang innerhalb der Cloud zu erhalten.

  • Plattformmaschine: Manchmal werden die Jobs innerhalb der Pipelines-Plattformmaschinen ausgeführt, die sich normalerweise in einer Cloud mit keinem weiteren Zugang befinden.

  • Wähle es aus: Manchmal hat die Pipelines-Plattform mehrere Maschinen konfiguriert und wenn du die CI-Konfigurationsdatei ändern kannst, kannst du angeben, wo du den bösartigen Code ausführen möchtest. In dieser Situation wird ein Angreifer wahrscheinlich auf jeder möglichen Maschine eine Reverse-Shell ausführen, um zu versuchen, sie weiter auszunutzen.

  • Produktion kompromittieren: Wenn du innerhalb der Pipeline bist und die endgültige Version von dort gebaut und bereitgestellt wird, könntest du den Code kompromittieren, der letztendlich in der Produktion ausgeführt wird.

Weitere relevante Informationen

Tools & CIS Benchmark

  • Chain-bench ist ein Open-Source-Tool zur Überprüfung deines Software-Lieferketten-Stacks auf Sicherheitskonformität basierend auf einem neuen CIS Software Supply Chain Benchmark. Die Überprüfung konzentriert sich auf den gesamten SDLC-Prozess, wo sie Risiken von der Codezeit bis zur Bereitstellungszeit aufdecken kann.

Top 10 CI/CD Sicherheitsrisiken

Überprüfe diesen interessanten Artikel über die Top 10 CI/CD-Risiken laut Cider: https://www.cidersecurity.io/top-10-cicd-security-risks/

Labs

Automatische Tools

  • Checkov: Checkov ist ein statisches Code-Analyse-Tool für Infrastruktur als Code.

Referenzen

Unterstütze HackTricks

Last updated