Ein Leitfaden, der Ihnen hilft, sich der Risiken bewusst zu sein, denen Sie ausgesetzt sind, und einige Tipps, wie Sie sich vor diesen Risiken schützen können.
Vor kurzem wurde eine neue Art von Cyber-Bedrohung bekannt: Angriffe auf die Software-Lieferkette. Sie sind zwar selten, haben aber massive Auswirkungen und der Schutz vor ihnen ist ein wachsendes Anliegen. Aufgrund der Vielzahl von Anwendungsfällen gibt es keine einheitliche Regel, die Sie auf Ihre Python-Projekte anwenden können, um sicher zu sein, und wie immer hängt es von Ihrem Kontext ab.
Einführung
In traditionellen Industrien ist eine Lieferkette alles, was es einem Unternehmen ermöglicht, ein Produkt an den Kunden zu liefern. Wenn Sie zum Beispiel ein Croissant in der Bäckerei kaufen, sind alle Zutaten, die Verpackung und der Transport Teil der Lieferkette.
Im Softwarebereich ist eine Lieferkette alles, was sich auf Ihre Software auswirkt, bevor sie in Produktion geht. Sie umfasst alles von der Entwicklungsphase bis zum Veröffentlichungsprozess, einschließlich des von Ihnen geschriebenen Codes, Ihrer Abhängigkeiten, Ihrer Build-Umgebung, Ihrer IDE, Ihrer Image-Registry - jede Komponente, mit der Ihre Software zu irgendeinem Zeitpunkt interagiert!

