Xygeni je nedavno primijetio zabrinjavajući obrazac u napadima na lanac snabdijevanja softverom u 2025. godini., koji se pojavljuje u dva popularna upravitelja paketa: PyPI i npmKao dio naših kontinuiranih napora u prikupljanju obavještajnih podataka o prijetnjama,Xygenijev rani alarm za zlonamjerni softver (MEW) Alat je identificirao zaseban, ali metodološki sličan primjer zlonamjernog paketa koji je prethodno postavljen u drugi registar. Ovaj slučaj ističe kako akteri prijetnji razvijaju i ponovo koriste tehnike napada u ekosistemima, posebno putem zlonamjerni Python paketi i zlonamjerni npm paketi, što povećava rizik od infiltracije zlonamjernih paketa u lance snabdijevanja otvorenog koda.
Xygenijev MEW: Uočavanje sličnosti
Xygenijev MEW alat je napravljen za otkrivanje i označavanje zlonamjernih paketa, posebno onih povezanih s napadima na lanac opskrbe softverom u 2025. godini, čim budu objavljeni u registrima otvorenog koda. Radi tako što analizira nove pakete na sumnjivo ponašanje.
U ovom slučaju, identificirano je dvoje zlonamjerni Python paketi (graphalgo na PyPI) i zlonamjerni npm paketi (express-cookie-parser na npm-u).
Zlonamjerni Python i npm paketi u napadima na lanac snabdijevanja softvera (2025)
Istražimo zajedničke karakteristike koje su aktivirale naša upozorenja:
typosquatting
Obojica su pokušali imitirati popularne postojeće pakete.
- grafalgo (PyPI): "Python paket za kreiranje i manipulisanje grafovima i mrežama.”Otpremio korisnik pod imenom "larrytech" 13. juna 2025. godine, ovaj paket se predstavio kao PyPi alternativa originalnom ne-zlonamjernom projektu graphalgo, koji je kasnije preimenovan u graphdict.
- ekspresni parser kolačića (npm)Ovaj paket je imitirao dobro poznati paket za parsiranje kolačića, čak ga je i kopirao. README.md. Takvo lažno predstavljanje je klasična taktika iskorištavanja postojećeg povjerenja.
Zataškavanje kao prva linija odbrane
Oba paketa su sakrila svoj zlonamjerni kod unutar originalnih datoteka. grafalgo, obfusirani kod je pronađen unutar /utils/load_libraries.py. U slucaju da ekspresni parser kolačića, cookie-loader.min.js sadržavao je obfusirani korisni teret.
Ovaj početni sloj obfuskacije se obično koristi za ometanje povremene inspekcije i statičke analize. Obfuskacija je bila prilično jednostavna: ponovljena ZLib kompresija plus Base64 kodiranje. Ova vrsta obfuskacije jasno ukazuje na to da softver pokušava sakriti svoje ponašanje. Uz druge dokaze, ovo je omogućilo Xygeni MEW-u da klasificira pakete kao potencijalni zlonamjerni softver. Tokom faze potvrde, naši recenzenti su odmah pripremili skriptu za deobfuskaciju koja je otkrila očigledno zlonamjernu fazu droppera.
Višestepena isporuka korisnog tereta i zajednička polazna tačka
Oba paketa su funkcionirala kao početni “drobilice”, postavljajući temelje za pravi korisni teret. Dijelili su zajednički vanjski “sjemeURL datoteke:https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
Ova identična eksterna sjemenska datoteka je snažan pokazatelj zajedničkog aktera prijetnje. Zanimljivo je da se sadržaj ove sjemenske datoteke čini kao jednostavne varijable okruženja (npr. JWT_SECRET, PORT), što potencijalno može zavarati u pogledu njene stvarne funkcije prilikom inspekcije.
Dinamička C2 rezolucija sa DGA
Sofisticirana taktika uočena u ovim zlonamjernim paketima je korištenje algoritma za generiranje domene (DGA) za dinamičko rješavanje problema sa serverom komandovanja i kontrole (C2). Ova tehnika, često viđena u naprednim napadima na lanac snabdijevanja softverom 2025. godine, oslanja se na SHA256 hash izveden iz sadržaja seed datoteke, u kombinaciji s drugim čvrsto kodiranim vrijednostima. Na taj način, C2 infrastruktura se često mijenja, što tradicionalno stavljanje na crnu listu čini mnogo manje efikasnim. U ovom slučaju, npm varijanta je koristila fiksnu vrijednost 496AAC7E kao dio svoje DGA logike.
Uspostavljanje postojanosti
Oba napadača su nastojala uspostaviti trajno prisustvo na pogođenim sistemima. Njihova strategija je uključivala uklanjanje datoteke, startup.py (za PyPi) ili startup.js (za npm), u uobičajene direktorije korisničkih podataka Google Chromea na različitim operativnim sistemima (Windows, Linux, macOS).
Čišćenje nakon izvršenja
Kako bi se smanjili tragovi, oba zlonamjerna skripta su izvršila operacije čišćenja. To je uključivalo brisanje njihovih početnih datoteka droppera (load_libraries.py, cookie-loader.min.js) i modificiranje legitimnih datoteka paketa (__init__.py, index.js) da biste uklonili reference na sada izbrisane komponente.
Indikatori kompromitovanja u zlonamjernim Python i npm paketima
- PyPI paketgraphalgo (objavio larrytech, 13. juna 2025.)
- npm paketexpress-cookie-parser (posebno verzija 1.4.12)
- Pristup dijeljenom URL-u početnog broja:
https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
- Trajna imena datoteka:
startup.py(Python)startup.js(JavaScript) - Uobičajeni trajni putevi (ovisni o operativnom sistemu)Unutar direktorija korisničkih podataka Google Chromea (npr.
AppData\Local\Google\Chrome\UserData\Scripts\na Windowsima,~/.config/google-chrome/Scripts/na Linuxu, itd.).
Kako se odbraniti od zlonamjernih paketa u napadima na lanac snabdijevanja softverom 2025.
Preporučeni pristup za programere
Ovaj incident služi kao vrijedna studija slučaja u kontekstu promjenjivog pejzaža prijetnji napada na lanac snabdijevanja softverom u 2025. godini. Ističe kako zlonamjerni Python paketi i zlonamjerni npm paketi mogu prodrijeti u pouzdane ekosisteme, često izbjegavajući otkrivanje dok ne bude prekasno. Zato su rano otkrivanje, pametni alati i proaktivna higijena sistema sada ključni dijelovi svakog sigurnog DevOps radnog procesa. Programeri se ohrabruju da razmotre sljedeće:
Pregled ovisnosti
Ako su vaši projekti uključivali grafalgo or ekspresni parser kolačića, bilo bi razborito nastaviti s njihovim uklanjanjem.
- Za PyPI:
pip uninstall graphalgo - Za npm:
npm uninstall express-cookie-parser
Higijena sistema
Razmislite o provođenju sveobuhvatnog skeniranja sistema. Također je preporučljivo ručno provjeriti uobičajene putanje direktorija korisničkih podataka Chromea za bilo kakve neočekivane startup.py or startup.js datoteke.
Proaktivne sigurnosne mjere
- Procijenite nove zavisnostiUspostavite rutinu za temeljitu procjenu novih paketa prije integracije, fokusirajući se na one od nepoznatih izdavača.
- Integrirajte sigurnosne alateAlati poput Xygenijevog MEW-a, zajedno s drugim alatima za analizu sastava softvera (SCA) rješenja, mogu pružiti ključni sloj odbrane identificiranjem sumnjivih ponašanja i ranjivosti.
- Najmanja privilegijaKorištenje razvojnih okruženja s principom najmanjih privilegija može pomoći u ograničavanju potencijalnog utjecaja kompromitiranja.
- Network AwarenessPraćenje odlaznog mrežnog prometa u potrazi za neobičnim vezama ponekad može otkriti C2 komunikacije generirane od strane DGA.
Ključne komponente od load_libraries.py (iz grafalga)
download_remote_content(): Rukuje dohvaćanjem datoteka sa određenih URL-ova.run_process()Izvršava eksterne Python skripte odvojeno, potiskujući izlaz kako bi ostao diskretan.get_output_file_path()Određuje idealnu sistemsku lokaciju za trajnu datoteku startup.py.remove_self()Orkestrira čišćenje nakon izvršenja od početnih zlonamjernih datoteka i modifikacija paketa.simple_shift_encrypt()/simple_shift_decrypt()Prilagođene kriptografske funkcije za prikrivanje komunikacijskih kanala, ključne za implementaciju DGA.load_libraries()Centralna funkcija koja koordinira cijeli višefazni proces, od početnog preuzimanja do konačnog izvršavanja i čišćenja korisnog tereta.
posljedice
Kao i kod drugih potencijalno zlonamjernih paketa koje je MEW identificirao, zaštitni zid zavisnosti odmah je zaštitio korisnike koji bi uključili ove zlonamjerne pakete u svoje zavisnosti. Nakon potvrde, slijedili smo procedure obavještavanja za oba registra, koji su nakon pregleda uklonili oba paketa.




