Aikido

Confusión con npx: Paquetes que olvidaron reclamar su propio nombre

Escrito por
Charlie Eriksen

En julio de 2025, estaba prototipando un nuevo proyecto y decidí probar MikroORM. La documentación indicaba que ejecutara npx mikro-orm-esm para las migraciones. Y así lo hice.

npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/mikro-orm-esm

El paquete no existe, ¡qué extraño! Entonces caí en la cuenta: ¿y si alguien hubiera registrado esto? Habría visto:

Necesita instalar los siguientes paquetes:
mikro-orm-esm@1.0.0
¿Desea continuar? (y)

Simplemente habría pulsado y. Todo el mundo lo hace. Y nada en esa indicación te dice si estás a punto de instalar malware o una herramienta legítima.

La documentación apuntaba a un paquete inexistente. ¿Cuántas otras referencias a paquetes Phantom están circulando? ¿Cuántas han sido ya reclamadas por atacantes? Tenía que saberlo.

Así que empecé a investigar. Escribí scripts para escanear npm en busca de paquetes referenciados en READMEs y scripts pero nunca publicados. Crucé miles de npx invocaciones. Encontré docenas. Reclamé 14 de ellos antes de que nadie más pudiera. Luego ocurrió S1ngularity, y la investigación se archivó.

Seis meses después, recordé mi investigación gracias a la comunidad que investigaba cosas similares. Finalmente, comprobé el número de descargas: 121.539 descargas.

La gente había estado ejecutando estos comandos inexistentes miles de veces a la semana. Durante meses. Mientras los paquetes simplemente permanecían allí recopilando datos. 

Seis Meses de Datos

Las descargas no se mantuvieron estables. Crecieron. Empezaron lentamente a finales de julio. El pico reciente alcanzó las 4.236 descargas en un solo día (16 de enero de 2026).

121.539 Descargas en 7 meses
128 paquetes npx phantom, de julio de 2025 a enero de 2026
121,539
Descargas totales
3,903
Media semanal
4,236
Día pico (16 de enero)
4K 3K 2K 1K 🎄 Caída por vacaciones Pico: 4.236 Jul Ago Sep Oct Nov Dic Ene
El volumen de descargas semanales creció constantemente de julio de 2025 a enero de 2026
  • Total: 121.539 descargas en 128 paquetes
  • Media semanal: 3.903
  • Día pico: 4.236 descargas (16 de enero de 2026)

Una aclaración sobre el ruido: cada vez que se publica una nueva versión de un paquete, este obtiene automáticamente entre 60 y 100 descargas de escáneres de seguridad y mirrors. Ese es el ruido de referencia por cada lanzamiento. Los paquetes con múltiples versiones acumulan ruido rápidamente. Cualquier cosa que supere consistentemente ese umbral es uso real.

¿Ha notado la caída a finales de diciembre? Son las vacaciones. Incluso las descargas de paquetes phantom se toman un descanso en Navidad.

Los tres grandes

Tres paquetes representan el 79% de todas las descargas:

  • openapi-generator-cli: 48.356 descargas (paquete real: @openapitools/openapi-generator-cli)
  • cucumber-js: 32.110 descargas (paquete real: @cucumber/cucumber)
  • depcruise: 15.637 descargas (paquete real: dependency-cruiser)
Los Tres Grandes: el 79% de todo el tráfico
Tres paquetes Phantom representan 96.103 de las 121.539 descargas totales
openapi-generator-cli → real: @openapitools/openapi-generator-cli
48,356
23 referencias npm650 resultados en GitHub3.994 en los últimos 7 días
cucumber-js → real: @cucumber/cucumber
32,110
28 referencias npm856 resultados en GitHub
depcruise → real: dependency-cruiser
15,637
27 referencias npm836 resultados en GitHub

openapi-generator-cli registró 3.994 descargas solo en los últimos 7 días. Esto significa que casi 4.000 veces alguien intentó ejecutar un comando que no existe. En una semana.

La cola larga

Los paquetes restantes con descargas significativas:

  • jsdoc2md: 4.641 descargas
  • grpc_tools_node_protoc: 4.518 descargas
  • vue-demi-switch: 1.166 descargas
  • styleguidist: 805 descargas
  • mikro-orm-esm: 314 descargas
  • pvbase64: 142 descargas
  • cromwell: 106 descargas
