Code-Injection in Python: Beispiele und Prävention
Lucien Chemaly
6. Dezember 2023
0 Min. LesezeitDa Software in unserem beruflichen und privaten Leben immer wichtiger wird, steigt auch der Bedarf, Informationen und Systeme vor böswilligen Angriffen zu schützen. Eine der größten Bedrohungen, mit denen sich Python-Entwickler auseinandersetzen müssen, ist das Risiko von Code-Injection – einer ausgeklügelten und oft verheerenden Form von Cyberangriffen.
Code-Injection ist ein weit verbreitetes Problem, das Programmiersprachen und Plattformen gleichermaßen betrifft. In Python-Anwendungen kann sie jedoch besonders subtil und gefährlich auftreten.
Als eine der am häufigsten verwendeten Programmiersprachen für Webentwicklung, Datenanalyse und Automatisierung bietet Python zahlreiche Funktionen und Bibliotheken, die sowohl Segen als auch Fluch sein können. Python ermöglicht es Entwicklern, robuste und effiziente Systeme zu erstellen. Werden sichere Programmierkonventionen jedoch nicht strikt eingehalten, ergeben sich zahlreiche Möglichkeiten für Angreifer, Schwachstellen auszunutzen.
Die Herausforderung, Code-Injection in Python zu verhindern, wird durch den Aufstieg und die weite Verbreitung von Open-Source-Komponenten und -Paketen noch verstärkt. Diese leicht verfügbaren Ressourcen beschleunigen die Entwicklung, können jedoch versteckte Sicherheitslücken enthalten, die für Code-Injection ausgenutzt werden können.
In diesem Artikel erfahren Sie mehr über die Gefahren und die Bedeutung sicherer Programmierkonventionen, insbesondere im Hinblick auf Code-Injection-Schwachstellen und deren Auftreten in Python-Anwendungen. Wenn Sie die Natur von Code-Injection verstehen und bewährte Methoden für sicheres Programmieren anwenden, können Sie zu einem sichereren digitalen Ökosystem beitragen und Ihre Anwendungen vor möglichen Sicherheitsverletzungen schützen.
Was ist Code-Injection?
Code-Injection ist ein heimtückischer Angriff, bei dem bösartiger Code in ein Softwaresystem eingeschleust wird, sodass dieses unbeabsichtigte Befehle ausführt. Durch das Ausnutzen von Schwachstellen kann ein Angreifer schädlichen Code einschleusen, was schwerwiegende Folgen haben kann, etwa unbefugten Datenzugriff, Finanzbetrug oder die vollständige Übernahme des Systems.
Diese Schwachstellen entstehen häufig, wenn eine Anwendung Benutzereingaben falsch verarbeitet. Beispielsweise kann die unsichere Verwendung von Funktionen wie eval() in Python ohne angemessene Validierung zu Code-Injection führen. Gleiches gilt, wenn Code auf Grundlage von Benutzereingaben ohne ausreichende Prüfung erstellt wird, Code von Drittanbietern ohne Sicherheitsprüfung zum Einsatz kommt oder die Konfiguration von Web-Frameworks oder Datenbanken Schwachstellen aufweist.
Das Verständnis von Code-Injection ist für alle, die in der Softwareentwicklung oder Sicherheit tätig sind, unerlässlich. Sehen wir uns daher häufige Schwachstellen genauer an, denen Sie begegnen können.
Häufige Schwachstellen, die zu Code-Injection führen
Schwachstellen, die zu Code-Injection führen, sind ein erhebliches Problem in der Softwareentwicklung. Diese Schwachstellen zu verstehen und zu beheben, ist entscheidend für die Entwicklung sicherer Systeme. In den folgenden Abschnitten erfahren Sie mehr über einige der wichtigsten Ursachen von Code-Injection und darüber, wie Sie sich davor schützen können.
Ausnutzen benutzergesteuerter Eingaben
Wenn Benutzereingaben ohne Validierung direkt verwendet werden, kann ein Angreifer Python-Code als Eingabe übermitteln, den die Anwendung dann ausführt. Sehen Sie sich dazu Folgendes an:
Um diesen Code auszunutzen, könnten Angreifer etwas wie ' OR '1'='1'; DROP TABLE users; eingeben. Das Semikolon (;) beendet die ursprüngliche Abfrage. Der nachfolgende SQL-Code wird zu einer neuen Abfrage, die möglicherweise die Tabelle users aus der Datenbank löscht.
Unsichere Verwendung von eval() und verwandten Funktionen
Funktionen wie eval() können ausgenutzt werden, wenn Benutzer beliebige Ausdrücke eingeben dürfen, zum Beispiel:
In diesem Beispiel kann ein Angreifer __import__('os').system('any arbitrary command') eingeben, um beliebige Betriebssystembefehle auszuführen. Der Angreifer könnte beispielsweise einen Befehl wie rm -rf / eingeben, der versucht, alle Dateien im Stammverzeichnis des Systems zu löschen, auf dem sich der Code befindet.
Fehlende Eingabevalidierung und -bereinigung
Ohne ordnungsgemäße Validierung kann ein Angreifer einen Pfad zu einer beliebigen Datei eingeben, die die Anwendung dann wie folgt ausliest:
Hier kann ein Angreifer einen Pfad wie /etc/passwd eingeben, um vertrauliche Systemdateien auszulesen.
Risiken im Zusammenhang mit dynamischer Code-Erstellung
Die dynamische Erstellung von Befehlszeichenfolgen ohne ordnungsgemäße Validierung kann zu Command-Injection-Schwachstellen führen. Sehen Sie sich zum Beispiel diesen Code an:
In diesem Beispiel könnte ein Angreifer eine Verzeichniszeichenfolge wie ; cat /etc/passwd eingeben, um den Inhalt der Passwortdatei des Systems aufzulisten oder – noch schlimmer – andere bösartige Befehle auszuführen. Mit dem Semikolon (;) kann der Angreifer Befehle verketten und so beliebige Befehle auf dem Hostsystem ausführen.
Unsichere Deserialisierung
Eine unsichere Deserialisierung kann auftreten, wenn nicht vertrauenswürdige Daten ohne ordnungsgemäße Validierung oder Bereinigung deserialisiert werden. Ein Angreifer kann dies ausnutzen, um beliebigen Code auszuführen. Sehen Sie sich zum Beispiel dieses Beispiel an:
Um diesen Code auszunutzen, könnte ein Angreifer ein serialisiertes Objekt erstellen, das bei der Deserialisierung beliebigen Code ausführt, etwa um eine Reverse Shell zu starten. Diese Art von Angriff kann auch in alltäglichen Anwendungen wie einem Online-Warenkorb auftreten. Stellen Sie sich vor, Sie verwenden einen solchen Warenkorb und die Anwendung speichert ihn als speziellen Code. Prüft die Anwendung beim erneuten Laden nicht gründlich, ob der Code sicher ist, kann ein Angreifer täuschenden Code senden, der wie ein Warenkorb aussieht, aber heimlich bösartige Aktionen ausführt. Führt die Anwendung diesen gefährlichen Code unbemerkt aus, öffnet das dem Angreifer Tür und Tor. Er kann Ihre Daten stehlen, die Anwendung manipulieren oder sogar die Kontrolle über das gesamte System erlangen – ein erhebliches Sicherheitsrisiko.
Code-Injection-Schwachstellen eindämmen
Schwachstellen zu verstehen, ist zwar der erste Schritt, doch es ist entscheidend, zu lernen, wie Sie sie wirksam eindämmen können. Im Folgenden finden Sie Gegenmaßnahmen für die zuvor besprochenen Schwachstellen:
Benutzergesteuerte Eingaben absichern
Vermeiden Sie es, Benutzereingaben direkt auszuführen. Falls erforderlich, verwenden Sie strenge Allowlisting-Verfahren, bei denen nur festgelegte Eingabemuster zugelassen werden:
eval() und verwandte Funktionen sicher verwenden
Verwenden Sie sicherere Alternativen wie literal_eval(), oder verzichten Sie ganz auf eval(). Ist die Verwendung unvermeidbar, müssen Sie die Eingaben bereinigen:
Eingabevalidierung und -bereinigung implementieren
Verwenden Sie reguläre Ausdrücke oder andere Validierungsmethoden, um sicherzustellen, dass nur gültige Dateinamen oder Pfade akzeptiert werden:
Bei literal_eval() würde beispielsweise die Eingabe 2 + 3 als numerischer Wert 5 ausgewertet, während eine Eingabe wie __import__('os').system('rm -rf /') einen ValueError auslösen würde, statt den Befehl auszuführen. Dadurch werden die Sicherheitsrisiken im Zusammenhang mit der Verwendung von eval() wirksam eingedämmt und Ausdrücke mit Literalen lassen sich sicherer auswerten.
Dynamische Code-Erstellung angehen
Verwenden Sie parametrisierte Abfragen oder vorbereitete Anweisungen, um SQL-Injection zu verhindern:
Sicher deserialisieren
Deserialisieren Sie nur vertrauenswürdige Daten. Wenn Sie Benutzereingaben deserialisieren müssen, verwenden Sie sicherere Formate wie JSON oder führen Sie vor der Deserialisierung eine gründliche Validierung durch:
Strenge Zugriffskontrollen durchsetzen
Die Anwendung des Prinzips der geringsten Rechte stellt sicher, dass Benutzer und Prozesse nur über die minimal erforderlichen Zugriffsrechte verfügen, um ihre Aufgaben zu erfüllen. Dadurch wird die Angriffsfläche verkleinert, da die Handlungsmöglichkeiten von Angreifern nach dem Ausnutzen einer Schwachstelle eingeschränkt werden.
Implementieren Sie strenge Zugriffskontrollen, um unbefugten Zugriff auf sensible Bereiche der Anwendung zu beschränken. Im nächsten Abschnitt erfahren Sie mehr über zusätzliche Maßnahmen, mit denen Sie die Sicherheit Ihrer Codebasis erhöhen können.
Sichere Programmierkonventionen in Python
Bisher haben wir die wirksamsten Möglichkeiten zur Eindämmung von Code-Injection-Schwachstellen besprochen. Sicheres Programmieren umfasst jedoch mehr. Dazu gehört auch, bewährte Methoden und Konventionen zu befolgen, die zur Entwicklung robuster und sicherer Anwendungen beitragen. Beim Schreiben von Python-Code sollten Sie Folgendes beachten:
Sicherheitstools für Entwickler verwenden, um Probleme zu finden und zu beheben
Snyk bietet kostenlose Python-Sicherheitstools, mit denen Sie Schwachstellen in Ihrem Anwendungscode, Ihren Open-Source-Abhängigkeiten, Containern, IaC-Konfigurationen und mehr erkennen und beheben können. Sie können Snyk in Ihre Git-Repositories, CI/CD-Workflows, Kommandozeilen-Tools und IDEs integrieren, um Schwachstellen zu erkennen und zu beheben.
Snyk erkennt beispielsweise anfällige Open-Source-Abhängigkeiten in Ihrer Anwendung und zeigt Ihnen, wie Sie diese einfach beheben können. Hier finden Sie eine Liste mit anfälligem Python-Code in pip-Paketen in der Snyk Vulnerability Database:

