Aikido

La puerta trasera de npm permite a los hackers manipular los resultados de los juegos de azar.

Nuestras líneas de detección de malware se activaron recientemente ante un pequeño grupo de paquetes en npm que parecían... familiares.

Paquetes como json-bigint-extender, jsonfx, y jsonfb imitaron al popular json-entero grande biblioteca: misma funcionalidad, un archivo README idéntico e incluso un nombre de autor inquietantemente parecido al del mantenedor original.

La mayoría de las veces, este patrón indica ataques comunes a la cadena de suministro, como el typosquatting y la confusión de dependencias, diseñados para comprometer los sistemas y filtrar secretos. Pero este caso se percibió como diferente casi de inmediato.

No intentaba golpear a todo el mundo. Intentaba golpear algo.

El secuestro

A primera vista, json-bigint-extender se comporta exactamente igual que el legítimo json-entero grande biblioteca: exporta las conocidas funciones parse/stringify utilizadas para admitir números enteros grandes en JSON. De hecho, la mayoría de los desarrolladores y organizaciones no notarían nada inusual. Esta carga útil está diseñada específicamente para permanecer inactiva y solo activarse cuando detecta que se está ejecutando dentro de un entorno de destino específico, comprobando el valor de una variable de entorno específica llamada SERVICE_NAME.

Una vez que detecta que se encuentra en el entorno adecuado, instala dos puertas traseras:

En primer lugar, instala un middleware Express específico, conectado específicamente a una ruta de pago (/v1/pago/compra-de-productos). Este middleware está diseñado para ejecutar dinámicamente código adicional obtenido desde un punto final. Tras una inspección más detallada del código obtenido, parece tratarse de un complejo sistema de reescritura de flujo de caja utilizado para manipular un juego de apuestas.

const routeInjectionRules = {
    '/v1/pay/purchase-goods': {
      identify: function (handlers, fn, index) {
        ...
      },
      position: 'after',
      extraMiddlewares: [function (req, res, next) {
       // Translation: [Plugin] Mount risk middleware as post-payment success logic.
log('[插件] 支付成功后的后置逻辑挂载risk'); 
       riskCode(req, res, next); // Executes dynamically fetched code
      }]
    }
  };

En segundo lugar, un middleware a nivel de prototipo que modifica silenciosamente Express.js, añadiendo middleware global a cada Ruta POST. Este middleware escucha un secreto. x-operación encabezado y desbloquea cuatro tipos de comandos para el operador:

  1. RunSQL: ejecuta SQL arbitrario en la base de datos de producción.
  2. RunFileList: lista los archivos y directorios del lado del servidor.
  3. RunFileContent: descarga el contenido de un archivo seleccionado.
  4. ComprimirDescargar: descargar un directorio como archivo zip.

El panel de control del operador

Dentro del paquete, también hay una página HTML incrustada para un «servicio de descarga de compresión de directorios» (título en chino: Servicio de descarga de archivos comprimidos).

Panel de control del operador

Aunque esta página nunca se conectó a ninguna parte del código de la puerta trasera que observamos, parece ser una interfaz de usuario orientada al operador para navegar y extraer directorios como archivos zip.

Manipulación de los resultados de los juegos de azar

Lo que da miedo: eso. código de riesgo(...) La función llamada en el middleware se controla de forma remota y se actualiza cada 30 segundos. 

Aunque la carga útil aún no se ha invocado activamente, hemos observado una lógica capaz de ajustar retroactivamente el historial reciente de juego de un usuario para que su saldo se modifique en la cantidad elegida, al tiempo que se reconstruye toda la cadena de saldos para que los registros del juego sigan pareciendo coherentes internamente.

Es un sofisticado equilibrador y reescritor de la historia que:

  • Lee las filas de flujo de caja recientes de un usuario.
  • Selecciona una ventana de rondas de juego.
  • Ajusta los valores de apuesta/pago para alcanzar una cantidad objetivo en la cartera del usuario.
  • Reconstruye los registros completos del juego para que sigan siendo coherentes internamente en la base de datos.

Eso significa que el objetivo no es solo el fraude. Se trata de un fraude que supera los controles de coherencia internos, falsificando ganancias y pérdidas mientras se mantiene la coherencia contable.

Algunas de las referencias circundantes apuntan a una aplicación de apuestas llamada Bappa Rummy, ampliamente publicitada en línea a través de programas de referencia y tiendas de aplicaciones alternativas, pero que ya no está disponible en la tienda oficial Google Play.

Detección y prevención

Aunque no sabemos quién está detrás de la puerta trasera, lo que da miedo es lo que hace una vez que llega al entorno adecuado. No se trata «solo» de un implante de dependencia típico que extrae código fuente, secretos o datos de clientes.

En cambio, se conecta directamente a la lógica empresarial, ejecuta código controlado de forma remota en el tráfico real y puede reescribir el historial financiero respaldado por la base de datos. Si su supervisión asume que los registros de la base de datos son fiables, este tipo de manipulación puede permanecer invisible durante mucho tiempo.

Si ya utiliza Aikido, este paquete aparecería marcado en su feed como un hallazgo crítico 100/100.

¿Aún no estás en Aikido? Crea una cuenta gratuita y vincula tus repositorios. El plan gratuito incluye nuestra cobertura de detección de malware (no se requiere tarjeta de crédito).

Por último, disponer de una herramienta capaz de detener el malware en tiempo real tan pronto como aparece puede evitar infecciones graves. Esta es la idea que subyace a Aikido Safe Chain, una herramienta gratuita y de código abierto que envuelve npm, npx, yarn, pnpm y pnpx y utiliza tanto inteligencia artificial como investigadores humanos especializados en malware para detectar y bloquear los últimos riesgos de la cadena de suministro antes de que entren en su entorno.

Indicadores de compromiso

Paquetes y autores:

  • jsonfb (por sidoraress)
  • jsonfx (por sidoraress)
  • json-bigint-extend (por sidoraress e infinitynodestudio)

La puerta trasera se comunica con un host remoto tanto para actualizaciones de carga útil como para registro.

Criterios de valoración observados:

  • https://payment[.]y1pay[.]vip/v1/risk/get-risk-code
  • https://payment[.]y1pay[.]vip/v1/risk/log
  • https://payment[.]snip-site[.]cc

Otros IOC y comportamientos susceptibles de ser detectados:

  • Solicitudes que contienen el encabezado x-operation con uno de los cuatro tokens de operación:
    • RunSQL (token: cfh2DNITa84qpYQ0tdCz)
    • RunFileList (token: m3QiEkg8Y1r9LFTI5e4f)
    • RunFileContent (token: Y3SrZjVqWOvKsBdpTCh7)
    • ComprimirDescargar (token: SJQf31UJkZ1f88q9m361)
  • Modificaciones en tiempo de ejecución a express.Route.prototype.post

Escrito por
Ilyas Makari
Compartir:

https://www.aikido.dev/blog/npm-backdoor-lets-hackers-hijack-gambling-outcomes

Suscríbase para recibir noticias sobre amenazas.

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.