Schlechte Python-Pakete zähmen: Python-Malware-Detektoren mit einem Benchmark-Datensatz bewerten
Ly D. Vu, Gastwissenschaftler bei Chainguard und Dozent und Forscher an der FPT University in Vietnam, trug zu diesem Beitrag bei.
Die Zahl der bösartigen Open-Source-Softwarepakete, die in beliebten Registern gefunden werden, wächst. Nach einer Analyse des Atlantic Council sind bösartige Open-Source-Pakete von einem fast nicht existierenden Phänomen vor einem Jahrzehnt zu einem fast monatlichen Ereignis gewachsen. Eine Möglichkeit, diesen Angriffen entgegenzuwirken, besteht darin, sie zu erkennen und an der Quelle zu beheben. Zum Beispiel hat der Python Package Index (PyPI), das Äquivalent des Python-Programmierers zum App Store, mit einer Malware-Erkennungsfunktion experimentiert, die neue Pakete und neue Paketversionen analysiert und auf potenziell schädliche Pakete überwacht, um PyPI-Benutzer zu schützen.
Leider ist die Aufgabe, bösartige Open-Source-Software im Kontext einer Community-Registry zu erkennen, schwierig. Registry-Betreuer und Mitwirkende haben nur begrenzte Zeit (oft auf freiwilliger Basis), um Sicherheitsurteile zu überprüfen, ein Problem, das durch hohe Falsch-Positiv-Raten und die große Anzahl von Paketen in vielen Registern noch verschlimmert wird. Auch die akademische Forschung zur Erkennung von Malware übersieht meist die besonderen Anforderungen des Scannens ganzer Open-Source-Software-Register (mit einigen Ausnahmen) und bietet relativ wenig Hilfe. Schließlich haben Software-Sicherheitsunternehmen zugegebenermaßen Fortschritte bei dieser Aufgabe gemacht und Repository-Administratoren unterstützt, obwohl sogar ihre Bemühungen potenziell effektiver sein könnten, wenn es gemeinsame Datensätze und Methoden für die OSS-Malware-Erkennung gäbe.
Um Parteien zu helfen, die daran interessiert sind, bessere Ansätze zum Scannen von Paketregistern auf bösartige OSS zu entwickeln, haben wir ein Projekt zum Aufbau eines Benchmark-Python-Malware-Datensatzes konzipiert, um die aktuelle Leistung der PyPI-Malware-Checks und alternative Ansätze zu bewerten. Dieser Datensatz - der sowohl Malware- als auch gutartige Python-Pakete enthält - ermöglicht es interessierten Parteien, die False-Positive-Rate und die True-Positive-Rate eines bestimmten Ansatzes empirisch zu messen.
Unter Verwendung dieses Open-Source-Benchmark-Datensatzes zur Bewertung der aktuellen PyPI-Prüfungen ergab unsere Analyse:
Hohe Falsch-Positiv-Raten: Mehr als ein Drittel der 1.430 beliebten Pakete lösten einen Alarm aus. Fast 15 Prozent von 986 zufälligen Paketen lösten eine Warnung aus. Unter Verwendung konservativer Annahmen über die Verbreitung von Malware wird diese Rate Tausende von False Positives pro Woche generieren.
Mäßig hohe True-Positive-Raten: Fast 60 Prozent der bösartigen Pakete lösten eine Warnung aus.
Diese Ergebnisse bestätigen, was Python-Malware-Experten intuitiv herausgefunden haben: Der derzeitige Ansatz hat, obwohl er einen Großteil der Malware vernetzt, inakzeptabel hohe False-Positive-Raten und überflutet einen potenziellen Benutzer mit falschen Leads. Wir hoffen, dass dieser Benchmark-Datensatz die PyPI-Malware-Erkennung beschleunigt und Sicherheitsforschern hilft, effizientere Python-Malware-Erkennungstechniken zu entwickeln. Letztendlich hoffen wir, dass diese besseren Ansätze die Anzahl der bösartigen Pakete in PyPI reduzieren und die durchschnittliche Zeit bis zur Erkennung von Malware in PyPI verkürzen.
In diesem Blogbeitrag wird die Erstellung und Verwendung des Benchmark-Datensatzes zur Messung der Performance der aktuellen PyPI-Malware-Checks erläutert.
Ein neuer Python-Malware-Benchmark-Datensatz
Um einen Datensatz zu erstellen, der es interessierten Parteien ermöglicht, die Leistung von Python-Malware-Erkennungsansätzen zu messen, haben wir einen Datensatz mit bösartigen und gutartigen Paketen erstellt.
Das Zusammenstellen der bösartigen Python-Pakete war unkompliziert. Der Backstabber's Knife Collection-Datensatz (ausgecheckt bei Commit 22bd76) enthält 107 bösartige Pakete von zuvor identifizierter Python-Malware, während der MalOSS-Datensatz (ausgecheckt bei Commit 2349402e) 140 gültige Beispiele enthält. Der Benchmark-Datensatz enthält nur eine Kopie der 75 Pakete, die in beiden Datensätzen gefunden wurden. Darüber hinaus enthielten drei Pakete keine Python-Dateien, zwei ähnlich benannte Pakete wurden als gleich angesehen, und der Datensatz enthielt nur die neueste Version jedes Pakets. Daher enthält der Datensatz insgesamt 168 bösartige Python-Pakete. Um die weitere Verbreitung von OSS-Malware zu verhindern, sind beide Datensätze eingeschränkt. Die Forscher müssen ausdrücklich den Zugriff anfordern. Daher geben wir nur die Metadaten frei, die mit den schädlichen Dateien verknüpft sind. Natürlich gibt es auch viele Beispiele für Python-Malware, die nicht in diesem Datensatz enthalten sind - Pakete, die entfernt wurden, bevor eine Probe gespeichert wurde - und zukünftige Forscher sollten, wenn möglich, versuchen, diese zu integrieren.
Schwieriger war es, eine gutartige Paketliste zu erstellen. Es gibt keinen bereits vorhandenen Datensatz von Python-Paketen, der allgemein als gutartig angesehen wird. Wir haben daher zwei gutartige Datensätze erstellt.
Als ersten Schritt haben wir einen kombinierten Datensatz der 1.000 Python-Pakete erstellt, die am häufigsten heruntergeladen werden und 1.000, die am häufigsten von Python-Paketen abhängig sind. Es ist eine sichere Annahme, dass keines dieser Pakete bösartig ist. Wir haben drei beliebte Pakete ausgeschlossen, denen Python-Dateien fehlen. Durch die Verwendung nur einer Kopie von Paketen, die in beiden Datensätzen gefunden wurden, generierten wir einen gutartigen Datensatz von 1.430 Paketen. Es ist erwähnenswert, dass sich beliebte Pakete wahrscheinlich von einem typischen Python-Paket unterscheiden: möglicherweise besser entwickelt und konformer mit den Standard-Python-Programmierpraktiken. Folglich kann die Verwendung nur beliebter Pakete als gutartiger Datensatz zu unrealistischen Benchmark-Ergebnissen führen, da diese Pakete für Erkennungswerkzeuge relativ einfach als gutartig einzustufen sind.
Der zweite Schritt bestand darin, die neueste Version von 1.000 zufällig ausgewählten Python-Paketen auszuwählen. Wir haben die Pakete ausgeschlossen, die keine Python-Dateien enthielten, und die Pakete, die wir ausgewählt hatten, aber zum Zeitpunkt der Analyse nicht mehr verfügbar waren, was zu einem gutartigen Datensatz von 986 Paketen führte. Während die Wahrscheinlichkeit besteht, dass einige dieser Pakete bösartig sind, ist die Wahrscheinlichkeit, dass mehr als eine Handvoll dieser Pakete bösartig sind, verschwindend gering. Wichtig ist, dass diese Pakete eher ein Paket darstellen, das zufällig aus PyPI ausgewählt wurde.
Der Code für das Herunterladen von Paketen von PyPI und die anschließende Analyse dieser Pakete ist auf GitHub verfügbar.
Tabelle 1 zeigt die deskriptiven Statistiken des Benchmark-Datensatzes. Die Datensatz-Spaltenwerte enthalten Verknüpfungen zu den Metadaten für jede Paketliste.
Datensatz | Anzahl der Pakete | Anzahl der Python-Dateien | Anzahl der Codezeilen |
168 | 1.339 | 228.192 | |
1.430 | 164.223 | 45.254.876 | |
986 | 16.832 | 2.770.978 |
Tabelle 1. Beschreibende Statistiken des Benchmark-Datensatzes
Hinweis: Das scc-Tool wurde verwendet, um die Datei- und Zeilenstatistik zu berechnen.
Das Benchmarking des aktuellen PyPI-Malware-Erkennungsansatzes
PyPI implementiert derzeit zwei Sicherheitsprüfungen. Die erste ist eine "Setup-Pattern-Prüfung" zur Durchführung regulärer ausdrucksbasierter Prüfungen (insbesondere Yara-Regeln) von setup.py-Dateien. Die zweite ist eine "Paketumschlagsprüfung" zur Durchführung von Scans verdächtiger Verhaltensweisen im Zusammenhang mit dem Besitz von Paketen. Die folgende Analyse bewertet nur die Überprüfung des Einrichtungsmusters. Diese Überprüfungen erzeugen Warnungen, wenn ein hochgeladenes Artefakt verdächtiges Verhalten aufweist, sodass Administratoren die Warnungen überprüfen und gegebenenfalls Maßnahmen ergreifen können.
Wir haben PyPIs Setup-Pattern-Check für die bösartigen Pakete und beide Sätze von gutartigen Paketen durchgeführt. Die Prüfungen wurden nur für die Datei setup.py durchgeführt, eine Datei, die häufig von Python-Malware-Erstellern missbraucht wird. Die Analyse in Tabelle 2 zeigt Statistiken über die Anzahl der generierten Warnungen. Am wichtigsten ist, dass die Analyse ergab, dass rund 33 Prozent (474 Pakete) der beliebten Pakete und fast 15 Prozent (147 Pakete) der zufälligen Pakete Warnmeldungen auslösten. Positiv zu vermerken ist, dass die Analyse ergab, dass fast 60 Prozent (99 Pakete) der bösartigen Pakete mindestens eine Warnung generiert haben.
Datensatz | Gesamtzahl der Pakete | Gesamtzahl der Pakete mit mindestens 1 Alarm | Prozentsatz der Pakete mit mindestens 1 Alarm |
Bösartig | 168 | 99 | 58,9% |
Beliebt | 1.430 | 474 | 33,1% |
Zufällig | 986 | 147 | 14,9% |
Tabelle 2. Benchmark-Ergebnisse für aktuelle PyPI-Malware-Prüfungen
Hinweis: Diese Analyse analysierte nur setup.py-Dateien für alle Pakete.
Diese Malware-Prüfungen haben die Mehrheit der bösartigen Pakete erfasst. Diese Kontrollen haben jedoch ein düsteres falsch positives Ergebnis, das die Zeit selbst des effizientesten Sicherheitsanalysten verschwenden wird. Angenommen, 20.000 Paketversionen pro Woche (eine Zahl, die wir anhand eines öffentlichen PyPI-Datensatzes bestätigt haben) und 20 schädliche Pakete gehören dazu, muss ein Analyst, der diese Überprüfungen zur Suche nach schädlichen Paketen verwendet, mit über 4.000 falsch positiven Warnmeldungen pro Woche umgehen.
Unterstützung der Python Security Community bei der Reduzierung des Schadens durch PyPI-Malware
Unsere Erstellung eines Python-Malware-Datensatzes soll jedem helfen, der sich mit PyPI-Repository-Malware-Scans beschäftigt, die Wirksamkeit der vorgeschlagenen Ansätze zu bewerten. Da dieser Datensatz sowohl Malware als auch gutartige Pakete enthält, können Sicherheitsforscher die wahre positive Rate und, vielleicht noch wichtiger, die falsch positive Rate eines Erkennungsansatzes berechnen. Dieser Benchmark-Datensatz kann Sicherheitsforschern und der PyPI-Community helfen, Python-Malware effizienter zu erkennen, die Menge an PyPI-Malware zu reduzieren und die Zeit bis zur Erkennung von Malware in PyPI zu verkürzen.
Unsere Ergebnisse stimmen mit den aktuellen Einstellungen in der PyPI-Community überein; die Status-Quo-Malware-Checks erzeugen, obwohl sie die Mehrheit der Python-Malware erfassen, zu viele False Positives, um von einem Sicherheitsanalysten effektiv genutzt zu werden.
In einem zukünftigen Blogbeitrag planen wir, dieses Python-Malware-Erkennungs-Benchmarking auf anspruchsvollere Open-Source-Software-Malware-Analysatoren wie OSSGadget Detect Backdoor, bandit4mal und OSSF Package Analysis auszudehnen. Außerdem planen wir, die PyPI Malware Checks-Regeln auf das SemGrep-Regelwerkzeug zu portieren und diesen Ansatz zu vergleichen.
Ly D. Vu ist Gastforscher bei Chainguard und Dozent und Forscher an der FPT University in Vietnam. Zack Newman ist Senior Software Engineer bei Chainguard John Speed Meyers ist Security Data Scientist bei Chainguard.
Share this article
Related articles
- research
Engineers Want to Build, Not Maintain: Key Findings From Our 2026 Engineering Reality Report
Dustin Kirkland, SVP of Engineering
- research
The Hidden Costs of CVEs — And the Value You’re Leaving on the Table
Ed Sawma, VP of Product Marketing
- research
Mitigating malware in the python ecosystem with Chainguard Libraries
Aaditya Jain, Senior Product Marketing Manager
- research
Panic! At The Distro: A Study of Malware Prevention in Linux Distributions
Duc-Ly Vu, Trevor Dunlap, Paul Gibert, John Speed Meyers, and Santiago Torres-Arias
- research
Why AI developers are grumpy about containers
John Speed Meyers, Head of Chainguard Labs, and Dan Fernandez, Staff Product Manager
- research
FuzzSlice: Separating real CVEs from fakes through fuzzing
Aniruddhan Murali, Chainguard Labs Research Intern