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).

Figure 1 Malicious package downloads from PyPI using pip
Abbildung 1. Bösartige Paket-Downloads im letzten Jahr von PyPI mit pip

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.

Figure 2 Lightly obfuscated code inside test py
Abbildung 2. Leicht verdeckter Code in test.py

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.

Figure 3 main module importing malicious code
Abbildung 3. In einigen Paketen importiert das Hauptmodul den bösartigen Code

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.

Figure 4 malicious PowerShell script embedded in setup py file
Abbildung 4. In einigen Paketen ist ein bösartiges PowerShell-Skript in die Datei setup.py eingebettet

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.

Figure 5 only lightly obfuscated code
Abbildung 5. In einigen Paketen ist nur leicht verschleierter Code vorhanden

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.

Figure 6 Persistence on Windows systems achieved with scheduled task
Abbildung 6. Persistenz auf Windows-Systemen wird durch eine geplante Aufgabe erreicht

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.

Figure 7 Persistence on Linux systems achieved via autostart directory
Abbildung 7. Die Persistenz auf Linux-Systemen wird über das Autostart-Verzeichnis erreicht

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.

Figure 8 Python implementation of backdoor
Abbildung 8. Die Python-Implementierung der Backdoor

Unter Linux ist die Backdoor in Go implementiert; siehe Abbildung 9.

Figure 9 The Go implementation of the backdoor
Abbildung 9. Die Go-Implementierung der Backdoor

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.

Figure 10 Simple clipboard monitor
Abbildung 10. Ein einfacher, in Python implementierter Clipboard-Monitor

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

T1195.001

Supply Chain Compromise: Compromise Software Dependencies and Development Tools

Malware is distributed using Python’s PyPl package management service.

Persistence

T1053.005

Scheduled Task/Job: Scheduled Task

On Windows, persistence is achieved using a scheduled task.

T1547.013

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

T1036.005

Masquerading: Match Legitimate Name or Location

On Linux, persistent files have names similar to legitimate software

Credential Access

T1555.003

Credentials from Password Stores: Credentials from Web Browsers

W4SP steals passwords from the installed web browsers.

Collection

T1115

Clipboard Data

To steal funds during a cryptocurrency transaction, clipboard data is replaced.

Command and Control

T1095

Non-Application Layer Protocol

The backdoor uses an unencrypted binary protocol over TCP.