Skip to main content

In this article

Python-Poetry-Paketmanager und Sicherheitsintegration mit einem Software-Composition-Analysis-Tool

Artikel von
Headshot of Abhay Bhargav

Abhay Bhargav

Python Poetry

13. November 2020

0 Min. Lesezeit

Ich war schon immer überzeugt, dass Paketmanager die ultimative Waffe im Kampf gegen anfällige Abhängigkeiten sein können. Wenn Paketmanager zum Scannen nach anfälligen Abhängigkeiten eingesetzt werden können, wären Entwickler in der Lage, Schwachstellen in ihren Abhängigkeiten einfacher und schneller zu erkennen und zu beheben, anstatt zuzulassen, dass sich die Schwachstelle in den Build-Prozess einschleicht.

Damit das funktioniert, muss die Lösung jedoch:

  1. einfach sein – sehr leicht zu bedienen

  2. integriert sein – als Teil des Developer-Workflows und mit dem jeweiligen Paketmanager funktionieren

Ich habe vor Kurzem angefangen, das Python-Paketverwaltungssystem Poetry zu verwenden. Mir gefällt sehr, wie es organisiert ist und wie es einige seiner erklärten Ziele umsetzt – daher hatte ich auf eine Sicherheits-Scanning-Funktion gehofft, die sich integrieren lässt.

Deshalb habe ich mich gefreut zu hören, dass Snyk kürzlich eine neue Funktion zur Unterstützung des Poetry-Paketmanagers und der poetry lock syntax eingeführt hat. Um mir genauer anzusehen, wie das funktioniert, habe ich mich bei meinem neu erstellten Snyk-Testkonto angemeldet und ein neues Projekt mit einigen absichtlich anfälligen Abhängigkeiten angelegt.

DevSecOps with Poetry and Source Composition Analysis

Ich habe den Befehl eingegeben, um ein neues Projekt namens Poetry snyk zu erstellen. Dadurch wurden ein Verzeichnis namens „poetry snyk“ und ein Paket namens poetry_snyk angelegt – im Grunde Boilerplate-Code zusammen mit einem TOML-Paket.

Wenn ich also zu poetry_snyk gehe und tree, ausführe, sehe ich eine Readme-Datei mit dem Namen des Root-Pakets poetry_snyk. Die TOML-Datei ist der Deskriptor für Poetry und enthält außerdem Boilerplate-Tests – mehr oder weniger einen von ihm geschriebenen Pytest.

Terminal mit einem Python-Poetry-Projekt namens poetry-snyk und seiner Verzeichnisstruktur mit Quelldateien, Tests und README.

Wenn Sie sich das TOML-Projekt ansehen, verwenden wir Python 3.7(zugegeben eine etwas ältere Python-Version, aber dennoch die lokale Python-Version, die ich aus Gründen der Abhängigkeiten verwende). Außerdem verwenden wir eine Test-Entwicklungsabhängigkeit namens pi test – in diesem Fall die pi test 5.2 version (3.7 ist der pi-Core für Python, für den es ebenfalls einen Build gibt, den ich aber nicht verwende).

Sie sollten wissen, dass bei Poetry die TOML-Datei die zuvor erforderlichen Dateien requirements.txt und setup.py ersetzt. Mit Poetry können Sie also nicht nur Abhängigkeiten einrichten und nachverfolgen, sondern auch Software erstellen und auf dem Python cheese shop veröffentlichen. Es ist ziemlich interessant, dass eine einzige TOML-Datei die gesamten Dateien setup.py und requirements.txt ersetzen kann.

Visual Studio Code mit einer angezeigten pyproject.toml-Datei für ein Python-Paket namens poetry-snyk mit Poetry-Abhängigkeiten und Build-Einstellungen.

Was mir an Poetry im Vergleich zu den früheren Paketmanagern gefällt: Sie können es als integrierte Lösung statt als Flickwerk verwenden.

