Aviso de autorización: Paquete npm que oculta amenazas a la nube y al sistema

Permiso de trabajo: Una historia de portada de "Investigación autorizada" de npm que oculta sondas de metadatos en la nube y persistencia del sistema.

TL; DR

Entre el 15/06/2026 y el 16/06/2026, un único editor de npm lanzó seis paquetes — 26 versiones en total — que ejecutan un script de tiempo de instalación en cada npm installCada paquete incluye un archivo README que lo declara un artefacto de investigación "inofensivo" del programa HackerOne/GitHub Bug Bounty, que "nunca" modifica los valores de las credenciales y "no realiza ninguna persistencia". El código no coincide con el aviso legal. En los ejecutores de CI de Linux, el gancho de instalación identifica el entorno y sondea un punto final de metadatos de instancia en la nube; en Windows solicita elevación, se ejecuta como SYSTEMy abre un canal de comandos a un host externo. El único indicador a buscar ahora es el host C2. 173.255.233[.]239Gravedad: highEcosistema afectado: npm. Los nombres se mezclan con el ruido de dependencia de la integración continua (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9y tres hermanos).

El ataque: cómo funciona

Cada paquete en el clúster se construye de la misma manera. package.json conecta el mismo comando en dos ciclos de vida hooks:

{   "scripts": {     "preinstall": "node run.js",     "postinstall": "node run.js"   } }

Corriendo en ambos preinstalación y postinstalación significa que la carga útil se ejecuta independientemente de si fallan o no los pasos de instalación posteriores. ejecutar.js En sí mismo es un despachador de plataforma de diez líneas:

// Platform dispatcher — runs beaconNN.js on Windows, beacon_linux.js on Linux. // GitHub Bug Bounty authorized research. Contact: nicholas@curran.tech 'use strict'; const { execFileSync } = require('child_process'); const path = require('path'); const node = process.execPath; const script = process.platform === 'win32'   ? path.join(__dirname, 'beacon34.js')   : path.join(__dirname, 'beacon_linux.js'); try { execFileSync(node, [script], { stdio: 'inherit', timeout: 90000 }); } catch (e) {}

El comportamiento se bifurca entonces según el sistema operativo. Los seis paquetes llevan las mismas dos piezas: ejecutar.js y las balizas de la plataforma, por lo que son lanzadores intercambiables en lugar de seis herramientas distintas. La única variación significativa entre ellas es la cadencia de publicación: cuatro nombres se publicaron una sola vez, mientras que dos se volvieron a publicar cada 30-60 minutos durante horas, lo que mantiene una versión recién publicada frente a los instaladores y resolutores incluso cuando se retiran las versiones anteriores.

En Linux (beacon_linux.js) el script perfila dónde se está ejecutando. Enumera los nombres de las variables de entorno, lee archivos en / proc, comprueba si docker.socky corre hostname y whoamiLuego, realiza una solicitud HTTP al punto final de metadatos de la instancia del contenedor de AWS. 169.254.170[.]2 — la dirección link-local que una tarea ECS consulta para obtener su propia configuración y credenciales de rol de corta duración (IMDS, el servicio de metadatos de instancia). Los resultados se envían mediante POST al recopilador de la campaña en 173.255.233[.]239.

En Windows (beacon34.js / beacon18.js) el paquete hace mucho más que perfilar su host. El código marcado agrega una clave de registro en el configuración de ms manejador con un DelegateExecute valor: una conocida vulnerabilidad de omisión del control de cuentas de usuario que permite que un proceso iniciado se ejecute con privilegios elevados sin una solicitud. Invoca PowerShell con -Omisión de la política de ejecución y Expresión de invocación, se ejecuta en el NT AUTHORITY \ SYSTEM contexto, y sondea un host externo para obtener comandos. El canal de comandos de Windows se ejecuta sobre un Túnel de Cloudflare, limitaciones-de-monedas-de-diámetro-para-padres.trycloudflare[.]com:443, volviendo a 173.255.233 [.] 239: 443, utilizando tres puntos finales: /c2/poll para obtener un comando, /c2/salida para devolver la salida, /c2/eof cerrar.

