Mittlerweile stammen 43 % aller Datenschutzverletzungen direkt von Sicherheitslücken in Anwendungen. Und besonders die Programmiersprache Python erfreut sich bei Entwicklern immer größerer Beliebtheit. Deshalb hat Snyk einen genaueren Blick auf die Sicherheitsprobleme geworfen, die im Zusammenhang mit dieser Programmiersprache auftreten.
81 % der beliebtesten Python-Pakete befinden sich zwar in einem sicheren Zustand – gleichzeitig hängen aber rund 20 % der von Snyk Code identifizierten Sicherheitslücken mit Python-Projekten zusammen.
Die Programmiersprache Python erfreut sich wachsender Beliebtheit, was auch auf das Ökosystem von Softwarebibliotheken für maschinelles Lernen wie NumPy, Pandas, TensorFlow von Google und PyTorch von Facebook zurückzuführen ist. Laut dem TIOBE Index ist Python inzwischen die beliebteste Programmiersprache weltweit und hat sogar Java und C den Rang abgelaufen.
Snyk, ein Anbieter von Security-Lösungen für Entwickler, untersuchte die Risiken und Schwachstellen von Python und fand heraus, dass im Durchschnitt jeden Monat sechzig neue Python-Sicherheitslücken zur Snyk-Datenbank hinzugefügt werden. Fast ein Drittel davon wird als kritisch oder von hohem Schweregrad eingestuft: 5 % sind kritische Schwachstellen, 27 % sind mit einem hohen Schweregrad bewertet, 56 % mit mittlerem und 12 % mit niedrigem Schweregrad. Glücklicherweise können die meisten gefundenen Schwachstellen in den Projekten schnell behoben werden. Etwa 87 % der Schwachstellen lassen sich durch den Wechsel zu einem aktualisierten Paket beheben. Dementsprechend können auch die meisten Container-Schwachstellen durch den Einsatz von kompakteren Paketen gelöst werden.
In vielen Projekten sind diese Korrekturmaßnahmen notwendig. Bei mehr als 60 % der Python-Projekte finden sich Code-bezogene Elemente, die auch in der diesjährigen OWASP Top 10 gelistet sind – eine aktuelle Auflistung der häufigsten Sicherheitsrisiken für Webanwendungen. Diese können dazu führen, dass Angreifer clientseitige Skripte in Websites (XSS) einschleusen. Von Benutzern eingegebene Zeichenfolgen, die für die Erstellung von SQL-Abfragen gedacht sind, können etwa für SQL-Injection-Angriffe genutzt werden. Und deaktivierte Zertifikatsüberprüfungen ermöglichen Man-in-the-Middle-Angriffe. Da
Größere Angriffsfläche durch Abhängigkeiten
Eine weitere Herausforderung ist der Inhalt eines typischen Python-Repositorys. Mittlerweile enthalten diese viel mehr als nur den vom Entwickler geschriebenen Python-Code. Hinzu kommen oft auch Open-Source-Pakete und Container-Images sowie Konfigurationsdateien, die die notwendige Infrastruktur bereitstellen. Dieses wachsende Volumen bedeutet, dass auch die Angriffsfläche bei Projekten immer größer wird – und das stellt ein Sicherheitsrisiko dar.
Snyk fand heraus, dass ein Python-Projekt im Durchschnitt 35 Abhängigkeiten aufweist. 17 davon sind direkte, 18 indirekte Abhängigkeiten. Bei 47 % der Projekte verursachen die Abhängigkeiten Schwachstellen. Ein durchschnittlich gefährdetes Projekt weist 33 bekannte Schwachstellen auf, von welchen ein Zehntel kritische Schwachstellen sind. Weitere 26 % sind von hohem Schweregrad, 26 % von mittlerem Schweregrad und 28 % von niedrigem Schweregrad. Daniel Berman fügt hinzu: „Je komplexer Anwendungen werden, desto schwieriger wird auch die Absicherung. Hacker haben deshalb viele Möglichkeiten, Python-Anwendungen anzugreifen. Sie können über bekannte Schwachstellen eindringen, die über direkte oder indirekte Abhängigkeiten entstehen, über Sicherheitslücken im eigenen Code der Anwendung oder über Schwachstellen in Containern.“
Basierend auf seiner Analyse der größten Sicherheitslücken hat Snyk sechs Ratschläge für Python-Entwickler entwickelt:
- Moderne statische Code-Analyse: Prüfprogramme wie Pylint oder Scanner wie Bandit sind hier ein guter Anfang. Dateiübergreifende Probleme manuell zu finden ist jedoch nahezu unmöglich. Diese treten etwa auf, wenn die Anwendungsausführung zwischen verschiedenen Quelldateien verläuft.
- Datenbereinigung: Eingehende Daten aus externen Quellen, einschließlich Datenbanken, sollten direkt am Eintrittspunkt in die Anwendung bereinigt werden.
- ORM: Moderne ORM-Tools (Object Relational Mapping) können Datenbankinteraktionen abstrahieren und SQL Injection verhindern. Bei Paketen wie Django oder Flask sollten umfassend getestete Bibliotheken wie Django ORM oder SQLAlchemy verwendet werden
- Unicode: Wenn möglich sollten alle Strings auf eine einzige Unicode-Kodierung standardisiert werden – Snyk empfiehlt UTF-8. Besondere Vorsicht ist bei der Konvertierung von Unicode-Strings in ASCII nötig.
- APIs schließen: Netzwerkverbindungen wie etwa externe Lese- und Schreibzugriffe sollten immer geschlossen werden. Dadurch wird sichergestellt, dass Daten im Zwischenspeicher und der Status korrekt gespeichert werden und dass die entsprechenden Datenstrukturen im System freigegeben werden.
- Sensible Daten schützen: Dies ist nicht Python-spezifisch, aber es kommt häufig vor, dass geheime Daten wie Benutzernamen, Passwörter, API-Zugriffstoken und auch Dateipfade oder Dateinamen in den Quellcode gelangen. Diese sollten stattdessen in separaten Dateien, oder – noch besser – in geheimen Speichern wie HashiCorp Vault, AWS Key Management Service, etc. abgelegt werden.
www.snyk.io