ESET Research hat eine Reihe bösartiger Python-Projekte entdeckt, die in PyPI, dem offiziellen Python-Paket-Repository, verbreitet werden. Die Bedrohung zielt sowohl auf Windows- als auch auf Linux-Systeme ab und liefert in der Regel eine benutzerdefinierte Backdoor. In einigen Fällen handelt es sich bei der endgültigen Payload um eine Variante des berüchtigten W4SP-Stealers oder um eine einfache Zwischenablageüberwachung zum Stehlen von Kryptowährungen oder beides. Im Mai 2023 berichteten wir über eine andere Gruppe von Paketen, die wir bei PyPI gefunden haben und die Malware zum Stehlen von Passwörtern und Kryptowährungen bereitstellen, aber die beiden Gruppen scheinen unterschiedliche Kampagnen zu sein.
Die wichtigsten Punkte dieses Blogposts:
- ESET Research entdeckte 116 bösartige Pakete in PyPI, dem offiziellen Repository für Software für die Programmiersprache Python, die in 53 Projekten hochgeladen wurden.
- Die Opfer haben diese Pakete über 10.000 Mal heruntergeladen.
- Seit Mai 2023 beträgt die Download-Rate im Schnitt 80 pro Tag.
- Die Malware enthält eine Backdoor, die die Ausführung von Remote-Befehlen, Exfiltration und das Erstellen von Screenshots ermöglicht.
- Die Backdoor-Komponente ist sowohl für Windows (in Python) als auch für Linux (in Go) implementiert.
- In einigen Fällen wird stattdessen der W4SP Stealer oder ein Zwischenablage-Monitor, der Kryptowährungen stiehlt - oder beides - geliefert.
PyPI ist unter Python-Programmierern sehr beliebt, um Code auszutauschen und herunterzuladen. Da jeder zum Repository beitragen kann, kann dort auch Malware auftauchen, die sich manchmal als legitime, beliebte Code-Bibliotheken ausgibt. Wir haben 116 Dateien (Quelltextdistributionen und Wheels) aus 53 Projekten gefunden, die Malware enthalten. Einige Paketnamen sehen anderen, legitimen Paketen ähnlich, aber wir glauben, dass sie von potenziellen Opfern nicht durch Typosquatting installiert werden, sondern durch Social Engineering, bei dem die Opfer durch die Ausführung von pip install {Paketname}
angeleitet werden, um das "interessante" Paket aus irgendeinem Grund verwenden zu können.
Im vergangenen Jahr haben die Opfer diese Dateien mehr als 10.000 Mal heruntergeladen (siehe Abbildung 1).
Infizierung von PyPI
PyPI-Pakete können zwei Formen annehmen: Quellpakete, die den gesamten Quellcode des Projekts enthalten und bei der Installation erstellt werden, und vorgefertigte Pakete (sogenannte Wheels), die kompilierte Module für ein bestimmtes Betriebssystem oder eine bestimmte Python-Version enthalten können. Interessanterweise unterscheidet sich in einigen Fällen der Python-Code in der Quelldistribution von der "gebauten" Distribution. Erstere ist sauber, während letztere den bösartigen Code enthält. Der Paketmanager von Python, pip
, bevorzugt ein Wheel, wenn es verfügbar ist, gegenüber einer Quelldistribution. Infolgedessen wird die bösartige Distribution installiert, wenn nicht ausdrücklich etwas anderes verlangt wird.
Wir haben beobachtet, dass die Betreiber dieser Kampagne drei Techniken anwenden, um bösartigen Code in Python-Pakete einzubinden.
Bösartiges Modul test.py
Die erste Technik besteht darin, ein "Test"-Modul mit leicht verschleiertem Code in das Paket einzubauen. Abbildung 2 zeigt eine test.py
-Datei mit einer Funktion namens graby
, die definiert und dann aufgerufen wird. Beachten Sie, dass die Funktion sowohl Windows- als auch Linux-Systeme behandelt.
Dieses Testmodul wird in der Mitte des Quellcodes des Hauptmoduls des Pakets(__init__.py
) importiert, so dass der bösartige Code immer dann ausgeführt wird, wenn das Paket importiert wird. Abbildung 3 zeigt ein Modul, das sich als Screenshotter tarnt und das bösartige test.py
importiert.
PowerShell in setup.py
Die zweite Technik besteht darin, PowerShell-Code in die Datei setup.py
einzubetten, die normalerweise automatisch von Paketmanagern wie pip
ausgeführt wird, um die Installation von Python-Projekten zu unterstützen.
Abbildung 4 zeigt ein PowerShell-Skript, das den nächsten Schritt herunterlädt und ausführt.
Dieses PowerShell-Skript lädt transfer[.]sh/eyRyPT/Updater.zip
in ein temporäres Verzeichnis als update.zip
herunter. Das Skript dekomprimiert dann die ZIP-Datei in C:\ProgramData
und löscht sie aus dem temporären Verzeichnis. Anschließend führt das Skript das Programm pip
aus, um die Abhängigkeiten zu installieren. Schließlich führt es den Python-Code in C:\ProgramData\Updater\server.pyw
aus.
Diese Technik funktioniert nur unter Windows und kann Linux-Systeme nicht infizieren.
In den Paket-Metadaten aus Abbildung 4 haben Sie vielleicht bemerkt, dass der Autor des Pakets billythegoat356
ist. Es gibt zahlreiche Berichte, in denen dieser Spitzname mit bösartigen Aktivitäten in Verbindung gebracht wird, darunter ein Artikel von Phylum, in dem die mögliche Verbindung von Billy zu W4SP Stealer aufgezeigt wird.
Nur Malware...
Bei der dritten Technik bemühen sich die Betreiber nicht, legitimen Code in das Paket einzuschließen, so dass nur der bösartige Code in leicht verschleierter Form vorhanden ist. Abbildung 5 zeigt zwei Stücke bösartigen Codes für Windows, die in temporäre Dateien geschrieben und dann mit pythonw.exe
ausgeführt werden, das anstelle von python.exe
verwendet wird, damit der Code ausgeführt wird, ohne ein Konsolenfenster zu öffnen.
Die nächsten Schritte sind Python-Pakete, Skripte oder Binärdateien, die entweder von Dropbox oder transfer.sh
heruntergeladen werden.
Persistenz
Unter Windows wird die Persistenz in den meisten Fällen über eine VBScript Encoded (VBE)-Datei erreicht, d. h. eine kodierte VBScript-Datei, die in %APPDATA%/Pythonenv/pythenenv.vbe
geschrieben wird. Abbildung 6 zeigt, wie cmd.exe
das Verzeichnis %APPDATA%/Pythonenv
ausblendet, pythenenv.vbe
ausführt und die VBE-Datei dann so plant, dass sie alle fünf Minuten unter der Aufgabe MicrosoftWinRaRUtilityTaskB
ausgeführt wird.
Unter Linux wird die Persistenz erreicht, indem ein bösartiger Desktop-Eintrag, mate-user-share.desktop
, im Verzeichnis ~/.config/autostart/
abgelegt wird (siehe Abbildung 7). Die Dateien im Autostart-Verzeichnis werden bei jedem Systemstart ausgeführt. Der Desktop-Eintrag verwendet den Namen eines MATE-Unterprojekts als Dateinamen, aber nur, um möglichen Verdacht zu zerstreuen, denn er hat nichts mit der beliebten Desktop-Umgebung zu tun.
Abbildung 7 zeigt auch, dass das Modul dl.dropbox[.]com/s/u3yn2g7rewly4nc/proclean
nach ~/.config/.kde/.kdepath
lädt. Dies ist wahrscheinlich ein Versuch, ein Konfigurationsverzeichnis für die KDE Plasma-GUI für Linux vorzutäuschen.
Das Starten der Datei mate-user-share.desktop
führt wiederum die heruntergeladene .kdepath
-Datei aus, bei der es sich um die ausführbare Linux-Datei handelt, die die Backdoor-Komponente enthält.
Endgültige Payload
Bei der endgültigen Payload handelt es sich in der Regel um eine benutzerdefinierte Backdoor, die die Ausführung von Remote-Befehlen und die Exfiltration von Dateien ermöglicht und manchmal auch die Möglichkeit bietet, Bildschirmfotos zu erstellen. Unter Windows ist die Backdoor in Python implementiert.
Abbildung 8 zeigt, wie die Backdoor eine TCP-Socket-Verbindung zu blazywound.ignorelist[.]com
an Port 6001
herstellt. Nach dem Senden des Hostnamens, der MAC-Adresse und des Benutzernamens an den C&C-Server verarbeitet die Backdoor einige Befehle direkt oder führt jeden anderen Befehl in einem separaten Prozess aus und sendet die Befehlsausgabe und alle Fehlerinformationen an den Server zurück.
Unter Linux ist die Backdoor in Go implementiert; siehe Abbildung 9.
In einigen Fällen handelt es sich bei der Payload nicht um die Backdoor, sondern um eine Variante des berüchtigten W4SP-Stealers oder um einen einfachen Zwischenablage-Monitor, der Kryptowährungen stiehlt - oder um beides. Abbildung 10 zeigt einen Zwischenablage-Monitor, der auf die Kryptowährungen Bitcoin, Ethereum, Monero und Litecoin abzielt. Die Malware verwendet das legitime pyperclip-Paket, um den Inhalt der Zwischenablage auf Wallet-Adressen zu überprüfen. Wenn sie gefunden wird, kopiert die Malware eine vom Angreifer kontrollierte Adresse in die Zwischenablage, in der Hoffnung, dass das Opfer diese Adresse stattdessen in eine zukünftige Kryptowährungstransaktion einfügt.
ESET-Produkte erkennen die bösartigen Python-Pakete als Varianten von Python/Agent
und Python/TrojanDownloader
und die Backdoor als Python/Agent.AOY
oder Linux/Spy.Agent.BB
.
Die meisten der Pakete wurden zum Zeitpunkt dieser Untersuchung bereits von PyPI entfernt. ESET hat sich mit PyPI in Verbindung gesetzt, um Maßnahmen gegen die verbleibenden Pakete zu ergreifen, und alle bekannten bösartigen Pakete sind nun offline. Die vollständige Liste der 116 Pakete finden Sie in unserem GitHub-Repository.
Es ist erwähnenswert, dass Malware in einem PyPI-Projekt-Repository kein Sicherheitsproblem mit PyPI selbst darstellt. Tatsächlich wurde die Software, die PyPI betreibt, kürzlich von einer externen Firma geprüft, die zu dem Schluss kam, dass PyPl "weithin anerkannten Best Practices entspricht".
Schlussfolgerung
PyPI wird weiterhin von Cyberangreifern missbraucht, um die Geräte von Python-Programmierern zu kompromittieren. Diese Kampagne zeigt eine Vielzahl von Techniken, mit denen Malware in Python-Pakete integriert wird. Python-Entwickler sollten den Code, den sie herunterladen, gründlich überprüfen, insbesondere auf diese Techniken, bevor sie ihn auf ihren Systemen installieren. Die Betreiber missbrauchen nicht nur weiterhin den quelloffenen W4SP-Stealer, sondern haben auch eine einfache, aber effektive Backdoor eingesetzt. Wir gehen davon aus, dass dieser Missbrauch von PyPI weitergehen wird und raten zur Vorsicht bei der Installation von Code aus öffentlichen Software-Repositories.
Wenn Sie Fragen zu unserer auf WeLiveSecurity veröffentlichten Forschung haben, kontaktieren Sie uns bitte unter threatintel@eset.com.
ESET Research bietet private APT Intelligence Reports und Datenfeeds an. Wenn Sie Fragen zu diesem Service haben, besuchen Sie die ESET Threat Intelligence Seite.
IoCs
Dateien
SHA-1 |
Filename |
Detection |
Description |
439A5F553E4EE15EDCA1CFB77B96B02C77C5C388 |
cache.py |
Python/Agent.AGL |
Linux backdoor downloader.. |
B94E493579CC1B7864C70FAFB43E15D2ED14A16B |
coloramma-0.5.4-py3-none-any.whl |
Python/Agent.AGU |
Package with Linux backdoor installer. |
AE3072A72F8C54596DCBCDE9CFE74A4146A4EF52 |
coloramma-4.5-py3-none-any.zip |
Python/Agent.AOY |
Package with Windows backdoor. |
70C271F79837B8CC42BD456A22EC51D1261ED0CA |
junk.py |
Python/Agent.AGM |
Windows persistence installer. |
B0C8D6BEEE80813C8181F3038E42ADACC3848E68 |
proclean |
Linux/Spy.Agent.BB |
Linux backdoor. |
07204BA8D39B20F5FCDB9C0242B112FADFFA1BB4 |
prov.py |
Python/Agent.AGL |
Linux backdoor downloader. |
EF59C159D3FD668C3963E5ADE3C726B8771E6F54 |
tmp |
Linux/Spy.Agent.BB |
Linux backdoor. |
Eine vollständige Liste der bösartigen Pakete finden Sie in unserem GitHub-Repository malware-ioc.
Netzwerk
Domain name |
IP Address |
First seen |
Description |
blazywound.ignorelist[.]com |
204.152.203[.]78 |
2022-11-21 |
C&C server for backdoor component. |
MITRE ATT&CK-Techniken
Diese Tabelle wurde mit Version 14 des MITRE ATT&CK-Frameworks erstellt.
Tactic |
ID |
Name |
Description |
Initial Access |
Supply Chain Compromise: Compromise Software Dependencies and Development Tools |
Malware is distributed using Python’s PyPl package management service. |
|
Persistence |
Scheduled Task/Job: Scheduled Task |
On Windows, persistence is achieved using a scheduled task. |
|
Boot or Logon Autostart Execution: XDG Autostart Entries |
On Linux, an autostart entry is created to launch the backdoor when the user logs in. |
||
Defense Evasion |
Masquerading: Match Legitimate Name or Location |
On Linux, persistent files have names similar to legitimate software |
|
Credential Access |
Credentials from Password Stores: Credentials from Web Browsers |
W4SP steals passwords from the installed web browsers. |
|
Collection |
Clipboard Data |
To steal funds during a cryptocurrency transaction, clipboard data is replaced. |
|
Command and Control |
Non-Application Layer Protocol |
The backdoor uses an unencrypted binary protocol over TCP. |