Viele der früheren Paketmanager, mit denen ich gearbeitet habe – sogar Pipenv – –, wirkten unvollständig, da sie auf der Codebasis des Pip-Paketmanagers aufbauten und eher als Wrapper dienten. Ich finde, Poetry geht einen Schritt weiter, weil es das Problem neu betrachtet und im Grunde das Beste aus npm mit seinem Deskriptor und der Lock-Datei einerseits mit dem Cargo-Paketverwaltungssystem von Rust verbindet. Wenn Sie sich den Cargo-Paketmanager für Rust ansehen, erhalten Sie sofort Dokumentation und Tests. Ich denke, Poetry versucht, diese beiden Dinge zu kombinieren und Ihnen diesen Ansatz zu bieten.

Wir haben nun ein neues Poetry-Projekt namens poetry_snyk erstellt und eingerichtet, müssen aber noch einige Bibliotheken installieren, damit es einsatzbereit ist. Da ich es mit Snyk verwende, möchte ich es mit unsicheren Bibliotheken testen – typischerweise mit solchen, die bereits bekannt sind –, um zu sehen, ob Snyk sie beim Scannen erkennt. Snyk benötigt zwei Dateien. Fügen wir unserem Projekt also mit dem folgenden Code einige Abhängigkeiten hinzu: 

Visual Studio Code zeigt die pyproject.toml-Datei eines Poetry-Projekts und den Terminalbefehl `poetry add python-docx==0.8.3`.

Dies ist ein docx project python.xProjekt, mit dem Sie DOCX-Dateien parsen und erstellen können. Es ist anfällig für eine Schwachstelle durch externe XML-Entitäten. Das ist eine ziemlich schwerwiegende Schwachstelle, die ich in meinen Schulungen schon mehrmals demonstriert habe.

Wenn Sie ein manipuliertes Word-Dokument mit einer XML-Entitätsvariable laden, die beispielsweise auf /etc/passwd gesetzt ist, löst die DOCX-Bibliothek diese Entität auf. Das führt zu einer lokalen Dateieinbindung und kann sogar mit weiteren Schwachstellen zu einem Exploit mit Remote Code Execution verkettet werden. Ich installiere das Paket jetzt. Dabei werden die Abhängigkeiten und verschachtelten Abhängigkeiten aufgelöst. Außerdem wird die TOML-Datei aktualisiert und eine Datei poetry.lock hinzugefügt. Die Datei poetry.lock enthält alle verschachtelten Abhängigkeiten dieser Abhängigkeit der obersten Ebene.

Dunkler Code-Editor mit einer poetry.lock-Datei, die Paketdefinitionen für atomicwrites und attrs sowie Entwicklungsabhängigkeiten zeigt.

Sie sehen, dass alle benötigten verschachtelten Abhängigkeiten aufgeführt sind. Denn alle Scan-Tools, insbesondere Snyk und viele andere Quellcode- oder Paket-Analyse-Tools, benötigen diese Angaben, um die verschachtelten Abhängigkeiten zu analysieren.

Neben den verschachtelten Abhängigkeiten werden auch deren verwendete Versionen und Hash-Werte angegeben, damit sie korrekt zugeordnet werden. Das war eine große Lücke im Python-Ökosystem, denn der Pip-Abhängigkeitsmanager, der standardmäßige Python-Abhängigkeitsmanager, stellte diese Angaben nicht vollständig bereit – er listete sie lediglich auf, ohne die Versionen exakt festzulegen. Daher verwaltete er die Unterabhängigkeiten nicht besonders gut.

Nehmen wir an, ich installiere mit Poetry ein weiteres Paket. Ich installiere ein weiteres anfälliges Python-Paket, in diesem Fall pyyaml. Ich verwende Version 3.13, die anfällig für eine unsichere Deserialisierung ist. Wird diese Schwachstelle ausgenutzt, kann der Angreifer Remote Code Execution in der Zielanwendungsumgebung ausführen. Ich installiere das Paket jetzt. Sie werden sehen, dass dadurch sowohl meine TOML-Datei als auch die Lock-Datei aktualisiert werden.