Der Begriff “Lieferkette” ist in letzter Zeit aufgrund von Cyberangriffen mit weitreichenden Auswirkungen in den Vordergrund gerückt. Unter allen Angriffen ist Solarwinds vielleicht der bekannteste. In der Tat waren die US-Regierung, große Technologieunternehmen wie Microsoft und Intel, aber auch Krankenhäuser, Energieversorger und Finanzinstitute davon betroffen.
Ironischerweise ist die Grundursache die Infektion von Solarwinds Orion, einem Netzwerksicherheitsmonitor. Das Build-System war kompromittiert worden und alle neuen Versionen zwischen März und Juni 2020 waren mit Malware infiziert. Das Ergebnis ist, dass alle Kunden, die ihre Software in diesem Zeitraum aktualisiert haben, infiziert wurden.
Auch wenn der Solarwinds-Angriff von den Medien weitgehend aufgegriffen wurde, gibt es Dutzende ähnlicher Angriffe, von denen wir noch nie gehört haben. Glücklicherweise führt die Cloud Native Computing Foundation eine Übersicht über alle diese Angriffe in einem öffentliches Depot. Es mag Sie überraschen, wie sehr sich diese Angriffe in den letzten Jahren beschleunigt haben.
Es ist nicht möglich, alles, was mit der Sicherheit der Lieferkette zu tun hat, in einem einzigen Blog-Beitrag zu behandeln. Daher werden wir uns in diesem Artikel vor allem auf Projekte konzentrieren, die Python als Hauptsprache verwenden.
Wie Sie Ihre Abhängigkeiten in Python verwalten
Obwohl Python eine “Batterien enthalten”-Philosophie verfolgt, benötigen Sie oft externe Bibliotheken, die Sie aus dem PyPI, dem offiziellen Paketindex, herunterladen können, und genau an diesem Punkt müssen Sie sehr vorsichtig sein.
Das Python-Ökosystem wurde bereits ins Visier genommen, insbesondere durch den Einsatz von zwei Techniken:
Die erste Technik betrifft einen Befehl, den jeder Python-Entwickler im Laufe seiner Karriere mindestens einmal ausgeführt hat:
Pip-Installation Hacker veröffentlichen Pakete mit fast demselben Namen wie bestehende Pakete in der Hoffnung, dass Sie einen Tippfehler machen und ihr Paket anstelle des offiziellen Pakets installieren. Zum Beispiel ein Paket namens python3-dateutil anstelle des offiziellen dateutil wurde kürzlich entdeckt.
Die Python-Gemeinschaft ist hart arbeitend um das Risiko zu mindern, aber das Risiko ist immer noch hoch.
Die zweite Technik, die Abhängigkeitsverwirrung, ist anspruchsvoller als die erste und hat damit zu tun, wie pip arbeitet unter der Haube.
Mit diesem Befehl setzen Sie sich dem Risiko aus:
pip install --extra-index-url Wenn Sie diesen Befehl eingeben, geschieht Folgendes:
Lassen Sie uns ein Beispiel nehmen:
In diesem Beispiel wird das Paket des böswilligen Hackers auf dem Rechner installiert. Die höhere Versionsnummer befindet sich nämlich auf dem öffentlichen Paketindex.
Sie haben vielleicht verstanden, was bei diesem Prozess schief gehen kann. Jemand mit schlechten Absichten kann Pakete in einem öffentlichen Repository veröffentlichen, die die gleichen Namen haben wie die in internen Paketindizes gehosteten und sie mit einer lächerlich hohen Versionsnummer versehen. Außerdem ist es gar nicht so schwer, relevante Paketnamen zu finden, denn von diesem Sicherheitsforscher demonstriert.
Dieser Befehl könnte als “insecure by design” bezeichnet werden. Dieser Angriff nutzt eine Funktion des Python-Paketmanagers aus und nur wenige Entwickler sind sich dieses Verhaltens bewusst.
Wie Sie sich vor diesen Angriffen auf die Lieferkette schützen können
Um sich gegen Angriffe durch Tippfehler zu schützen, können Sie eine Lock-Datei. A gute Sperrdatei hat die folgenden Eigenschaften:
Die gute Nachricht ist, dass es ein Paket gibt, dessen Zweck es ist, eine Sperrdatei für Sie zu erstellen: pip-tools. Mit nur wenigen Befehlen können Sie eine Sperrdatei mit allen Attributen erstellen, die wir zuvor beschrieben haben.
$ python3 -m venv my-env # Erstellen einer neuen virtuellen Umgebung $ source my-env/bin/activate # aktivieren Sie es $ pip install pip-tools==6.3.0 # installieren Sie das Paket, mit dem Sie Ihre Abhängigkeiten richtig verwalten können $ echo “sacremoses==0.0.46” >> requirements.in # Fügen Sie das Paket Ihrer Ihrer Wahl in requirements.in $ pip-compile --generate-hashes # kompiliert requirements.txt mit Hashes basierend auf dem, was Sie in requirements.in eingegeben haben
Ihre Datei requirements.txt sollte wie folgt aussehen:
Jetzt, da Sie diese Datei haben, die alle Ihre Abhängigkeiten mit den zugehörigen Versionen und Hashes enthält, können Sie bei der nächsten Bereitstellung den folgenden Befehl ausführen:
pip install --require-hashes -r requirements.txtSo sind Sie sicher, dass die Pakete, die Sie in der Produktion verwenden, nicht verändert wurden. Angenommen, Sie haben beim Schreiben Ihrer Anforderungen.in Datei 👀, können Sie auch sicher sein, dass Sie das Paket herunterladen, das Sie wirklich wollen, da alles automatisiert ist. Kein Risiko eines Tippfehlers!
Diese bewährte Methode ist gut, um sich gegen Angriffe durch Tippfehler zu schützen, aber was ist mit der Verwirrung von Abhängigkeiten?
Wenn Sie sich die pip Dokumentation sehen Sie, dass es zwei Optionen gibt, mit denen Sie Pakete aus einem internen Repository herunterladen können:
In der Dokumentation steht:
Wie Sie sehen können, gibt es einen kleinen Unterschied zwischen den beiden und er ist auf den ersten Blick nicht offensichtlich. Der Unterschied besteht darin, dass Sie bei der Angabe der --index-url Option, pip würde nur Pakete aus dem Repository mit der von Ihnen angegebenen URL beziehen und nicht aus öffentlichen Repositorys. Wenn Sie also das oben beschriebene Verhalten vermeiden möchten, verwenden Sie --index-url eher als --extra-index-url und Sie werden sicher sein!
Um schließlich die neuesten Sicherheitslücken zu verfolgen, die in Ihren Abhängigkeiten entdeckt werden, können Sie regelmäßig die GitHub-Beratung database oder besser, nutzen Sie Tools wie dependabot das automatisch eine Pull-Anfrage an Ihr Repository sendet, um eine Abhängigkeit zu aktualisieren, in der kürzlich eine kritische Sicherheitslücke entdeckt wurde.
Zusammenfassung
In diesem Artikel haben wir das Konzept der Lieferkette für die Softwarewelt vorgestellt. Wir haben speziell untersucht, wie dieses Konzept auf das Python-Ökosystem anwendbar ist. Typo-Squatting und Abhängigkeitsverwirrung wurden erklärt und Lösungen vorgeschlagen, um das Risiko einer Gefährdung zu mindern.
Diese kurze Einführung in die Sicherheit der Lieferkette hat nur die Spitze des Eisbergs abgedeckt, wir hatten keine Gelegenheit, darüber zu sprechen, wie Systeme aufbauen oder sogar Ihr IDEs kompromittiert werden kann, aber das ist ein Thema für einen anderen Artikel!
Danke, dass Sie so weit gelesen haben! Ich würde mich freuen, Ihr Feedback zu hören. Wenn Ihnen die Lektüre gefallen hat, schauen Sie doch mal bei unserem Offene Stellen bei Artefact 🙂

BLOG












