Cuando el #1 en tendencias es malware: el typosquat Open-OSS/privacy-filter en Hugging Face
El 7 de mayo de 2026, HiddenLayer halló Open-OSS/privacy-filter, un typosquat del modelo de OpenAI que llegó al #1 en tendencias de Hugging Face con ~244 000 descargas en 18 horas y entregaba un infostealer en Rust.
¿Qué es esto?
El 7 de mayo de 2026, el equipo de investigación de HiddenLayer reveló un repositorio malicioso de Hugging Face llamado Open-OSS/privacy-filter. Suplantaba el repositorio legítimo openai/privacy-filter de OpenAI (un modelo de redacción de datos personales presentado en abril de 2026), copiaba su tarjeta de modelo casi palabra por palabra e incluía un script loader.py que descargaba y ejecutaba un infostealer en la máquina de la víctima.
El detalle que hace instructivo este incidente no es el malware, sino su distribución. Antes de que Hugging Face lo retirara, el repositorio alcanzó la primera posición en tendencias con cerca de 244 000 descargas y 667 «me gusta» en menos de 18 horas, cifras que HiddenLayer considera casi con certeza infladas por cuentas falsas para fabricar confianza. The Hacker News y CSO Online informaron del mismo hallazgo la semana siguiente. Es la contraparte de «ingeniería social» de la ruta de código silenciosa descrita en la RCE por inyección de configuración en Transformers: allí bastaba con cargar el modelo; aquí el atacante necesitaba que usted ejecutara un script — y aun así consiguió un cuarto de millón de descargas.
Cómo funciona
A diferencia de un fallo de deserialización, este ataque exigía la acción del usuario: el README pedía clonar el repositorio y ejecutar start.bat (Windows) o python loader.py. La cadena de ejecución documentada por HiddenLayer se desarrolla por etapas, que describimos a nivel de indicadores defensivos, sin reproducción:
- Cargador señuelo.
loader.pyejecutaba primero código de apariencia inofensiva (una clase ficticia, salidas de entrenamiento falsas) para parecer legítimo. - Resolutor «dead-drop». Luego desactivaba la verificación SSL, decodificaba una URL en Base64 que apuntaba a un servicio público de pastes JSON (
jsonkeeper[.]com) y extraía de ella un comando. Usar un servicio de pastes como canal de comando permitía al operador rotar la carga útil sin tocar el repositorio. - PowerShell oculto. El comando recuperado se ejecutaba vía PowerShell con
-WindowStyle HiddenyCREATE_NO_WINDOW, sin mostrar nada. Esta etapa era exclusiva de Windows; en Linux/macOS la llamada fallaba en silencio. - Descargador de segunda etapa. Un archivo batch (
update.bat) se autoelevaba mediante un aviso UAC, añadía exclusiones en Microsoft Defender y descargaba el binario final desdeapi.eth-fastscan[.]org. - Lanzador SYSTEM de un solo uso. Una tarea programada que imitaba al actualizador de Edge ejecutaba la carga útil como SYSTEM y luego se eliminaba dos segundos después — sin persistencia, solo ejecución privilegiada.
- Infostealer en Rust. La carga final (~1 MB) realizaba comprobaciones anti-VM/anti-depuración, intentaba desactivar AMSI y ETW, y recopilaba cookies y credenciales de navegadores, tokens de Discord, carteras de criptomonedas, claves SSH/FTP y capturas de pantalla, exfiltrándolo todo en JSON vía HTTPS.
HiddenLayer vinculó otros seis repositorios bajo la cuenta anthfu que reutilizaban el mismo cargador y la misma URL de comando, y ató la infraestructura a una campaña que distribuía el implante Winos 4.0 / ValleyRAT — prueba de una operación más amplia contra los ecosistemas de código abierto, no de un caso aislado.
Por qué importa
La lección trata de las señales de confianza, no de un fallo concreto. El número de descargas, los «me gusta» y la clasificación en tendencias son las heurísticas que usan los profesionales para juzgar si un modelo es seguro — y es exactamente lo que el atacante falsificó. La propia superficie de descubrimiento de la plataforma (la lista de tendencias y su lógica de recomendación) hizo el trabajo de focalización, empujando el repositorio malicioso a lo más alto de los feeds.
Esto también entierra una suposición cómoda: que «un modelo malicioso no alcanzará una distribución masiva». Llegó al #1 en 18 horas. Combinado con la RCE silenciosa por inyección de configuración en Transformers y las RCE recurrentes del parser GGUF, el panorama es claro: un repositorio de modelo es a la vez código no fiable y datos no fiables, lo cargue usted con from_pretrained() o siga su README. La misma dinámica alimenta el abuso de los registros de skills descrito en los disparadores ocultos en SKILL.md.
Defensas
- Nunca ejecute scripts de instalación desde un repositorio de modelo. Un modelo legítimo son pesos más una configuración; no debería pedirle ejecutar
start.batopython loader.py. Cualquier instrucción de «clonar y ejecutar» en una tarjeta de modelo es una señal de alarma. - Verifique el espacio de nombres, no el nombre. Fije la organización oficial del editor (
openai/..., noOpen-OSS/...). Confirme la organización, no solo un nombre de modelo que parezca correcto. Suplantar a OpenAI era todo el ataque. - Ignore las tendencias y los contadores de descargas como señales de confianza. Son manipulables y aquí se manipularon. La procedencia y las publicaciones firmadas importan; la popularidad no.
- Cargue y evalúe los modelos en aislamiento. Ejecute cualquier primer contacto con un modelo en un contenedor aislado, sin credenciales del host, sin tokens de nube permanentes y con control de salida de red — para que un cargador o una configuración maliciosa no puedan alcanzar
~/.aws,~/.sshni Internet. - Escanee antes de cargar. Use un escaneo de modelos/repositorios que inspeccione scripts ejecutables, campos de configuración sospechosos e indicadores conocidos antes del despliegue.
- Cace con los IOC publicados. HiddenLayer publicó dominios (
api.eth-fastscan[.]org,recargapopular[.]com,jsonkeeper[.]com/b/AVNNE), hashes de archivos y artefactos de host (una tarea programada que coincide conMicrosoftEdgeUpdateTaskCore[a-z0-9]{8}). Bloquee los dominios en la salida y revise el histórico. Si una máquina ejecutó el cargador, trátela como totalmente comprometida y reinstálela en lugar de limpiarla.
Estado
| Elemento | Detalle |
|---|---|
| Divulgación | 7 de mayo de 2026 (HiddenLayer); amplia cobertura el 11 de mayo de 2026 |
| Repositorio | Open-OSS/privacy-filter (+ 6 repositorios anthfu) — retirado por Hugging Face |
| Alcance | #1 en tendencias, ~244 000 descargas / 667 likes en ~18 h (probablemente inflados) |
| Vector | loader.py / start.bat → PowerShell → infostealer en Rust (Windows) |
| Impacto | Robo de credenciales, carteras, Discord y cookies de sesión; ejecución como SYSTEM |
| Actividad vinculada | Infraestructura compartida con una campaña Winos 4.0 / ValleyRAT |
La conclusión no es «otro modelo malo retirado». Es que las heurísticas de confianza en torno a los hubs de modelos — popularidad, tendencias, tarjetas de modelo copiadas — son una superficie de ataque, y que las únicas defensas duraderas son la verificación de la procedencia y el aislamiento de la carga de modelos respecto de cualquier cosa que valga la pena robar.
Sources
- → https://www.hiddenlayer.com/research/malware-found-in-trending-hugging-face-repository-open-oss-privacy-filter
- → https://thehackernews.com/2026/05/fake-openai-privacy-filter-repo-hits-1.html
- → https://www.csoonline.com/article/4169407/malicious-hugging-face-model-masquerading-as-openai-release-hits-244k-downloads.html