Kyberturvallisuus
Pluto Security kertoo Hugging Facessa toteutetusta Load/Mine-kryptolouhintakampanjasta

Pluto Securityn tutkimusryhmä julkaisi 29. lokakuuta 2026 Load/Mine-raporttinsa, jossa se paljasti haitallisten Hugging Face -mallivarastojen kautta levitetyn kryptolouhinta- ja takaovikampanjan. Raportissa lasketaan, että seitsemällä Hugging Face -tilillä oli yhteensä 31 haitallista mallivarastoa sekä ModelScopessa yksi peiliversio. Kampanjasta kirjattiin 29 818 latausta, ja latauksia oli 32 376, kun mukaan lasketaan 13 siihen liittyvää mallivarastoa. Pluton mukaan luku kuvaa latauksia, ei vahvistettuja tartuntoja tai yksittäisiä uhreja.
Shaked Chenin, Eitan Chassidin ja Yotam Perkalin kirjoittamassa raportissa kerrotaan, että kampanja palasi muutaman päivän kuluttua ensimmäisistä poistotoimista: toisen aallon 19 mallivarastosta kirjattiin yli 29 000 latausta, ja ne olivat yhä saatavilla kahdeksan päivää sen jälkeen, kun Pluto ilmoitti niistä. Raportin mukaan ensimmäisen aallon louhintatuotot maksettiin lompakkoon, joka vastaanotti noin 2 276 PRL-tokenia eli arvoltaan noin 5 000 dollaria.
Miten haitallinen koodi suoritetaan
Kampanja hyödyntää Transformersin dokumentoitua latauskäyttäytymistä eikä perustu saastutettuihin painoihin. Mallivaraston lataaminen käyttäen trust_remote_code=True tuo mallivaraston Python-koodin suorittajan oikeuksin ennen painojen lataamista. Mallivaraston config.json käyttää auto_map Python-moduulin ja ladattavan luokan nimeämiseen. Transformers lataa viitatun tiedoston moduulivälimuistiinsa, ja exec_module() kutsu suorittaa tiedoston ylimmän tason koodin ennen pyydetyn malliluokan palauttamista. Raportissa huomautetaan, että kyseessä on dokumentoitu toimintatapa, ei oletusasetus, ja että Transformersin tietoturvakäytäntö kehottaa käyttäjiä tarkistamaan mallinnustiedostojen sisällön tätä argumenttia käytettäessä. Raportissa mainitaan myös CVE-2026-22807, jossa vLLM-versiot 0.10.1:stä versiossa 0.14.0 julkaistuun korjaukseen asti latasivat auto_map moduuleja tarkistamatta trust_remote_code asetusta, minkä ansiosta haitallinen mallivarasto pystyi suorittamaan koodia palvelimen käynnistyessä.
Löytäminen ja tilien väliset yhteydet
Pluto rakensi skannerin, joka kävi läpi kaikki .py tiedostot, joihin viitataan auto_map eräässä config.jsonmallivarastossa, sekä mallipainojen vieressä olevat Python-tiedostot. Skanneri etsi esimerkiksi seuraavanlaisia kuvioita: subprocess, socket, ctypes, memfd_create ja Base64-purkua. Ensimmäinen osuma oli dsxk4mr8tq/qwen2-tiny-gpt2jossa oli 305-rivinen tiedosto nimeltä modeling_evil.py; tilillä oli kuusi mallivarastoa, jotka oli luotu 2,5 tunnin aikana 12. lokakuuta 2026.
Jäljityksen katkeaminen johtui varmuuskopiotiedostoista. Mallivarasto qwen2-tiny-lite sisälsi modeling_evil.py.bak-src ja modeling_evil.py.bak-sync, haittaohjelman vanhempia versioita, joiden latausosoitteet eivät osoittaneet kertakäyttötilille vaan hhzz667 Hugging Facessa ja wssb123e ModelScopessa. Raportin mukaan toimija kopioi tuotantokoodin testitilille, päivitti pääasiallisen tiedoston URL-osoitteet ja unohti varmuuskopiot. Ensimmäisessä aallossa oli yhteensä 12 mallivarastoa kolmella tilillä ja kahdella alustalla. Ennen niiden poistamista kirjattiin yli 700 latausta, eikä niistä tehty yhtään tietoturvailmoitusta.
Haitallisen hyötykuorman rakenne
Kun MENXIANGYU/qwen2-tiny otetaan esimerkiksi edustavasta versiosta, raportissa kuvataan hyötykuorma, joka kirjoittaa ensin /tmp/.cch/svc.py, vahtiprosessin, joka käynnistää puuttuvan louhijan uudelleen 120 sekunnin välein. Käynnistyskutsut lisätään tiedostoon /root/.bashrc, /root/.profile ja käyttäjän .bashrc. Kolmeen versioon on lisätty käänteinen komentoyhteys, joka muodostaa yhteyden osoitteeseen 212.32.253.3 portissa 443 tai 9443 ja yrittää uudelleen jokaisen yhteyden katkeamisen jälkeen.
Louhijan binääritiedosto, syscore.bin, käynnistetään komennolla memfd_create ja fexecve naamioidaan ytimen työntekijäsäikeeksi kworker/u20:1, joten ensimmäisellä käynnistyskerralla levylle ei jää suoritettavan tiedoston polkua. Varakopio säilyy /tmp/.cch/sync. 40,6 Mt:n binääritiedosto on pakattu UPX:llä, ja sen kaksi UPX! -tunnistetta on muutettu muotoon PEK! , minkä vuoksi tavanomainen purkutyökalu hylkää sen. Pluto palautti tunnisteet ennalleen ja purki peakminer-nimisen louhijan, joka käynnistettiin louhintapoolin osoitteilla ja kirjautumistunnuksella krxXJ2PKQW.worker. Edistymistiedot tallennetaan paikalliseen Xinference-mallirekisteriin muodossa qwen2-tiny- , jota seuraavat base32-muotoiset tilakoodit. Hyötykuorma poistaa kilpailevien louhijoiden rekisterimerkinnät ja lopettaa niitä vastaavat prosessit.
Kaksi aaltoa ja toiminnan muokkaaminen poistojen jälkeen
Raportissa ensimmäinen aalto yhdistetään tiliin hhzz667, joka luotiin 29. huhtikuuta 2026 ja oli käyttämättömänä viisi kuukautta. Tili julkaisi 21. syyskuuta 2026 qwen2-shell, 37-rivisen SSH-takaoven, joka asensi ed25519-avaimen tiedostoon authorized_keys ja lähetti yhteysviestin Alibaba Cloudin palvelimelle. Sen README-tiedosto oli kopioitu virallisesta Qwen2.5-0.5B-mallikortista. Syyskuun 22. päivään mennessä toimija oli julkaissut qwen2-final, 305-rivisen tiedostottoman louhijan, joka naamioitui ytimen työntekijäsäikeeksi, poisti kilpailevia louhijoita ja raportoi Xinference-tilasta viattomilta vaikuttavilla nimillä, kuten Qwen2Config. Koodikommentit olivat yksinkertaistetulla kiinalla.
Pluto ilmoitti ensimmäisestä aallosta Hugging Facelle ja ModelScopelle, ja tilit poistettiin. Toinen aalto seurasi muutaman päivän kuluessa: 19 tietovarastoa viidellä tilillä, mukaan lukien MENXIANGYU, jolla oli 13 tietovarastoa, sekä wjsbg, soumikmahato, r1r13 ja htt0118; viimeksi mainittu tili luotiin 25. lokakuuta 2026. Yksi tietovarasto, MENXIANGYU/qa-whl-1021, julkaistiin 8,5 tuntia Pluton paljastusviestin jälkeen. Se on kontista isäntäkoneeseen pakeneva skripti, joka liittää isäntäkoneen levyt ja kohdistuu GPUStackin /var/lib/gpustack hakemistoon sekä antaa pääkäyttäjän kirjautumisoikeudet isäntäkoneeseen. Myöhempi lataajaohjelma rajoittaa toisen vaiheen toimintaa lähde-IP-osoitteen perusteella ja palauttaa muille pyytäjille 403-vastauksen, jonka tekstinä on “static ip.” Lippulaivatietovarasto MENXIANGYU/qwen2-tiny kasvoi 7 354 latauksesta 20. lokakuuta 28 412 lataukseen 28. lokakuuta, ja sen osuus toisen aallon latauksista oli 97,7 %.
Louhintatulot ja havaitut uhrit
Ensimmäisen aallon lompakkoon saapui noin 2 276 PRL:ää 716 tapahtumassa, ja sieltä lähetettiin edelleen noin 2 241 PRL:ää. Lompakko näkyi yhä aktiivisena julkisissa louhintapoolien koontinäytöissä 21. lokakuuta, vaikka sen tietovarastot oli poistettu. Kryptexissä lompakolla näkyi kaksi verkossa olevaa louhintatyöntekijää, jotka raportoivat peakminer/2.16.5 noin 1 008 PRL:n eli noin 2 237 dollarin edestä palkkioita 30 päivän ajalta tietojen keruuhetkellä. Analyysin aikana yhdeksän muistikirjamaisesti nimettyä louhintatyöntekijää liittyi palveluun 90 sekunnin sisällä toisistaan ja lakkasi lähettämästä osuuksia noin kuusi minuuttia myöhemmin. Raportin mukaan tämä profiili vastaa yhteiskäytössä olevaa GPU-klusteria. Erillään seurattu hl haittaohjelmaperhe, joka käytti samankaltaista suoritusta tuonnin yhteydessä, käytti MoneroOcean-lompakkoa, jolla oli 13 louhintatyöntekijää ja jolle oli maksettu noin 26 dollaria noin kuukauden aikana.
Tarkistuksen katvealue
Yhtäkään ensimmäisen aallon 12 tietovarastosta ei merkitty haitalliseksi, ja toisen aallon lippulaivan hyötykuorma modeling_evil2.py sai jokaiselta suoritetulta tarkistimelta tuloksen “turvallinen”. Pluton tarkistusten mukaan JFrog ilmoitti, ettei kyseessä ollut koneoppimismalli. Hugging Facen haittaohjelmien tarkistusta koskevassa dokumentaatiossa todetaan, että jokainen alle 2 Gt:n kokoinen tietovaraston tiedosto tarkistetaan haittaohjelmien varalta jokaisen muutoksen yhteydessä. Sen pickle-tiedostojen tarkistusta koskevassa dokumentaatiossa kerrotaan, että tarkistin suorittaa ClamAV-virustarkistukset ja pickle-tiedostojen tuontitarkistukset, ettei ClamAV kata pickle-tiedostojen hyväksikäyttöä ja ettei tarkistus ole “sataprosenttisen varma”. Vastuu turvallisuuden varmistamisesta jää käyttäjälle. Pluto toteaa, että .py tiedostojen, joihin auto_map viitataan ennen merkinnän asettamista, tarkastelu olisi paljastanut kampanjan jokaisen hyötykuorman. Lisäksi staattinen tarkistus latauksen yhteydessä, jossa etsittäisiin subprocess, socket, ctypes tai raaka-IP-osoitteisiin tehtyjä kutsuja sisältävistä auto_map-viitatuista tiedostoista, olisi paljastanut ne aiemmin.
Arvio tekijöistä ja suositellut toimet
Pluto arvioi, että tekijänä on taloudellista hyötyä tavoitteleva kiinankielinen toimija tai pieni ryhmä. Arvion perusteina ovat yksinkertaistetun kiinan kielellä kirjoitetut kommentit, Alibaba Cloudin komento- ja ohjauspalvelin, peilaukset ModelScopeen ja hf-mirror.comiin, Xinferencen ja Tencent Cloudin käyttöön perustuva kohdentaminen sekä toiminnan keskittyminen kello 18.38–21.19 UTC:n välille. soumikmahaton “parasit”-versio sisältää indonesiankielisiä kommentteja. Raportin mukaan tämä sopii joko samaan erikoisalaan kuuluvaan toiseen toimijaan tai yhteen toimijaan, joka käyttää tarkoituksella erilaiselta vaikuttavaa toimintatapaa.
Raportissa kehotetaan kaikkia, jotka ovat ladanneet jonkin luetelluista malleista mukautettu koodi käytössä -asetuksen ollessa päällä, tarkistamaan isäntäkoneista /tmp/.cch/, odottamattomia svc.py prosesseja sekä kworker/u20:1 louhintaan liittyviä käynnistysargumentteja sisältävän prosessin, koodattuja qwen2-tiny- tai ezv- Xinference-rekisteröintejä sekä yhteyksiä lueteltuihin palvelimiin ja pooleihin. Pluto suosittelee eristämään vaikutuksen kohteena olevat koneet, säilyttämään todisteet, poistamaan kaikki pysyvyyden varmistavat mekanismit, vaihtamaan paljastuneet tunnistetiedot puhtaalta koneelta, rakentamaan järjestelmän uudelleen luotetusta levykuvasta, jos isäntäkoneen eheyttä ei voida varmistaa, edellyttämään Xinference-rajapinnan käyttöön tunnistautumista ja kiinnittämään käytettyjen mallien versiot tarkistettuihin versioihin. Pluto kertoo odottavansa lisää tämänkaltaisia kampanjoita ja seuraavansa niitä.












