Xygeni observerte nylig et bekymringsverdig mønster i landskapet av angrep på programvareforsyningskjeden i 2025., som dukker opp på tvers av to populære pakkebehandlere: PyPI og NPMSom en del av vår pågående innsats for trusselinformasjon,Xygenis tidlige advarsel om skadelig programvare (MEW) Verktøyet identifiserte en distinkt, men metodisk lik forekomst av en skadelig pakke som tidligere ble lastet opp til et annet register. Denne saken fremhever hvordan trusselaktører utvikler seg og gjenbruker angrepsteknikker på tvers av økosystemer, spesielt gjennom ondsinnede Python-pakker og ondsinnede npm-pakker, noe som øker risikoen for at ondsinnede pakker infiltrerer forsyningskjeder med åpen kildekode.
Xygenis MEW: Oppdag likhetene
Xygenis MEW-verktøy er bygget for å oppdage og flagge skadelige pakker, spesielt de som er knyttet til Software Supply Chain Attacks i 2025, så snart de publiseres i registre med åpen kildekode. Det fungerer ved å analysere nye pakker for mistenkelig oppførsel.
I dette tilfellet identifiserte den to ondsinnede Python-pakker (graphalgo på PyPI) og ondsinnede npm-pakker (express-cookie-parser på npm).
Ondsinnede Python- og npm-pakker i angrep på programvareforsyningskjeden (2025)
La oss utforske de felles egenskapene som utløste varslene våre:
Skrivefeil
De prøvde begge å etterligne populære eksisterende pakker.
- grafalgo (PyPI): "Python-pakke for å lage og manipulere grafer og nettverk.Lastet opp av en bruker som heter «larrytech» 13. juni 2025 presenterte denne pakken seg som et PyPi-alternativ til det opprinnelige ikke-skadelige graphalgo-prosjektet, som senere ble omdøpt til graphdict.
- express-cookie-parser (npm)Denne pakken imiterte den velkjente informasjonskapselparser-pakken, og speilet til og med dens README.md. Slik etterligning er en klassisk taktikk for å utnytte eksisterende tillit.
Forvirring som en første forsvarslinje
Begge pakkene skjulte den skadelige koden sin i de originale filene. grafisk, den forvirrede koden ble funnet innenfor /utils/load_libraries.py. Ved ekspress-informasjonskapsel-parser, cookie-loader.min.js inneholdt den tilslørte nyttelasten.
Dette første laget med obfuskering brukes vanligvis for å hindre tilfeldig inspeksjon og statisk analyse. Obfuskeringen var ganske enkel: gjentatt ZLib-komprimering pluss Base64-koding. Denne typen obfuskering indikerer tydelig at programvaren prøver å skjule oppførselen sin. Sammen med andre bevis tillot dette Xygeni MEW å klassifisere pakkene som potensiell skadelig programvare. I bekreftelsesfasen utarbeidet våre anmeldere raskt et deobfuskeringsskript som avslørte den åpenbart ondsinnede dropper-fasen.
Flertrinns nyttelastlevering og et delt opprinnelsespunkt
Begge pakkene fungerte som opprinnelige «droppere«,» som la grunnlaget for den virkelige nyttelasten. De delte en felles ekstern «seed"fil-URL:"https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
Denne identiske eksterne frøfilen er en sterk indikator på en delt trusselaktør. Interessant nok ser innholdet i denne frøfilen ut til å være enkle miljøvariabler (f.eks. JWT_SECRET, PORT), noe som potensielt villedende gir en inspeksjon av dens faktiske funksjon.
Dynamisk C2-oppløsning med en DGA
En sofistikert taktikk som observeres i disse ondsinnede pakkene er bruken av en domenegenereringsalgoritme (DGA) for å løse kommando- og kontrollserveren (C2) dynamisk. Denne teknikken, som ofte sees i avanserte programvareforsyningskjedeangrep i 2025, er avhengig av en SHA256-hash avledet fra innholdet i frøfilen, kombinert med andre hardkodede verdier. Ved å gjøre dette endres C2-infrastrukturen ofte, noe som gjør tradisjonell svartelisting mye mindre effektiv. I dette tilfellet brukte npm-varianten en fast verdi på 496AAC7E som en del av DGA-logikken.
Etablering av utholdenhet
Begge angriperne forsøkte å etablere en varig tilstedeværelse på berørte systemer. Strategien deres innebar å slette en fil, startup.py (for PyPi) eller startup.js (for npm), inn i vanlige Google Chrome-brukerdatakataloger på tvers av ulike operativsystemer (Windows, Linux, macOS).
Opprydding etter utførelse
For å minimere spor utførte begge skadelige skriptene oppryddingsoperasjoner. Dette inkluderte å slette de første dropperfilene (load_libraries.py, cookie-loader.min.js) og endre legitime pakkefiler (__init__.py, index.js) for å fjerne referansene til de nå slettede komponentene.
Indikatorer for kompromittering i ondsinnede Python- og npm-pakker
- PyPI-pakke: graphalgo (publisert av larrytech, 13. juni 2025)
- npm-pakken: express-cookie-parser (spesifikt versjon 1.4.12)
- Tilgang til delt seed-URL:
https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
- Vedvarende filnavn:
startup.py(Python)startup.js(JavaScript) - Vanlige vedvarende stier (OS-avhengig)Innenfor Google Chromes brukerdatakataloger (f.eks.
AppData\Local\Google\Chrome\UserData\Scripts\på Windows,~/.config/google-chrome/Scripts/på Linux osv.).
Slik forsvarer du deg mot skadelige pakker i angrep på programvareforsyningskjeden i 2025
En anbefalt tilnærming for utviklere
Denne hendelsen fungerer som en verdifull casestudie i det utviklende trussellandskapet for angrep i programvareforsyningskjeden i 2025. Den fremhever hvordan ondsinnede Python-pakker og ondsinnede npm-pakker kan gli inn i pålitelige økosystemer, og ofte unngå å bli oppdaget til det er for sent. Derfor er tidlig deteksjon, smarte verktøy og proaktiv systemhygiene nå viktige deler av enhver sikker DevOps-arbeidsflyt. Utviklere oppfordres til å vurdere følgende:
Avhengighetsgjennomgang
Hvis prosjektene dine har inkludert grafisk or ekspress-informasjonskapsel-parser, ville det være klokt å fortsette med fjerningen av dem.
- For PyPI:
pip uninstall graphalgo - For npm:
npm uninstall express-cookie-parser
Systemhygiene
Vurder å utføre en omfattende systemskanning. Det anbefales også å manuelt sjekke de vanlige Chrome-brukerdatakatalogstiene for eventuelle uventede startup.py or startup.js filer.
Proaktive sikkerhetstiltak
- Vurder nye avhengigheterEtabler en rutine for å grundig evaluere nye pakker før integrering, med fokus på pakker fra ukjente utgivere.
- Integrer sikkerhetsverktøyVerktøy som Xygenis MEW, sammen med annen programvare for analyse av programvaresammensetning (SCA) løsninger, kan gi et kritisk lag med forsvar ved å identifisere mistenkelig atferd og sårbarheter.
- Minste privilegiumÅ drive utviklingsmiljøer med prinsippet om minste privilegium kan bidra til å begrense den potensielle effekten av et kompromiss.
- NettverksbevissthetOvervåking av utgående nettverkstrafikk for uvanlige tilkoblinger kan noen ganger avsløre DGA-generert C2-kommunikasjon.
Nøkkelkomponenter i load_libraries.py (fra graphalgo)
download_remote_content(): Håndterer henting av filer fra spesifiserte URL-er.run_process()Utfører eksterne Python-skript på en løsrevet måte, og undertrykker utdata for å forbli diskret.get_output_file_path()Bestemmer den ideelle systemplasseringen for den vedvarende startup.py-filen.remove_self()Orkestrerer oppryddingen av de første skadelige filene og pakkemodifikasjonene etter kjøring.simple_shift_encrypt()/simple_shift_decrypt()Tilpassede kryptografiske funksjoner for å skjule kommunikasjonskanaler, avgjørende for DGA-implementeringen.load_libraries(): Den sentrale funksjonen som koordinerer hele flertrinnsprosessen, fra første nedlasting til endelig utførelse og opprydding av nyttelasten.
Aftermath
Som med andre potensielt skadelige pakker identifisert av MEW, beskyttet avhengighetsbrannmuren umiddelbart brukere som ville inkludere disse skadelige pakkene i sine avhengigheter. Etter bekreftelse fulgte vi varslingsprosedyrene for begge registrene, som etter gjennomgang fjernet begge pakkene.





