46 % der Python-Pakete im PyPI-Repository enthalten potenziell unsicheren Code

Eine Gruppe von Forschern der Universität Turku (Finnland) veröffentlichte die Ergebnisse einer Analyse von Paketen im PyPI-Repository auf die Verwendung potenziell gefährlicher Konstrukte, die zu Schwachstellen führen könnten. Bei der Analyse von 197 Paketen wurden 749 potenzielle Sicherheitsprobleme identifiziert. 46 % der Pakete weisen mindestens ein solches Problem auf. Zu den häufigsten Problemen gehören Mängel im Zusammenhang mit der Ausnahmebehandlung und der Verwendung von Funktionen, die eine Codesubstitution ermöglichen.

Von den 749 identifizierten Problemen wurden 442 (41 %) als geringfügig, 227 (30 %) als mittelschwere Probleme und 80 (11 %) als gefährlich eingestuft. Einige Pakete stechen aus der Masse hervor und enthalten Tausende von Problemen: Beispielsweise identifizierte das PyGGI-Paket 2589 Probleme, die hauptsächlich mit der Verwendung des „try-except-pass“-Konstrukts zusammenhingen, und das appengine-sdk-Paket fand 2356 Probleme. Eine große Anzahl von Problemen treten auch in den Paketen genie.libs.ops, pbcore und genie.libs.parser auf.

Es ist zu beachten, dass die Ergebnisse auf der Grundlage einer automatisierten statischen Analyse gewonnen wurden, die den Anwendungskontext bestimmter Strukturen nicht berücksichtigt. Der Entwickler des Bandit-Toolkits, das zum Scannen des Codes verwendet wurde, äußerte die Meinung, dass die Scanergebnisse aufgrund der relativ hohen Anzahl falsch positiver Ergebnisse ohne zusätzliche manuelle Überprüfung jedes Problems nicht direkt als Schwachstellen angesehen werden können.

Beispielsweise betrachtet der Analysator die Verwendung unzuverlässiger Zufallszahlengeneratoren und Hashing-Algorithmen wie MD5 als Sicherheitsproblem, während solche Algorithmen im Code für Zwecke verwendet werden können, die die Sicherheit nicht beeinträchtigen. Der Analysator betrachtet auch jede Verarbeitung externer Daten in unsicheren Funktionen wie pickle, yaml.load, subprocess und eval als Problem, diese Verwendung stellt jedoch nicht unbedingt eine Sicherheitslücke dar und tatsächlich kann die Verwendung dieser Funktionen ohne Sicherheitsrisiko implementiert werden .

Zu den in der Studie verwendeten Tests gehören:

  • Verwendung potenziell unsicherer Funktionen exec, mktemp, eval, mark_safe usw.
  • Unsichere Einstellung der Zugriffsrechte für Dateien.
  • Anschließen eines Netzwerk-Sockets an alle Netzwerkschnittstellen.
  • Verwendung von Passwörtern und Schlüsseln, die im Code genau festgelegt sind.
  • Verwendung eines vordefinierten temporären Verzeichnisses.
  • Verwendung von Pass und Continue in Ausnahmehandlern im Catch-All-Stil;
  • Starten von Webanwendungen basierend auf dem Flask-Webframework mit aktiviertem Debugging-Modus.
  • Verwendung unsicherer Datendeserialisierungsmethoden.
  • Verwendet MD2-, MD4-, MD5- und SHA1-Hash-Funktionen.
  • Verwendung unsicherer DES-Chiffren und Verschlüsselungsmodi.
  • Verwendung einer unsicheren HTTPSConnection-Implementierung in einigen Python-Versionen.
  • Angeben des Schemas „file://“ in urlopen.
  • Verwendung von Pseudozufallszahlengeneratoren bei der Durchführung kryptografischer Aufgaben.
  • Verwendung des Telnet-Protokolls.
  • Verwendung unsicherer XML-Parser.

Darüber hinaus kann festgestellt werden, dass im PyPI-Verzeichnis 8 Schadpakete entdeckt wurden. Vor der Entfernung wurden problematische Pakete mehr als 30 Mal heruntergeladen. Um bösartige Aktivitäten zu verbergen und Warnungen einfacher statischer Analysatoren in Paketen zu umgehen, wurden Codeblöcke mit Base64 kodiert und nach der Dekodierung mit einem Eval-Aufruf ausgeführt.

Die Pakete nolesse, genesisbot, are, hurt, noblesse2 und noblessev2 enthalten Code zum Abfangen von Kreditkartennummern und Passwörtern, die in Chrome- und Edge-Browsern gespeichert sind, sowie zum Übertragen von Konto-Tokens aus der Discord-Anwendung und zum Senden von Systemdaten, einschließlich Screenshots von Bildschirminhalten. Die Pakete pytagora und pytagora2 beinhalteten die Möglichkeit, ausführbaren Code von Drittanbietern zu laden und auszuführen.

Source: opennet.ru

Kommentar hinzufügen