Novedades: la cláusula de exención de responsabilidad como camuflaje.

La novedad no reside en la carga útil: el reconocimiento mediante ganchos de instalación y la elevación de privilegios de Windows están bien documentados. Se trata de la historia de portada. Cada paquete incluye un archivo README que se lee como un documento de divulgación responsable:

# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security research

Esto es una benigno paquete publicado bajo el ámbito `@ncurran` del propio autor como parte de un Participación autorizada en el programa de recompensas por errores de HackerOne/GitHub (npm está incluido).

En la instalación realiza una inspección su propio entorno de ejecución … variable ambiental

Solo nombres de claves … comprueba si es bien conocido puntos finales de metadatos en la nube son  accesible … Solo informa códigos de estado, longitudes de respuesta y hashes — ninguna credencial, valor de token o datos de terceros. No realiza ninguna acción. persistencia, ausencia de movimiento lateral y ausencia de acción destructiva.

Tres afirmaciones de ese texto son contradichas por el código enviado. El README dice "sin persistencia", pero el beacon de Windows escribe una clave de elevación basada en el registro. Dice "nunca ninguna credencial, valor de token", pero la ruta de Windows ejecuta comandos obtenidos arbitrariamente como LITE PARA TECHOS PLANOS, que no impone tal límite a lo que se lee o se devuelve. Incluso nombra un paquete: @ncurran/sandbox-recon-880538 — ese no es el que viene incluido, lo que indica que el README es una plantilla reutilizada en lugar de una descripción del artefacto en cuestión. Una cláusula de exención de responsabilidad en un paquete que la víctima nunca aceptó instalar no otorga ningún consentimiento. La clasificación aquí es maliciosa independientemente de la redacción. La cláusula de exención de responsabilidad también tiene un objetivo más sutil: un paso de triaje automatizado que lee el texto del paquete en busca de señales tranquilizadoras —«benigno», «autorizado», un programa con nombre, un correo electrónico de contacto— puede ser influenciado hacia un veredicto seguro por una prosa que la carga útil contradice. La lección es válida tanto para revisores humanos como para máquinas: evalúe el comportamiento en el momento de la instalación, no la autodescripción del README.

Cronograma

Todos los paquetes aparecieron en un lapso de 24 horas. Los cuatro nombres de versiones únicas se publicaron primero, seguidos de dos paquetes que se republicaron cada 30 a 60 minutos.

Fecha (UTC) Eventos
2026-06-15 18:32 Primer paquete publicado — npm:pkg-telemetry-r4f9@1.0.0
2026-06-15 19:50 npm:runtime-metrics-w7k2@1.0.0 publicado
2026-06-15 20:14 npm:build-tracker-n5p1@1.0.0 publicado
2026-06-15 20:35 npm:npm-sandbox-ping-r9t2@1.0.0 publicado
2026-06-15 21:09–22:42 npm:event-metrics-q3x7 publicado 1.0.0 → 1.0.8 (9 versiones)
2026-06-15 23:40 → 2026-06-16 04:40 npm:metrics-pipeline-d8k2 publicado 1.0.0 → 1.0.10 (11 versiones)
2026-06-16 Se ha identificado y clasificado un clúster como malicioso; varios archivos tar ya están devolviendo un error 404 en el registro (en curso).

La campaña es reciente y la eliminación aún se está completando: al momento del análisis, algunas versiones se habían registrado y otras no. Considere que las 26 versiones están comprometidas.

Indicadores de compromiso

Paquetes

