Platon Data Intelligence.
Vertikal sökning & Ai.

Ett skadligt potpurri av Python-paket i PyPI

Datum:

ESET Research har upptäckt ett kluster av skadliga Python-projekt som distribueras i PyPI, det officiella Python-paketförrådet. Hotet riktar sig mot både Windows- och Linux-system och levererar vanligtvis en anpassad bakdörr. I vissa fall är den slutliga nyttolasten en variant av det ökända W4SP Stealer, eller en enkel urklippsskärm för att stjäla kryptovaluta, eller båda. I maj 2023, vi rapporterade på ett annat kluster av paket vi hittade på PyPI som levererar skadlig programvara som stjäl lösenord och kryptovalutor, men de två klustren verkar vara olika kampanjer.

Huvudpunkterna i detta blogginlägg:

  • ESET Research upptäckte 116 skadliga paket i PyPI, det officiella arkivet för programvara för programmeringsspråket Python, uppladdat i 53 projekt.
  • Offren har laddat ner dessa paket över 10,000 XNUMX gånger.
  • Sedan maj 2023 är nedladdningshastigheten mer eller mindre 80 per dag.
  • Skadlig programvara levererar en bakdörr som kan utföra fjärrkommandon, exfiltrering och ta skärmdumpar.
  • Bakdörrskomponenten är implementerad för både Windows, i Python, och Linux, i Go.
  • I vissa fall levereras W4SP Stealer eller en klippbordsmonitor som stjäl kryptovaluta, eller båda, istället.

PyPI är populärt bland Python-programmerare för att dela och ladda ner kod. Eftersom vem som helst kan bidra till förvaret kan skadlig programvara – ibland framstå som legitima, populära kodbibliotek – dyka upp där. Vi hittade 116 filer (källdistributioner och hjul) från 53 projekt som innehöll skadlig programvara. Vissa paketnamn liknar andra, legitima paket, men vi tror att det huvudsakliga sättet att installera dem av potentiella offer inte är genom typosquatting, utan social ingenjörskonst, där offren går igenom löpning pip-installation {paketnamn} för att kunna använda det "intressanta" paketet oavsett anledning.

Under det senaste året har offer laddat ner dessa filer mer än 10,000 1 gånger; se bild XNUMX.

Figur 1 Nedladdning av skadliga paket från PyPI med pip
Figur 1. Skadliga paketnedladdningar under det senaste året från PyPI med hjälp av pip

Infekterande PyPI

PyPI-paket kan ha två former: källkodspaket, som innehåller all projektkällkod och byggs vid installation, och förbyggda paket (kallas hjul), som kan innehålla kompilerade moduler för ett specifikt operativsystem eller Python-version. Intressant nog skiljer sig Python-koden i källdistributionen i vissa fall från den byggda distributionen. Den förra är ren, medan den senare innehåller den skadliga koden. Pythons pakethanterare, pip, gynnar ett hjul när det är tillgängligt snarare än en källdistribution. Som ett resultat installeras den skadliga om inte annat uttryckligen begärs.

Vi har observerat att operatörerna bakom denna kampanj använder tre tekniker för att paketera skadlig kod i Python-paket.

Skadlig test.py-modul

Den första tekniken är att placera en "test"-modul med lätt obfuskerad kod inuti förpackningen. Figur 2 visar en test.py fil med en funktion som kallas graby definieras och sedan anropas. Observera att funktionen hanterar både Windows- och Linux-system.

Figur 2 Lätt obfuskerad kod inuti testet
Figur 2. Lätt obfuskerad kod inuti test.py

Denna testmodul importeras i mitten av källkoden för paketets huvudmodul (__init__.py), så att den skadliga koden körs när paketet importeras. Figur 3 visar en modul som maskerar sig som en skärmdumpare och importerar det skadliga test.py.

Figur 3 huvudmodul som importerar skadlig kod
Figur 3. I vissa paket importerar huvudmodulen den skadliga koden

PowerShell i setup.py

Den andra tekniken är att bädda in PowerShell-kod i setup.py fil, som vanligtvis körs automatiskt av pakethanterare som t.ex pip för att hjälpa till att installera Python-projekt.

Figur 4 visar ett PowerShell-skript som laddar ner och kör nästa steg.

Figur 4 skadligt PowerShell-skript inbäddat i setup py-filen
Figur 4. I vissa paket är ett skadligt PowerShell-skript inbäddat i setup.py fil