Visual Studio Code-Terminal, in dem beim Installieren des PyYAML-Pakets der Befehl `poetry add pyyaml==3.13` ausgeführt wird.
Terminal mit dem Befehl „poetry add pyyaml==3.13“ und der Ausgabe zur Paketinstallation; darüber sind PyYAML-Datei-Hashes zu sehen

Überwachen wir das Ganze nun mit Snyk, indem wir den folgenden Code eingeben:

Terminal mit „poetry-snyk snyk monitor“ und einer Analyse der Poetry-Abhängigkeiten für pyproject.toml.
Terminal mit der Ausgabe zur Installation von Poetry-Abhängigkeiten und einem rot umrahmten Snyk-Snapshot-Link.

Anscheinend wurden alle meine Abhängigkeiten analysiert. Das ist mein Snyk-Projekt beziehungsweise meine Snyk-Organisation, die mit einer Liste all meiner Projekte erstellt wurde. Sie sehen, dass ich dieses Projekt angelegt habe.

Dashboard mit einem Projekt namens poetry-snkyproject.com, aktuellen Zahlen zum Sicherheitsstatus und einer Schaltfläche zum Hinzufügen eines Projekts
Dashboard für das Projekt poetry-snyk:project.toml mit Details zum Projekt, zur Quelle, zum Host, zur Laufzeit und zu Monitoring-Informationen

Wie Sie sehen, wurden Probleme erkannt, und alle weisen einen hohen Schweregrad auf: die unsichere Deserialisierung in pyyaml, dieselbe Remote-Code-Execution-Schwachstelle in pyyaml, ein bekannter und schwerwiegender Exploit, sowie die Injektionen externer XML-Entitäten in python-docx. Dank der umfassenden Datenbank und der einfachen Integration konnte Snyk alle Schwachstellen in den Abhängigkeiten dieses Projekts erkennen!

Snyk-Schwachstellenbericht mit einer hochgradigen Schwachstelle zur beliebigen Codeausführung in PyYAML und Angaben zur Behebung
Snyk-Schwachstellenbericht zu einer XML External Entity (XXE)-Injection mit hohem Schweregrad im Paket python-docx, einschließlich Details zur Behebung.

Erste Schritte

Um diese Integration zu nutzen, müssen Sie lediglich Ihr Poetry-Projekt installieren. Snyk kann es dann nachverfolgen und sendet außerdem E-Mail-Benachrichtigungen zu diesen Abhängigkeiten – wirklich praktisch!

 Ich konnte schnell ein Poetry-Projekt einrichten, es mit Snyk auf Sicherheitsprobleme scannen und einen ausführlichen Bericht zu den möglichen Folgen erhalten.

Beachten Sie, dass für die Integration beide Dateien verfügbar sein müssen: die Lock-Datei und die TOML-Datei.

Visual Studio Code zeigt ein Poetry-Projekt mit den Dateien poetry.lock und pyproject.toml. Im Terminal werden Abhängigkeiten aktualisiert und Pakete installiert.

Weiterlesen

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSec: Sicherheit, die mit der KI-Entwicklung Schritt hält

KI-gestützte Entwicklung ist schneller als herkömmliche Sicherheitsabläufe. Snyks Agentic AppSec setzt Sicherheitsagenten ein, um Schwachstellen kontinuierlich zu finden, zu beheben und zu überprüfen – während Menschen die Maßstäbe festlegen.

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

feature insights context
Blog

Ist Prävention im Grunde ein gelöstes Problem?

Die Prävention in von Agenten generiertem Code ist architektonisch gelöst – die Herausforderung besteht jedoch weiterhin darin, Kontrollen zu wählen, die die Sicherheit schützen, ohne die Entwicklung zu verlangsamen.