Ecosistema PREMIUM Source-Connect Estado
npm metrics-pipeline-d8k2 1.0.0 – 1.0.10 malicioso
npm event-metrics-q3x7 1.0.0 – 1.0.8 malicioso
npm runtime-metrics-w7k2 1.0.0 malicioso
npm build-tracker-n5p1 1.0.0 malicioso
npm npm-sandbox-ping-r9t2 1.0.0 malicioso
npm pkg-telemetry-r4f9 1.0.0 malicioso

Network

Tipo Indicador Notas
IP 173.255.233[.]239 Recolector C2; POST de reconocimiento de Linux y respaldo de Windows :443
Dominio diameter-coins-limitations-parents.trycloudflare[.]com Canal de comandos de Windows a través de un túnel de Cloudflare, :443
Ruta URI /c2/poll, /c2/out, /c2/eof Comando de Windows poll / output / close
IP 169.254.170[.]2 El punto final de metadatos de instancia de AWS ECS se sondea desde el gancho de instalación.

Salud Conductual

Signal Mareas Ideales para Lecciones
Instale hooks preinstall y postinstall ambos corren node run.js
Despacho de plataforma run.js corre beacon_linux.js en Linux beacon34.js / beacon18.js en Windows
Reconocimiento de Linux Enumera los nombres de las claves de variables de entorno, lee /proc, cheques docker.sock, carreras hostname / whoami, sondeos IMDS
Elevación de ventanas ms-settings DelegateExecute Omisión del UAC del registro; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; se ejecuta como SYSTEM
Disfrazar README afirma que se trata de una investigación "benigna" y "autorizada" y que "no hay persistencia"; hace referencia a un nombre de paquete que no envía.

Atribución y comportamiento observado

Describimos al editor únicamente por sus señales y no afirmamos la identidad de ninguna persona detrás de la cuenta.

  • Catálogo de señales. Los seis paquetes fueron publicados por la misma cuenta de npm, npmresearch8847, con el correo electrónico indicado npmresearch8847@web-library.net (correo electrónico y SCM ambos verificación ausentes; no hemos verificado la propiedad). Los README se publican bajo un @ncurran alcance y proporcionar un contacto de nicholas@curran.tech, y ejecutar.js apunta al repositorio github.com/ncurran/npm-sandbox-research`. Los seis paquetes comparten una identidad ejecutar.js despachador, un común beacon_linux.js etapa de reconocimiento y anfitrión del colector único 173.255.233[.]239`. El esquema de nomenclatura es consistente: una raíz genérica que suena a CI (métrica, Telemetría, rastreador de compilación, ping de caja de arena) más un sufijo corto aleatorio.
  • Confianza. Los seis paquetes parecen constituir una sola campaña, dada la presencia del despachador, la fase de reconocimiento y el servidor C2 compartidos. La mención de "investigación autorizada" se mantiene constante en los seis archivos README. No hemos podido confirmar que ningún programa de recompensas por detección de errores haya autorizado esta actividad, y las afirmaciones del descargo de responsabilidad no coinciden con el código distribuido.
  • Capacidad observada. La carga útil ejercidacises cuatro clases de capacidad: ejecución de código install-hook en ambos preinstalación y postinstalación; reconocimiento del host y del entorno CI con salida a un recolector externo; sondeo de accesibilidad de metadatos de instancias en la nube desde el contexto de instalación; y, en Windows, escalada de privilegios local, ejecución como LITE PARA TECHOS PLANOSy un bucle de comandos de búsqueda y ejecución a través de un canal externo. El bucle de comandos de Windows es una función de control remoto: busca instrucciones y devuelve su resultado.

Generar impacto