Wenn Sie Tools wie Snyk in Ihren Entwicklungs-Workflow integrieren, erhalten Sie eine zusätzliche Schutzebene und können einen robusteren und sichereren Prozess für die Anwendungsentwicklung schaffen. Snyk bietet informative Artikel zur Integration der Tools in Ihren Workflow:
Regelmäßige Sicherheitsscans mit Snyk bieten viele Vorteile, darunter Zugriff auf eine stets aktuelle Schwachstellendatenbank und kollaborative Sicherheitstools, die für die Zusammenarbeit im Team entwickelt wurden. Die Vorteile gehen über den reinen Schutz Ihres Codes hinaus und verbessern auch das gesamte Entwicklungserlebnis. Mit Funktionen speziell für Python und einem Fokus auf die Vermeidung von Code-Injection verändert Snyk Ihre Herangehensweise an Sicherheit beim Programmieren und ist eine wertvolle Ressource für die Entwicklung sicherer, hochwertiger Software.
Sichere Logging-Verfahren implementieren
Vermeiden Sie es, vertrauliche Benutzerdaten oder Systeminformationen zu protokollieren, die für einen Angreifer nützlich sein könnten. Achten Sie darauf, Logging-Frameworks mit Unterstützung für sichere Konfigurationen zu verwenden.
Eine sichere Programmierumgebung schaffen
Im Folgenden finden Sie weitere Strategien, mit denen Sie eine sichere Programmierumgebung schaffen können:
Regelmäßige Code-Reviews und Sicherheitsaudits: Stellen Sie sicher, dass Sicherheitsexperten den Code regelmäßig überprüfen, damit Sie Schwachstellen frühzeitig erkennen können.
Software und Bibliotheken auf dem neuesten Stand halten: Verwenden Sie stets die neuesten Versionen von Bibliotheken und Frameworks, da diese häufig Sicherheits-Patches enthalten.
Sicherheitsbewusstsein fördern: Fördern Sie eine Kultur, in der Sicherheit höchste Priorität hat, und stellen Sie sicher, dass alle Teammitglieder in sicheren Programmierverfahren geschult sind.
Fazit
In diesem Artikel haben Sie die Risiken von Code-Injection in Python kennengelernt und erfahren, warum Sie sichere Programmierregeln befolgen sollten. Code-Injection kann viele Formen annehmen. Mit dem richtigen Wissen und Tools wie Snyk können Sie diese Gefahren jedoch verringern. Warten Sie nicht, bis ein Problem Ihre Arbeit beeinträchtigt. Integrieren Sie die Sicherheitstools von Snyk in Ihren Python-Entwicklungsprozess und machen Sie Ihren Code sicherer und leistungsfähiger.
Python-Schwachstellen finden und beheben
Schützen Sie Ihre Anwendungen mit der Schwachstellensuche und den Behebungsempfehlungen von Snyk.
Keine Kreditkarte erforderlich.
Oder registrieren Sie sich mit Azure AD Docker ID Bitbucket
Mit der Nutzung von Snyk erklären Sie sich mit unseren Richtlinien einverstanden, einschließlich unserer Nutzungsbedingungen und Datenschutzerklärung.
