Python-Poetry-Paketmanager und Sicherheitsintegration mit einem Software-Composition-Analysis-Tool
Abhay Bhargav
13. November 2020
0 Min. LesezeitIch 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:
einfach sein – sehr leicht zu bedienen
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.

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.

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.

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:

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.

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.


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


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.


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!


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.



