Case 14Hugging Face / malicious models
Pluto Security links 31 malicious Hugging Face repositories to a miner and backdoor campaign that returned within days of takedown
Pluto Security links 31 Hugging Face repositories to a miner and backdoor campaign that returned within days of takedown. Who owned the machines that mined is unverified.
- Affected system
- Hugging Face model repositories and machines loading them with trust_remote_code
- Case status
- Open; one copy not disabled when checked November 2
- Sources checked
- Evidence
- Incident sources / Oversight
Overview
From September 21, 2026, an operator published repositories on Hugging Face, a public host for AI models, that posed as small Qwen2 test models and ran a cryptocurrency miner, and in some builds remote-access code, on machines that loaded them with the trust_remote_code option turned on. It matters because the code ran with the permissions of the person or service loading the model, the campaign returned within days of a takedown, and Pluto Security's report, published October 29, says the files passed the scanners it checked.
Status: open. At 05:14 UTC on November 2 (9:14 p.m. Pacific on November 1), Hugging Face's public records showed 18 of the 19 second-wave repositories disabled and one copy, htt0118/qwen2-tiny, not disabled. Record updated November 2, 2026. Severity: Not yet assessed. Pluto links mining activity to the campaign, but its published pool and wallet evidence does not establish that the workers were third-party machines rather than systems controlled or rented by the operator, and no affected organization has confirmed a compromise.
Reported impact
Three different measures are in play, and they do not convert into one another.
Downloads. Pluto counts 32,376 recorded downloads by October 28 across 44 repositories: 728 on 12 first-wave repositories before removal, 29,090 on 19 second-wave repositories, and 2,558 on 13 "linked" repositories that share technique without proven shared ownership. One repository, MENXIANGYU/qwen2-tiny, holds 28,412 of those. Pluto says the total "measures downloads, not confirmed infections or unique victims." Hugging Face's documentation counts every GET or HEAD request to a model's query file, by default config.json, as one download, and does not remove automated pipelines or repeat users from the public figure.
Pool workers seen mining. Pluto reports that nine mining "workers," the named miner instances a pool tracks, joined within 90 seconds of each other and stopped about six minutes later. It reads their names as those of a shared GPU notebook cluster and says the stop "fits an administrator killing the jobs." The nine worker IDs may describe one cluster, but the published evidence does not establish nine distinct physical machines. Pluto gives no date for the observation and names no organization.
Confirmed compromise. No affected organization, university or person has publicly confirmed an infection in the sources reviewed through November 2, and no count of infected machines exists. BleepingComputer confirmed the payload in one repository, which shows what the code does, not who ran it.
Pluto values the first-wave payout wallet's receipts at about 2,276 PRL, or roughly $5,000. Pearl (PRL) is a GPU-mined cryptocurrency launched in April 2026. The dollar figure moves with the price: Pluto's numbers imply about $2.22 per PRL, while the Kryptex pool page implied about $1.52 on November 2.
What happened
Hugging Face lets a model ship its own Python code for architectures the Transformers library does not include. Loading such a model requires the caller to set trust_remote_code=True or accept a prompt. Pluto reports that the operator placed malicious code at the top level of those Python files, so it ran on import, before any model weights loaded. The flagship had no real model: its model.safetensors is 42 bytes, which Hugging Face's file listing confirms. Pluto says the payload writes a watchdog process and shell startup hooks, runs a miner from memory under the fake kernel name [kworker/u20:1], and removes rival miners. The first wave planted an SSH key, a login credential, in six paths. Among second-wave mining builds, Pluto attributes a reverse shell, an outbound connection that hands the attacker a command line, to three siblings (qwen2-tiny-5, -6 and -9), not to the flagship itself; a separate kit, zz_ext, also carries one. Pluto describes htt0118/qwen2-tiny as a near-identical copy of the -6 payload. BleepingComputer confirmed that copy contains the same miner and reverse shell, without describing its method. The Hub lists a syscore.bin in that copy with the size and SHA-256 hash Pluto published for the second-wave miner.
Pluto found the campaign on a scan for dangerous calls in model Python files. A throwaway account's leftover backup files pointed to hhzz667 on Hugging Face and wssb123e on ModelScope, a Chinese model-hosting service. Pluto reported the first wave to both platforms, and it says both removed the accounts. A second wave then appeared. Pluto reported it on October 20, and 8.5 hours after that email, it says, the operator published MENXIANGYU/qa-whl-1021, a script Pluto says is designed to escape a privileged container and give root login on the host. Pluto says the second-wave repositories were still live eight days after its report. It describes the payloads as written for GPU hosts running self-hosted Xinference and GPUStack servers, along with rented GPU machines, shared notebooks and automated test jobs.
Pluto assesses a financially motivated, Chinese-speaking operator or small group, citing Simplified Chinese code comments, command servers on Alibaba Cloud and activity late at night in China. That attribution is Pluto's; no platform or authority has confirmed it in the sources reviewed. Pluto also notes that one second-wave line carries Indonesian-language comments and a different build system, which could mean a second operator, and its indicator table does not mark that account "proven." Account names here are handles and have not been tied to any real person. This record is separate from IB-2026-002 (OpenAI / Hugging Face), a different event. The same BleepingComputer article also covers an Air Security report on a fake Solana kit aimed at AI coding agents, which is a distinct event and not part of this record.
How the boundary failed
Free Hugging Face account
→ public repository named like a small Qwen2 test model
→ config.json auto_map names a Python file
→ Hub scanning: antivirus signatures, plus partner scanners aimed at model files
→ listed and downloadable
→ a person, a tool or a job loads it with trust_remote_code=True
[uncertain: Pluto does not say how the observed loads were triggered]
→ Transformers imports the Python file
→ top-level code runs with the loading process's permissions, before any weights load
→ watchdog and shell startup hooks
→ miner runs from memory as [kworker/u20:1]
→ in some builds: SSH key or reverse shell; separately, a container-to-host script
[capability shown in code; no attacker session on a real machine documented]
→ Pluto says mining shares were paid toward wallets it links to the campaign
[payments visible on chain; who owned the machines is unverified]
The published accounts do not describe a compromise of Hugging Face's own systems. The feature worked as documented, and the failure sat in the trust placed on it at two points.
The first is the user's opt-in. trust_remote_code is off by default, and the Transformers security policy tells users: "please always verify the content of the modeling files when using this argument." Pluto argues that tutorials copy the flag until it stops being a decision. It also cites tools that have loaded such code without the user choosing it, though it does not tie those flaws to this campaign.
The second is the platform's screening. Hugging Face runs every file under 2 GB through a malware scanner at each commit, and partner scanners from JFrog and Protect AI look for malicious behavior and exploits in models. Pluto reports that none of the 12 first-wave repositories was flagged and that modeling_evil2.py returned safe from every scanner that ran, with JFrog reporting "Not a machine-learning model". The Hub's per-file status on November 2 reads differently in part. ClamAV still reads safe and JFrog reads "unscanned" with the same message, but Protect AI marks that file and syscore.bin "unsafe" with threat code PAIT-EXDIR-100, VirusTotal marks syscore.bin "suspicious" at 5 of 76 engines, and the overall file status is "unsafe." The htt0118 copy carries the same flags while remaining enabled. These fields carry no date, so they do not show whether the flags existed when Pluto checked, and the Protect AI report link returned HTTP 404 here.
One further route is unresolved. Pluto says status reports are written into the local Xinference registry where an "operator with access to the exposed API" can read them, and it advises requiring authentication on that API. If the operator also triggered loads through exposed servers, some victims never opted in at all. Pluto does not state this, so it remains an open question rather than a finding.
Consequences
The public records document mining activity and wallet receipts that Pluto links to the campaign. They do not establish who owned the worker systems or whether their use was unauthorized. Pluto reports the first-wave wallet received about 2,276 PRL across 716 transactions and sent about 2,241 PRL onward, and that its Kryptex page showed two online workers running the same peakminer client it recovered from the second-wave binary. The published screenshot shows those two workers under hexadecimal names and a third, offline worker running a different miner. Nothing on it identifies an owner, and the published evidence does not rule out machines the operator controlled or rented.
The wallet continued to receive PRL after the report. On November 2 the Pearl explorer listed 812 transactions and a balance of 371.91 PRL, against Pluto's 716 and an implied balance near 35 PRL. The 10 newest transactions, the only ones readable here, were receipts totaling 133.16 PRL displayed from November 1, 10:01 a.m. to November 2, 4:03 a.m. Meanwhile the Kryptex page showed no online or offline workers, 30.46 PRL in seven-day rewards and the same 940.8592 PRL total paid as Pluto's screenshot. The receipts therefore appear to come from elsewhere, and these records do not show whose machines earned them. The link between this wallet and the operator rests on Pluto's analysis.
Credential theft and data access remain capabilities in code, not documented losses. Pluto's indicators list collector, reconnaissance and cloud-metadata endpoints, and it warns that a shell gives access to the files and credentials of the compromised process. It reports no specific stolen data. It advises checking any machine that loaded these models and replacing credentials the process could reach, because killing the miner or deleting the model does not remove persistence. How many of the 28,412 flagship downloads ran code is unknown. A plain file fetch or a loader that refuses custom code would count as a download without running anything, and the growth of 21,058 in eight days on one repository, while every other second-wave repository stayed under 100, has no published explanation. The container-escape script shows 0 recorded downloads, but it is not a normal model load, so that figure may not measure its use.
Vendor response
Hugging Face. No public statement was found in its blog index, changelog, status history or the coverage reviewed, checked November 2; the status history lists no incident for October or November, though that page covers service outages. MATT reports the same absence. Its actions are visible in its records. Pluto says it removed the first-wave accounts after a report. The flagship was disabled between Pluto's October 28 status table and BleepingComputer's October 29 article, and its page now says, "Access to this model has been disabled" and "This content infringes our Content Policy". At the November 2 check, 18 of 19 second-wave repositories were disabled, as were 5 of the 13 linked repositories. htt0118/qwen2-tiny, its six newer siblings and 8 linked repositories were not disabled. Disable dates are not public, Pluto does not describe any reply to its reports, and the six newer repositories have not been analyzed in any source reviewed.
ModelScope. Pluto says it removed the first-wave accounts, and its API returns "record not found" for both wssb123e repositories. No statement was found on its script-rendered site or in a Chinese-language search, which is weak evidence of absence.
JFrog and Protect AI. No case-specific statement was found on the JFrog blog index or in searches. The Protect AI blog URL returned HTTP 404. The "not a machine-learning model" wording is scanner output, not a company statement.
Official oversight
Checked November 1, 2026 Pacific (05:13 to 05:20 UTC on November 2), for the United States, China and the European Union. China is included because Pluto attributes the operator as Chinese-speaking and ModelScope hosted a mirror; that attribution is Pluto's.
| Authority | Action on this incident | Status / basis | Next step | Official source |
|---|---|---|---|---|
| CISA and FBI IC3, United States | No incident-specific public action found in the CISA advisories listing or a scoped web search of cisa.gov, ic3.gov and fbi.gov as of November 2, 2026. | Scoped absence; partial search. Not proof of inaction. | None announced. | CISA advisories |
| CNCERT/CC and Cyberspace Administration of China | No incident-specific public action found on their home pages or a scoped search of cac.gov.cn, miit.gov.cn and cert.org.cn as of November 2, 2026. | Scoped absence; home pages only. Chinese-language coverage may be incomplete. | None announced. | CNCERT/CC; CAC |
| ENISA, CERT-EU and European AI Office | No incident-specific public action found on the ENISA news page, CERT-EU advisories listing, AI Office page or a scoped search as of November 2, 2026. | Scoped absence; listing pages only. | None announced. | ENISA; CERT-EU; AI Office |
Not checked: the US Federal Trade Commission returned HTTP 404 at both URLs tried on first check and HTTP 403 on a later check, and China's MIIT vulnerability platform returned only a script shell. The CERT-FR home page had no match, and the ANSSI site timed out. No general policy is treated here as a response to this campaign.
What remains open
Established in this record
Two independent inspections support the payload: Pluto's analysis and BleepingComputer's check of the htt0118 copy. Hub records independently confirm repository dates, the 42-byte weights file, the miner file's hash on the htt0118 copy, the disabled notice on the flagship and that copy's not-disabled status. Public chain data shows the wallet Pluto identifies still receiving PRL on November 2. Whether third-party machines ran the code rests on Pluto's reading of pool data, so this record does not yet establish the third-party compromise required for a Serious rating. (Pluto; BleepingComputer; Hub records; Pearl explorer)
Still unknown
How many machines ran the code, who owned them, and whether any attacker used a shell or took data? Did users choose these models, or did some loads come from exposed inference servers or automated jobs, and what drove 21,058 downloads on one repository in eight days? When did Protect AI and VirusTotal flag these files, and why does a copy with "unsafe" file status remain enabled? Is this one operator, as Pluto's conclusion states, or two, as its comment on the Indonesian-language line allows?
Next reporting step
Seek Hugging Face's account of disable dates, scan history and request logs for the flagship; Pluto's date, pool and raw data for the nine-worker observation; confirmation from any operator of an affected cluster; and analysis of the six newer htt0118 repositories. No outreach has been sent.
Record updates
- November 2, 2026: Initial source-checked record published as IB–2026–014. Pluto's report read in full, BleepingComputer read, and Hub, ModelScope, pool and chain records checked directly on November 2 UTC without downloading or running any model file. Major limits: evidence that third parties ran the miner comes from Pluto alone, no affected party has confirmed it, no vendor statement was found, scanner flags are undated, only 10 of 812 wallet transactions were readable, and official-site checks were partial.