La cola larga
Paquetes restantes con un número de descargas destacable (excluyendo los Tres Grandes)
jsdoc2md
4,641
grpc_tools_node_protoc
4,518
vue-demi-switch
1,166
styleguidist
805
mikro-orm-esm
314
pvbase64
142
cromwell
106
📊 Umbral de ruido: Cada lanzamiento de versión genera entre 60 y 100 descargas del escáner. Los paquetes con un total inferior a ~100 (mostrados en gris) son probablemente todo ruido. Todo lo que esté por encima de eso representa máquinas reales, entornos reales, credenciales reales.
Más de 1K descargas100-1K descargasEn el umbral de ruido

¿Recuerdas esa base de 60-100 descargas por versión? Un paquete con 3 versiones podría tener entre 180 y 300 descargas de puro ruido. fathym con 83 descargas en total es probablemente todo ruido. Pero mikro-orm-esm ¿con 314? Incluso teniendo en cuenta varias versiones, eso son intentos reales.

styleguidist con 805 descargas significa cientos de ejecuciones reales. Podría ser CI/CD accediendo a él repetidamente. Podrían ser docenas de desarrolladores diferentes. De cualquier manera, es un uso real de un paquete que no debería existir.

Cómo los encontramos

Gestionamos un mirror completo del registro npm en Aikido. Analizamos cada package.json y README en todo el registro. Extrajimos npx comandos. Los contrastamos con lo que está realmente registrado. También buscamos en la búsqueda de código de GitHub para ver cuán ampliamente aparecen estos comandos Phantom en la práctica, en la documentación, configuraciones de CI, scripts, en cualquier lugar donde los desarrolladores puedan referenciarlos.

Tres puntos de datos para cada paquete:

  • Referencias del registro: Cuántos paquetes npm mencionan este comando en su package.json o README
  • Resultados de GitHub: Cuántos archivos de código o repositorios referencian este comando en GitHub
  • Descargas: Cuántas veces la gente realmente intentó ejecutarlo

Reclamamos 14 en julio de 2025. Cuando retomé la investigación en enero, ampliamos nuestro análisis y encontramos muchos más. En este momento, hemos reclamado un total de 128 paquetes.

Desglose completo de paquetes
Referencias npm, resultados de búsqueda de código en GitHub y descargas para todos los paquetes reclamados
Referencias npmResultados de GitHubDescargas
🔴 Principales vectores de ataque (más de 10K descargas)
Paquete Referencias GitHub Descargas
openapi-generator-cli 23 650 48,356
cucumber-js 28 856 32,110
depcruise 27 836 15,637
🟡 Vectores de ataque significativos (1K-10K descargas)
Paquete Referencias GitHub Descargas
jsdoc2md 92 155 4,641
grpc_tools_node_protoc 83 226 4,518
vue-demi-switch 70 80 1,166
Riesgo moderado + Umbral de ruido
Paquete Referencias GitHub Descargas
styleguidist ALTA EXPOSICIÓN 246 286 805
mikro-orm-esm SOLO DOCUMENTACIÓN 0 80 314
pvbase64 18 70 142
cromwell 31 23 106
git-scripts-pre-push BAJA CONVERSIÓN 126 133 93
fathym BAJA CONVERSIÓN 119 9 83
aofl, flatjs-forge 42, 30 30, 2 99, 91
Conclusión clave: Un alto número de referencias npm no siempre equivale a un alto número de descargas. styleguidist tiene 246 referencias pero 805 descargas, mientras que mikro-orm-esm tiene 0 referencias pero 314 descargas solo de la documentación.

Algunos patrones a destacar:

Principales vectores de ataque (más de 10K descargas): openapi-generator-cli, cucumber-js, y depcruise todos muestran una fuerte correlación entre las referencias npm, las menciones en GitHub y las descargas reales. Estos serían devastadores en manos de un atacante.

Alta exposición, baja conversión: styleguidist tiene 246 referencias npm y 286 resultados en GitHub, pero solo 805 descargas. git-scripts-pre-push tiene 126 referencias pero solo 93 descargas. La visibilidad no siempre equivale a la ejecución.

Vectores solo de documentación: mikro-orm-esm no tiene referencias de paquetes npm pero sí 80 resultados en GitHub y 314 descargas. Prueba de que la documentación por sí sola puede impulsar cientos de instalaciones, incluso sin ninguna referencia del ecosistema npm.