Detta PowerShell-skript laddas ned överför[.]sh/eyRyPT/Updater.zip till en tillfällig katalog som update.zip. Skriptet dekomprimerar sedan ZIP-filen till C: Programdata och tar bort den från den tillfälliga katalogen. Därefter kör skriptet pip program för att installera beroenden. Slutligen kör den Python-koden in C:ProgramDataUpdaterserver.pyw.

Denna teknik fungerar bara på Windows och kommer inte att angripa Linux-system.

I paketets metadata från figur 4 kan du ha märkt att paketets författare är billythegoat356. Det har förekommit många rapporter som associerar detta smeknamn med skadliga aktiviteter, inklusive en artikel från Phylum, där de avslöjar Billys potentiella länk till W4SP Stealer.

Bara skadlig programvara...

I den tredje tekniken anstränger sig operatörerna inte för att inkludera legitim kod i paketet, så att endast den skadliga koden är närvarande, i en lätt förvirrad form. Figur 5 visar två delar av skadlig kod för Windows som skrivs in i temporära filer och sedan körs med pythonw.exe, som används istället för python.exe så att koden körs utan att ett konsolfönster öppnas.

Figur 5 endast lätt obfuskerad kod
Figur 5. I vissa paket finns endast lätt obfuskerad kod

Nästa steg är Python-paket, skript eller binära filer som laddas ner från antingen Dropbox eller transfer.sh.

Persistens

På Windows uppnås beständighet för det mesta via en VBScript-kodad (VBE) fil, som är en kodad VBScript-fil, skriven till %APPDATA%/Pythonenv/pythenenv.vbe. Figur 6 visar cmd.exe gömmer katalogen %APPDATA%/Pythonenv, löpning pythenenv.vbe, och sedan schemalägga VBE-filen så att den körs var femte minut under uppgiften MicrosoftWinRaRUtilityTaskB.

Figur 6 Persistens på Windows-system uppnådd med schemalagd uppgift
Figur 6. Persistens på Windows-system uppnås med en schemalagd uppgift

På Linux uppnås uthållighet genom att placera en skadlig skrivbordsinlägg, mate-user-share.desktopI ~ / .config / autostart / katalog, som ses i figur 7. Filer som finns i autostart katalogen exekveras vid varje systemstart. Skrivbordsposten använder namnet på en PARA delprojekt för sitt filnamn, men det är bara för att minska misstankarna eftersom det inte har något att göra med skrivbordsmiljön.

Figur 7 Persistens på Linux-system uppnås via autostart-katalogen
Figur 7. Persistens på Linux-system uppnås via autostart katalog

Figur 7 visar även modulnedladdningarna dl.dropbox[.]com/s/u3yn2g7rewly4nc/proclean till ~/.config/.kde/.kdepath. Detta är förmodligen ett försök att imitera en konfigurationskatalog för KDE Plasma GUI för Linux.

Lansering av mate-user-share.desktop filen kör i sin tur den nedladdade .kdepath fil, som är den körbara Linux-filen som innehåller bakdörrskomponenten.

Slutlig nyttolast

Vanligtvis är den slutliga nyttolasten en anpassad bakdörr som tillåter fjärrstyrning av kommandon, filexfiltrering och ibland inkluderar möjligheten att ta skärmdumpar. På Windows är bakdörren implementerad i Python.

Figur 8 visar bakdörren som skapar en TCP-uttagsanslutning till blazywound.ignorelist[.]com på port 6001. Efter att ha skickat värdnamnet, MAC-adressen och användarnamnet till C&C-servern kommer bakdörren direkt att hantera vissa kommandon eller köra något annat kommando i en separat process och skicka tillbaka kommandoutdata och eventuell felinformation till servern.

Figur 8 Python-implementering av bakdörr
Figur 8. Python-implementeringen av bakdörren

På Linux är bakdörren implementerad i Go; se figur 9 .

Figur 9 Go-implementeringen av bakdörren
Figur 9. Go-implementeringen av bakdörren

I vissa fall, istället för bakdörren, är nyttolasten en variant av det ökända W4SP Stealer, eller en enkel urklippsskärm som stjäl kryptovaluta, eller båda. Figur 10 visar en urklippsmonitor inriktad på Bitcoin, Ethereum, Monero och Litecoin kryptovalutor. Skadlig programvara använder den legitima pyperclip paket för att kontrollera urklippsinnehåll för plånboksadresser. Om den hittas kopierar skadlig programvara en angriparkontrollerad adress till urklippet i hopp om att offret klistrar in denna adress istället i en framtida kryptovalutatransaktion.

Figur 10 Enkel klippbordsmonitor
Figur 10. En enkel klippbordsmonitor implementerad i Python

