Eigener Code

Angriffe auf die Lieferkette gehen nicht nur von Abhängigkeiten aus, auch euer eigener Code kann Angriffspunkte liefern. Ein fest im Quellcode hinterlegtes PyPI-Token liefert, sobald es in ein öffentliches Repository hochgeladen wurde, alles, was für einem Angriff benötigt wird und euer Konto zu kompromittieren und bösartige Pakete unter eurem Namen zu veröffentlichen. Abgesehen von Secrets verbergen sich häufige Sicherheitsfehler in alltäglichen Codemustern, die bei einem Code-Review zunächst unbedenklich erscheinen und von Menschen übersehen werden können. Diese mit einem Linter aufzuspüren, ist die erste Verteidigungsstufe.

Erkennt Sicherheitslücken mit Ruff

Ruff ist ein schneller Python-Linter, der umfassende Sicherheitsregeln von Bandit enthält:

$ uvx ruff check --select S .

Siehe auch

Weitere Informationen findet ihr in der Dokumentation zu den Ruff-Sicherheitsregeln.

Für zukünftige Checks könnt ihr ruff ihn in der pyproject.toml-Datei konfigurieren:

[tool.ruff]
lint.select = ["S"]

Die Sicherheitsregeln ["S"] mit den Bandit-Prüfungen.spüren fest codierte Geheimnisse, schwache Verschlüsselung und unsichere Deserialisierung auf. Dabei läuft Ruff in weniger als einer Sekunde, sodass ihr es während der Eingabe in eurer IDE und vor jedem Commit ausführen könnt. Alle drei oben genannten Schwachstellen werden erkannt und noch viel mehr, u. a.:

Regel

Beschreibung

S105

fest codierte Geheimnisse

S301

Pickle und andere unsichere Deserialisierung

S307

Verwendung von eval() mit nicht vertrauenswürdigen Eingaben

S113

fehlende Zeitüberschreitungen

S324

schwache Kryptografie wie z. B. MD5-Kollisionen

S608

SQL-Injection über String-Formatierung

Bandit könnt ihr auch in Jupyter Notebooks, IDEs und prek integrieren.

Zudem könnt ihr Pysa für Taint-Analysen verwenden.

Für GitHub-Repositories könnt ihr alternativ auch CodeQL verwenden; s.a. codeql-action.

Vertrauenswürdige Veröffentlichung

In einem früheren Abschnitt haben wir schon einige Hinweise gegeben, wie die Veröffentlichung von Python-Paketen auf PyPI abgesichert werden kann: