Cyberbeveiliging
Pluto Security licht cryptominingcampagne Load/Mine op Hugging Face toe

Het onderzoeksteam van Pluto Security publiceerde op 29 oktober 2026 zijn Load/Mine-rapport. Daarin onthult het een campagne voor cryptomining en het plaatsen van een achterdeur, verspreid via kwaadaardige modelrepositories op Hugging Face. Volgens het rapport waren er 31 kwaadaardige repositories, verdeeld over zeven Hugging Face-accounts, plus een spiegel op ModelScope. De campagne was goed voor 29.818 geregistreerde downloads, of 32.376 wanneer 13 gelinkte repositories worden meegeteld. Pluto stelt dat dit aantal downloads weergeeft, niet het aantal bevestigde infecties of unieke slachtoffers.
Het rapport, geschreven door Shaked Chen, Eitan Chassid en Yotam Perkal, meldt dat de campagne binnen enkele dagen na een eerste verwijderingsactie terugkeerde: 19 repositories in de tweede golf waren meer dan 29.000 keer gedownload en stonden acht dagen nadat Pluto ze had gemeld nog steeds online. Volgens het rapport ontving de uitbetalingswallet van de eerste golf ongeveer 2.276 PRL, ter waarde van circa $5.000, aan opbrengsten uit mining op de blockchain.
Hoe de kwaadaardige code wordt uitgevoerd
De campagne maakt gebruik van een gedocumenteerde laadfunctie van Transformers, niet van gemanipuleerde gewichten. Een repository laden met trust_remote_code=True importeert de Python-code van de repository met de rechten van de aanroeper, voordat er ook maar één gewicht wordt geladen. De config.json gebruikt auto_map om de naam op te geven van de Python-module en klasse die moeten worden geladen; Transformers downloadt het bestand waarnaar wordt verwezen naar de modulecache, en de exec_module() aanroep voert de code op het hoogste niveau in het bestand uit voordat de gevraagde modelklasse wordt teruggegeven. Het rapport merkt op dat dit gedocumenteerd gedrag is, geen standaardinstelling, en dat het beveiligingsbeleid van Transformers gebruikers opdraagt de inhoud van modelbestanden te controleren wanneer ze het argument gebruiken. Het rapport verwijst ook naar CVE-2026-22807, waarbij vLLM-versies vanaf 0.10.1 tot en met de oplossing in 0.14.0 werden geladen auto_map modules zonder de trust_remote_code instelling te controleren, waardoor een kwaadaardige repository code kon uitvoeren bij het opstarten van de server.
Ontdekking en koppeling van accounts
Pluto bouwde een scanner die alle .py bestanden omvat waarnaar wordt verwezen door auto_map in een config.json, plus Python-bestanden die naast modelgewichten staan. De scanner spoorde patronen op zoals subprocess, socket, ctypes, memfd_create en base64-decodering. De eerste treffer was dsxk4mr8tq/qwen2-tiny-gpt2, met een bestand van 305 regels met de naam modeling_evil.py; het account bevatte zes repositories die op 12 oktober 2026 binnen 2,5 uur waren aangemaakt.
De koppeling werd duidelijk dankzij back-upbestanden. De qwen2-tiny-lite repository bevatte modeling_evil.py.bak-src en modeling_evil.py.bak-sync, oudere versies van dezelfde malware waarvan de download-URL’s niet naar het wegweraccount verwezen, maar naar hhzz667 op Hugging Face en wssb123e op ModelScope. Volgens het rapport kopieerde de beheerder productiecode naar een testaccount, werkte die de URL’s in het hoofdbestand bij en vergat die de back-ups. De eerste golf omvatte 12 repositories op drie accounts en twee platforms. Voordat ze werden verwijderd, waren ze meer dan 700 keer gedownload en waren er nul beveiligingsmeldingen.
Opbouw van de payload
Als we MENXIANGYU/qwen2-tiny als representatieve build nemen, beschrijft het rapport een payload die eerst /tmp/.cch/svc.pyschrijft, een waakhondproces dat een ontbrekende miner elke 120 seconden opnieuw start, met startkoppelingen toegevoegd aan /root/.bashrc, /root/.profile en de .bashrc. Drie builds voegen een reverse shell toe die verbinding maakt met 212.32.253.3 op poort 443 of 9443 en na elke verbroken verbinding opnieuw probeert te verbinden.
De miner-binary, syscore.bin, wordt gestart via memfd_create en fexecve vermomd als de kernelworker kworker/u20:1, zodat er bij de eerste start geen uitvoerbaar bestand op schijf staat; een reservekopie blijft achter in /tmp/.cch/sync. De binary van 40,6 MB is met UPX ingepakt en twee UPX! markeringen zijn gewijzigd in PEK! , waardoor de standaardtool voor het uitpakken het bestand weigert. Pluto zette de markeringen terug en pakte een miner uit met de naam peakminer, die werd gestart met pooladressen en de login krxXJ2PKQW.worker. Voortgangsbevestigingen worden in de lokale modelregistry van Xinference opgeslagen als qwen2-tiny- gevolgd door statuscodes in base32. De payload verwijdert ook registraties van concurrerende miners en beëindigt bijbehorende processen.
Twee golven en aanpassing na verwijdering
Het rapport herleidt de eerste golf tot het account hhzz667, dat op 29 april 2026 werd aangemaakt en vijf maanden inactief bleef. Op 21 september 2026 publiceerde het qwen2-shell, een SSH-achterdeur van 37 regels die een ed25519-sleutel plaatste in authorized_keys met een beacon naar een server van Alibaba Cloud. De README was overgenomen van de officiële modelkaart van Qwen2.5-0.5B. Op 22 september bracht de beheerder qwen2-finaluit: een miner van 305 regels zonder bestand op schijf, vermomd als kernelthread, met een functie om concurrerende miners uit te schakelen en statusrapportage via Xinference, onder onschuldige namen zoals Qwen2Config. De codeopmerkingen waren in vereenvoudigd Chinees.
Pluto meldde de eerste golf bij Hugging Face en ModelScope, waarna de accounts werden verwijderd. De tweede golf volgde binnen enkele dagen: 19 repositories verspreid over vijf accounts, waaronder MENXIANGYU met 13 repositories, plus wjsbg, soumikmahato, r1r13 en htt0118; dat laatste account is aangemaakt op 25 oktober 2026. Eén repository, MENXIANGYU/qa-whl-1021, die 8,5 uur na Pluto’s melding per e-mail werd gepubliceerd, bevat een script om vanuit een container naar de host te ontsnappen. Het koppelt schijven van de host aan de container, richt zich op de GPUStack- /var/lib/gpustack -map en verschaft roottoegang tot de host. Een latere dropper beperkt de tweede fase op basis van het bron-IP-adres en stuurt andere aanvragers een 403-reactie met de tekst “static ip.”. De belangrijkste repository MENXIANGYU/qwen2-tiny groeide van 7.354 downloads op 20 oktober naar 28.412 op 28 oktober, goed voor 97,7% van de downloads in de tweede golf.
Opbrengsten uit mining en waargenomen slachtoffers
De wallet uit de eerste golf ontving ongeveer 2.276 PRL via 716 transacties en stuurde ongeveer 2.241 PRL door. De wallet was op 21 oktober nog actief op openbare pooldashboards, nadat de repositories waren verwijderd. Op Kryptex toonde de wallet twee actieve workers die rapporteerden peakminer/2.16.5 met ongeveer 1.008 PRL, ongeveer $2.237 aan beloningen over 30 dagen op het moment van vastlegging. Tijdens de analyse sloten negen workers met namen die op notebooknamen leken zich binnen 90 seconden na elkaar aan; ongeveer zes minuten later stopten ze met het indienen van shares. Volgens het rapport past dit patroon bij een gedeeld GPU-cluster. Een afzonderlijk gevolgde hl familie, die een vergelijkbare uitvoering tijdens het importeren gebruikte, liet een MoneroOcean-wallet zien met 13 workers en ongeveer $26 aan uitbetalingen in circa een maand.
Lacune in de dekking van scanners
Geen van de 12 repositories uit de eerste golf werd als schadelijk aangemerkt, en de payload van de belangrijkste repository uit de tweede golf modeling_evil2.py kreeg van elke uitgevoerde scanner de beoordeling “veilig”. Volgens Pluto’s controles meldde JFrog dat het geen machinelearningmodel was. In de documentatie over malwarescanning van Hugging Face staat dat elk repositorybestand kleiner dan 2 GB bij iedere commit door een malwarescanner wordt gecontroleerd. In de documentatie over picklescanning staat dat de scanner ClamAV-antivirusscans en scans op pickle-imports uitvoert, dat ClamAV geen pickle-exploits detecteert en dat de scans “niet 100% waterdicht” zijn; de gebruiker blijft verantwoordelijk voor het controleren van de veiligheid. Pluto stelt dat het controleren van de .py bestanden waarnaar een auto_map verwijst voordat de markering wordt ingesteld, elke payload in de campagne aan het licht zou hebben gebracht. Ook zou een statische controle op het moment van upload naar subprocess, socket, ctypes of aanroepen naar ruwe IP-adressen in auto_mapbestanden waarnaar wordt verwezen, ze eerder aan het licht hebben gebracht.
Beoordeling van de toeschrijving en aanbevolen maatregelen
Pluto vermoedt dat de operatie wordt uitgevoerd door een financieel gemotiveerde Chineestalige operator of een kleine groep. Het wijst daarbij op opmerkingen in vereenvoudigd Chinees, een command-and-controlserver bij Alibaba Cloud, spiegeling op ModelScope en hf-mirror.com, doelwitten die erop wijzen dat Xinference en Tencent Cloud worden gebruikt, en een clustering van activiteiten tussen 18:38 en 21:19 UTC. De build van soumikmahato met de naam “parasit” bevat opmerkingen in het Indonesisch. Volgens het rapport past dit bij een tweede operator in dezelfde niche, maar ook bij één operator die bewust een anders ogende variant inzet.
Het rapport adviseert iedereen die een genoemd model heeft geladen terwijl aangepaste code was ingeschakeld, de hosts te controleren op /tmp/.cch/, onverwachte svc.py processen, een kworker/u20:1 proces met miningargumenten, gecodeerde qwen2-tiny- of ezv- Xinference-registraties en verbindingen met de genoemde servers en pools. Pluto raadt aan getroffen machines in te perken, bewijsmateriaal veilig te stellen, alle routes voor persistentie te verwijderen, blootgestelde inloggegevens vanaf een schone machine te vervangen, systemen opnieuw op te bouwen met een vertrouwde image als de integriteit van de host niet kan worden vastgesteld, authenticatie verplicht te stellen voor de Xinference-API en gecontroleerde modelrevisies vast te zetten. Pluto zegt meer campagnes van dit soort te verwachten en ze te volgen.