ESET-produkter upptäcker de skadliga Python-paketen som varianter av Python/Agent och Python/TrojanDownloader, och bakdörren som Python/Agent.AOY eller Linux/Spy.Agent.BB.

De flesta av paketen togs redan ner av PyPI vid tidpunkten för denna forskning. ESET kommunicerade med PyPI för att vidta åtgärder mot de återstående och alla kända skadliga paket är nu offline. Hela listan med 116 paket finns i vår GitHub repository.

Det är värt att notera att skadlig programvara i ett PyPI-projektförråd inte är ett säkerhetsproblem med PyPI själv. I själva verket var programvaran som körde PyPI nyligen granskat av ett externt företag som bedömde att PyPl "överensstämde med allmänt accepterade bästa praxis".

Slutsats

PyPI fortsätter att missbrukas av cyberattackare för att äventyra Python-programmerares enheter. Den här kampanjen visar en mängd olika tekniker som används för att inkludera skadlig programvara i Python-paket. Python-utvecklare bör noggrant undersöka koden de laddar ner, särskilt kontrollera dessa tekniker, innan installerar det på sina system. Förutom att fortsätta att missbruka W4SP Stealer med öppen källkod, har operatörerna också implementerat en enkel, men effektiv, bakdörr. Vi förväntar oss att sådan missbruk av PyPI kommer att fortsätta och råder till försiktighet vid installation av kod från ett offentligt programvarulager.

För eventuella frågor om vår forskning publicerad på WeLiveSecurity, vänligen kontakta oss på [e-postskyddad].
ESET Research erbjuder privata APT-underrättelserapporter och dataflöden. För eventuella frågor om denna tjänst, besök ESET Threat Intelligence sida.

IOCS

Filer

SHA-1

Filnamn

Detektering

Beskrivning

439A5F553E4EE15EDCA1CFB77B96B02C77C5C388

cache.py

Python/Agent.AGL

Linux bakdörr laddare..

B94E493579CC1B7864C70FAFB43E15D2ED14A16B

coloramma-0.5.4-py3-ingen-någon.whl

Python/Agent.AGU

Paket med Linux-bakdörrsinstallationsprogram.

AE3072A72F8C54596DCBCDE9CFE74A4146A4EF52

coloramma-4.5-py3-none-any.zip

Python/Agent.AOY

Paket med Windows bakdörr.

70C271F79837B8CC42BD456A22EC51D1261ED0CA

junk.py

Python/Agent.AGM

Windows persistens installationsprogram.

B0C8D6BEEE80813C8181F3038E42ADACC3848E68

proclean

Linux/Spy.Agent.BB

Linux bakdörr.

07204BA8D39B20F5FCDB9C0242B112FADFFA1BB4

prov.py

Python/Agent.AGL

Linux bakdörr laddare.

EF59C159D3FD668C3963E5ADE3C726B8771E6F54

tmp

Linux/Spy.Agent.BB

Linux bakdörr.

För en fullständig lista över skadliga paket, se vår GitHub malware-ioc-förråd.

nätverks

Domän namn

IP-adress

Först sett

Beskrivning

blazywound.ignorelist[.]com

204.152.203[.]78

2022-11-21

C&C-server för bakdörrskomponent.

MITER ATT & CK tekniker

Detta bord byggdes med hjälp av version 14 av MITER ATT & CK -ramverket.

Taktik

ID

Namn

Beskrivning

Initial åtkomst

T1195.001

Supply Chain Compromise: Kompromissa med mjukvaruberoenden och utvecklingsverktyg

Skadlig programvara distribueras med Pythons PyPl-pakethanteringstjänst.

Persistens

T1053.005

Schemalagd uppgift/jobb: Schemalagd uppgift

På Windows uppnås uthållighet med en schemalagd uppgift.

T1547.013

Starta eller logga in Autostart Execution: XDG Autostart Entries

På Linux skapas en autostartpost för att starta bakdörren när användaren loggar in.

Försvarsflykt

T1036.005

Maskerad: Match legitimt namn eller plats

På Linux har beständiga filer namn som liknar legitim programvara

Legitimationsåtkomst

T1555.003

Inloggningsuppgifter från lösenordsbutiker: Inloggningsuppgifter från webbläsare

W4SP stjäl lösenord från de installerade webbläsarna.

Samling

T1115

Urklippsdata

För att stjäla pengar under en kryptovalutatransaktion ersätts urklippsdata.

Command and Control

T1095

Non-Application Layer Protocol

Bakdörren använder ett okrypterat binärt protokoll över TCP.

plats_img

Senaste intelligens

plats_img

Chatta med oss

Hallå där! Hur kan jag hjälpa dig?