La exposición es mayor para entornos de compilación automatizados. Una instalación de npm en CI ejecuta el ciclo de vida. hooks con cualquier identidad que tenga el ejecutor; en un ejecutor en la nube, esa identidad a menudo incluye un punto final de metadatos accesible y una credencial de rol. La dirección que sondea el beacon de Linux, 169.254.170[.]2, es el punto final de metadatos de tareas de AWS ECS: una tarea que puede acceder a él generalmente también puede recuperar las credenciales temporales de su rol de tarea desde el mismo servicio local de enlace. Una comprobación de accesibilidad desde dentro de un script de instalación es el paso que precede a la obtención de esas credenciales, por lo que cualquier ejecutor que haya ejecutado el gancho y haya podido acceder a ese punto final debe considerarse que ha tenido su rol de tarea expuesto. En un host de desarrollo o compilación de Windows, la carga útil solicita elevación y abre un canal de comandos, lo que amplía la exposición de un único perfil y salida a un control remoto interactivo.

No pudimos obtener cifras fiables de descargas de las versiones maliciosas antes de su eliminación, por lo que no podemos estimar el número de víctimas. La rápida republicación de dos de los paquetes —once y nueve versiones en cuestión de horas— mantuvo archivos recientes disponibles para los instaladores y servidores de descarga mientras se eliminaban las versiones anteriores.

Patrones emergentes

Este grupo es un ejemplo de cómo una etiqueta se utiliza como tapadera. Las denominaciones "investigación autorizada", "programa de recompensas por errores" y "pruebas en entorno aislado" se asocian cada vez más a paquetes cuyos scripts de instalación van más allá de simplemente perfilar un host. Esta estrategia se basa en la reticencia del revisor a actuar contra algo que se anuncia como autorizado. Se combina con una segunda táctica común: nombres de paquetes diseñados para parecer herramientas de integración continua internas, de modo que pasen desapercibidos en un vistazo rápido al árbol de dependencias. Esta combinación es lo que hace que valga la pena prestar atención a este patrón: un nombre que se lee como "infraestructura básica", envuelto en una prosa que se lee como una prueba autorizada, que sirve de pretexto para un gancho de instalación que escala privilegios en un sistema operativo y sondea las credenciales de la nube en otro. Ni la advertencia ni el nombre genérico cambian lo que hace el código durante la instalación, y un proceso de triaje que considere cualquiera de ellos como evidencia atenuante llegará a una conclusión errónea.

Qué deben hacer los defensores

  • Busque en los archivos de bloqueo y en los registros de instalación los seis nombres de paquete; trate cualquier coincidencia como un incidente, no como una advertencia.
  • Bloquear y alertar sobre el tráfico saliente a 173.255.233[.]239 y a *.trycloudflare[.]com hosts desde la construcción de infraestructura.
  • Búsqueda de solicitudes HTTP en tiempo de instalación a direcciones de metadatos de instancia (169.254.170.2, 169.254.169.254) originados por gestores de paquetes en CI.
  • Rote las credenciales y tokens de roles en la nube que eran accesibles desde un ejecutor que instaló una versión afectada.
  • Auditoría preinstalación/postinstalación guiones en tu conjunto de dependencias; merece la pena leer un gancho de ciclo de vida que ejecuta un segundo archivo de script.
  • En los puntos finales de Windows, busque nuevos DelegateExecute valores escritos bajo el configuración de ms clave shell-handler: la primitiva de elevación que utiliza esta carga útil y una señal confiable independiente del nombre del paquete.
  • Fije y revise los archivos de bloqueo y desactive los scripts de instalación (npm install –ignore-scripts) en CI donde tu compilación no los requiere.
  • Considere las cláusulas de exención de responsabilidad que indiquen "investigación autorizada" o que sean "inocuas" dentro de un script de instalación como texto no confiable, no como una razón para permitir la ejecución del script.

Un paquete que anuncia buenas intenciones en prosa y solicita LITE PARA TECHOS PLANOS En el código, se debe juzgar por el código.

sca-tools-software-herramientas-de-analisis-de-composicion
Priorice, solucione y proteja sus riesgos de software
Obtén tu cuenta gratuita.
Sin tarjeta de crédito.

Asegure el desarrollo y entrega de software

con la suite de productos Xygeni