Xygeni observerade nyligen ett oroande mönster i landskapet av attacker mot mjukvaruleveranskedjan under 2025., som dyker upp i två populära pakethanterare: PyPI och npmSom en del av våra pågående hotinformationsinsatser,Xygenis tidiga varning om skadlig kod (MEW) Verktyget identifierade en distinkt men metodologiskt liknande instans av ett skadligt paket som tidigare laddats upp till ett annat register. Detta fall belyser hur hotaktörer utvecklas och återanvänder attacktekniker över olika ekosystem, särskilt genom skadliga Python-paket och skadliga npm-paket, vilket ökar risken för att skadliga paket infiltrerar leveranskedjor med öppen källkod.
Xygenis MEW: Att upptäcka likheterna
Xygenis MEW-verktyg är byggt för att upptäcka och flagga skadliga paket, särskilt de som är kopplade till Software Supply Chain Attacks år 2025, så snart de publiceras i register med öppen källkod. Det fungerar genom att analysera nya paket för misstänkt beteende.
I det här fallet identifierade den två skadliga Python-paket (graphalgo på PyPI) och skadliga npm-paket (express-cookie-parser på npm).
Skadliga Python- och npm-paket i attacker mot programvaruleveranskedjan (2025)
Låt oss utforska de gemensamma egenskaper som utlöste våra varningar:
typosquatting
De försökte båda imitera populära befintliga paket.
- grafalgo (PyPI): "Python-paket för att skapa och manipulera grafer och nätverk.”Uppladdad av en användare med namnet "larrytech" Den 13 juni 2025 presenterade sig detta paket som ett PyPi-alternativ till det ursprungliga icke-skadliga graphalgo-projektet, som senare döptes om till graphdict.
- express-cookie-parser (npm)Detta paket imiterade det välkända cookie-parser-paketet, och speglade till och med dess README.md. Sådan imitation av identitet är en klassisk taktik för att utnyttja befintligt förtroende.
Förvirring som första försvarslinjen
Båda paketen dolde sin skadliga kod i originalfilerna. grafalgo, den obfuskerade koden hittades inom /utils/load_libraries.py. I fallet med express-cookie-parser, cookie-loader.min.js innehöll den dolda nyttolasten.
Detta initiala lager av obfuskering används vanligtvis för att hindra tillfällig inspektion och statisk analys. Obfuskeringen var ganska enkel: upprepad ZLib-komprimering plus Base64-kodning. Denna typ av obfuskering indikerar tydligt att programvaran försöker dölja sitt beteende. Tillsammans med andra bevis gjorde detta det möjligt för Xygeni MEW att klassificera paketen som potentiell skadlig kod. Under bekräftelsefasen förberedde våra granskare omedelbart ett deobfuskeringsskript som avslöjade det uppenbart skadliga dropper-stadiet.
Flerstegsleverans av nyttolast och en delad ursprungspunkt
Båda paketen fungerade som initiala “droppare”, vilket banade väg för den verkliga nyttolasten. De delade en gemensam extern ”frö"filens URL:"https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
Denna identiska externa seedfil är en stark indikator på en delad hotaktör. Intressant nog verkar innehållet i denna seedfil vara enkla miljövariabler (t.ex. JWT_SECRET, PORT), vilket potentiellt vilseledande ger en inspektion av dess faktiska funktion.
Dynamisk C2-upplösning med en DGA
En sofistikerad taktik som observerats i dessa skadliga paket är användningen av en domängenereringsalgoritm (DGA) för att dynamiskt lösa kommando- och kontrollservern (C2). Denna teknik, som ofta ses i avancerade programvaruattacker i leveranskedjor år 2025, förlitar sig på en SHA256-hash som härleds från seed-filens innehåll, kombinerat med andra hårdkodade värden. Genom att göra det ändras C2-infrastrukturen ofta, vilket gör traditionell svartlistning mycket mindre effektiv. I det här fallet använde npm-varianten ett fast värde på 496AAC7E som en del av dess DGA-logik.
Att etablera uthållighet
Båda angriparna försökte etablera en varaktig närvaro på drabbade system. Deras strategi innebar att ta bort en fil, startup.py (för PyPi) eller startup.js (för npm), till vanliga Google Chrome-användardatakataloger i olika operativsystem (Windows, Linux, macOS).
Rengöring efter körning
För att minimera spår utförde båda skadliga skripten rensningsåtgärder. Detta inkluderade att ta bort deras ursprungliga dropper-filer (load_libraries.py, cookie-loader.min.js) och modifiera legitima paketfiler (__init__.py, index.js) för att ta bort referenserna till de nu borttagna komponenterna.
Indikatorer för kompromiss i skadliga Python- och npm-paket
- PyPI-paket: graphalgo (publicerad av larrytech, 13 juni 2025)
- npm-paketet: express-cookie-parser (specifikt version 1.4.12)
- Åtkomst till delad seed-URL:
https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
- Permanenta filnamn:
startup.py(Pytonorm)startup.js(JavaScript) - Vanliga beständiga sökvägar (OS-beroende)Inom Google Chromes användardatakataloger (t.ex.
AppData\Local\Google\Chrome\UserData\Scripts\på Windows,~/.config/google-chrome/Scripts/på Linux, etc.).
Hur man skyddar sig mot skadliga paket i attacker mot programvaruleveranskedjan 2025
En rekommenderad metod för utvecklare
Denna incident fungerar som en värdefull fallstudie i det föränderliga hotlandskapet för attacker i programvaruleveranskedjan år 2025. Den belyser hur skadliga Python-paket och skadliga npm-paket kan slinka in i betrodda ekosystem och ofta undvika upptäckt tills det är för sent. Det är därför tidig upptäckt, smarta verktyg och proaktiv systemhygien nu är viktiga delar av alla säkra DevOps-arbetsflöden. Utvecklare uppmuntras att överväga följande:
Beroendegranskning
Om dina projekt har inkluderat grafalgo or express-cookie-parser, vore det klokt att fortsätta med deras borttagning.
- För PyPI:
pip uninstall graphalgo - För npm:
npm uninstall express-cookie-parser
Systemhygien
Överväg att genomföra en omfattande systemskanning. Det är också lämpligt att manuellt kontrollera de vanliga sökvägarna till Chrome-användardatakatalogen för att upptäcka eventuella oväntade fel. startup.py or startup.js filer.
Proaktiva säkerhetsåtgärder
- Bedöm nya beroendenEtablera en rutin för att noggrant utvärdera nya paket före integration, med fokus på de från okända utgivare.
- Integrera säkerhetsverktygVerktyg som Xygenis MEW, tillsammans med annan programvara för kompositionsanalys (SCA) lösningar kan ge ett kritiskt försvarslager genom att identifiera misstänkta beteenden och sårbarheter.
- Minsta privilegiumAtt använda utvecklingsmiljöer med principen om minsta behörighet kan bidra till att begränsa den potentiella effekten av en kompromiss.
- NätverksmedvetenhetÖvervakning av utgående nätverkstrafik för ovanliga anslutningar kan ibland avslöja DGA-genererad C2-kommunikation.
Nyckelkomponenter i load_libraries.py (från graphalgo)
download_remote_content(): Hanterar hämtning av filer från angivna URL:er.run_process()Kör externa Python-skript på ett fristående sätt och undertrycker utdata för att förbli diskret.get_output_file_path(): Bestämmer den ideala systemplatsen för den beständiga startup.py-filen.remove_self()Orkestrerar rensningen efter körning av de första skadliga filerna och paketmodifieringarna.simple_shift_encrypt()/simple_shift_decrypt()Anpassade kryptografiska funktioner för att dölja kommunikationskanaler, avgörande för DGA-implementeringen.load_libraries(): Den centrala funktionen som koordinerar hela flerstegsprocessen, från initial nedladdning till slutlig nyttolastens körning och rensning.
Aftermath
Precis som med andra potentiellt skadliga paket som identifierats av MEW, skyddade beroendebrandväggen omedelbart användare som skulle inkludera dessa skadliga paket i sina beroenden. Efter bekräftelse följde vi anmälningsprocedurerna för båda registren, vilket efter granskning tog bort båda paketen.