¿Por qué es esto peligroso?

El ataque es simple.

Un atacante registra el paquete. Añade un postinstall script que exfiltra variables de entorno: tokens de npm, credenciales de cloud, claves API, lo que encuentre. Luego espera.

En el pico, eso supone potencialmente unas 4.000 máquinas comprometidas por semana. Estaciones de trabajo de desarrolladores. Servidores CI. Entornos de compilación. Muchas posiblemente se ejecutan con credenciales en variables de entorno. No se necesita phishing. Sin compromiso de la cadena de suministro de paquetes existentes. Solo hay que reclamar el nombre y esperar a que npx le traiga las víctimas.

Cuando alguien ejecuta el comando, ve:

Es necesario instalar los siguientes paquetes:
openapi-generator-cli@1.0.0
¿Desea continuar? (y)

El aviso no muestra quién lo publicó. No muestra cuándo. No muestra si es lo que busca. Es posible que vea este aviso regularmente para herramientas legítimas. La memoria muscular toma el control, porque somos humanos. Escribe y, como todo el mundo hace. Eso es todo. Ese es el ataque completo.

Cerramos 128 brechas en múltiples rondas. Hemos detectado los peores casos. Pero hay una larga cola de miles.

Una nota sobre las protecciones de npm

npm sí tiene protección contra el typosquatting. Cuando intentamos reclamar ciertos nombres, npm los rechazó con errores de similitud. Nombres como rsbuild, vuedoc, napi, t-ci eran demasiado parecidos a paquetes existentes. Eso es bueno. Significa que npm está bloqueando activamente los intentos obvios de squatting.

Pero estos comandos Phantom no son errores tipográficos. Son nombres que nunca se registraron en primer lugar. La comprobación de similitud de npm no los detecta porque no hay nada a lo que ser "similar".

Qué hacer

Utilice npx --no-install

npx --no-install your-command

Esto obliga a npx a usar solo binarios locales. Sin recurrir al registro. Si no está instalado, falla. Eso es lo deseable.

Instale las herramientas CLI explícitamente. No dependa de npx para obtenerlas:

{
  "devDependencies": {
    "@openapitools/openapi-generator-cli": "^2.7.0"
  }
}

Verifique antes de ejecutar. La documentación indica que se ejecute npx ¿algo? Verifique primero que el paquete realmente existe. Verifique que sea el correcto. Especialmente en CI/CD.

Reclama tu namespace. Si mantienes una herramienta CLI, registra los alias obvios y los errores tipográficos. Es un seguro barato contra alguien que lo haga maliciosamente.

Cómo saber si estás afectado

Si eres usuario de Aikido, revisa tu feed central y filtra por problemas de malware. Cualquier vulnerabilidad de paquetes Phantom aparecerá como un problema crítico 100/100 en el feed. Aikido vuelve a escanear tus repositorios cada noche, aunque recomendamos activar también un reescaneo completo.

Si aún no eres usuario de Aikido, configura una cuenta gratuita y conecta tus repositorios. Nuestra cobertura de malware propietaria está incluida en el plan gratuito (no se requiere tarjeta de crédito).

Para protección futura, considera usar Aikido SafeChain (código abierto), un wrapper seguro para npm, npx, yarn y pnpm. SafeChain se integra en tus flujos de trabajo actuales, interceptando los comandos de instalación de paquetes y verificando los paquetes contra Aikido Intel (nuestra inteligencia de amenazas de código abierto) antes de que lleguen a tu máquina. Detén las amenazas en la puerta.

Las Cifras

121.539 descargas en siete meses. 3.903 por semana de media. Pico de 4.236 en un solo día. 128 paquetes reclamados en total (14 en julio, el resto en enero).

El ecosistema de npm tiene millones de paquetes. Los desarrolladores ejecutan comandos npx miles de veces al día. La brecha entre el "valor predeterminado conveniente" y la "ejecución de código arbitrario" es un nombre de paquete no reclamado.

Compartir:

https://www.aikido.dev/blog/npx-confusion-unclaimed-package-names

Suscríbase para recibir noticias sobre amenazas.

Empieza hoy, gratis.

Empieza gratis
Sin tarjeta
4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.