El último ataque a los usuarios de PyPI muestra que los delincuentes solo están mejorando

El último ataque a los usuarios de PyPI muestra que los delincuentes solo están mejorando
Una calavera y tibias cruzadas en la pantalla de una computadora están rodeadas de unos y ceros.

Recientemente se cargaron más de 400 paquetes maliciosos en PyPI (Python Package Index), el repositorio de código oficial para el lenguaje de programación Python, en la indicación más reciente de que atacar a los desarrolladores de software que usan esta forma de ataque no es una moda pasajera.

Los 451 paquetes encontrado recientemente por la firma de seguridad Phylum contenía cargas útiles maliciosas casi idénticas y se cargaron en ráfagas que se sucedieron rápidamente. Una vez instalados, los paquetes crean una extensión JavaScript maliciosa que se carga cada vez que se abre un navegador en el dispositivo infectado, un truco que le da al malware persistencia durante los reinicios.

El JavaScript monitorea el portapapeles del desarrollador infectado en busca de cualquier dirección de criptomoneda que pueda copiarse en él. Cuando se encuentra una dirección, el malware la reemplaza con una dirección que pertenece al atacante. El objetivo: interceptar los pagos que el desarrollador pretendía realizar a una parte diferente.

En noviembre, Phylum docenas identificadas de paquetes, descargados cientos de veces, que usaban JavaScript altamente codificado para hacer lo mismo de manera subrepticia. Específicamente, es:

  • Creó un área de texto en la página.
  • Pegó cualquier contenido del portapapeles en él
  • Usó una serie de expresiones regulares para buscar formatos de direcciones de criptomonedas comunes
  • Reemplazó cualquier dirección identificada con las direcciones controladas por el atacante en el área de texto creada anteriormente
  • Copié el área de texto al portapapeles.

“Si en algún momento un desarrollador comprometido copia una dirección de billetera, el paquete malicioso reemplazará la dirección con una dirección controlada por el atacante”, escribió el director técnico de Phylum, Louis Lang, en la publicación de noviembre. “Esta búsqueda/reemplazo subrepticio hará que el usuario final envíe inadvertidamente sus fondos al atacante”.

Nuevo método de ofuscación

Además de aumentar enormemente la cantidad de paquetes maliciosos cargados, la última campaña también utiliza una forma significativamente diferente para cubrir sus huellas. Mientras que los paquetes revelados en noviembre usaban codificación para ocultar el comportamiento de JavaScript, los nuevos paquetes escriben identificadores de funciones y variables en lo que parecen ser combinaciones aleatorias de 16 bits de ideogramas en chino que se encuentran en la siguiente tabla:

Punto de código Unicode Ideografía Definición
0x4eba gente hombre; gente; humanidad; alguien más
0x5200 cuchillo cuchillo; moneda antigua; medida
0x53e3 boca boca; Final abierto; portón de entrada
0x5973 femenino mujer, niña; femenino
0x5b50 Niño niño; fruto, semilla de
0x5c71 Montaña montaña, colina, pico
0x65e5 Día sol; día; tiempo de día
0x6708 luna luna; mes
0x6728 madera árbol; madera, madera aserrada; de madera
0x6c34 agua agua, líquido, loción, jugo
0x76ee ojo ojo; ver ver; división, tema
0x99ac caballo caballo; apellido
0x9a6c caballo caballo; apellido
0x9ce5 pájaro pájaro
0x9e1f pájaro pájaro

Usando esta tabla, la línea de código

''.join(map(getattr(__builtins__, oct.__str__()[-3 << 0] + hex.__str__()[-1 << 2] + copyright.__str__()[4 << 0]), [(((1 << 4) - 1) << 3) - 1, ((((3 << 2) + 1)) << 3) + 1, (7 << 4) - (1 << 1), ((((3 << 2) + 1)) << 2) - 1, (((3 << 3) + 1) << 1)]))

crea la función incorporada chr y asigna la función a la lista de enteros [119, 105, 110, 51, 50]. Luego, la línea la combina en una cadena que finalmente crea 'win32'.

Los investigadores de Phylum explicaron:

Podemos ver una serie de este tipo de llamadas oct.__str__()[-3 << 0]

. El [-3 << 0] evalúa a [-3] y oct.__str__() evalúa a la cadena '<built-in function oct>'. Usando el operador de índice de Python [] en una cuerda con un -3 tomará el tercer carácter desde el final de la cadena, en este caso '<built-in function oct>'[-3] evaluará a 'c'. Continuando con esto en los otros 2 aquí nos da 'c' + 'h' + 'r' y simplemente evaluando la compleja aritmética bit a bit añadida al final nos deja con:

''.join(map(getattr(__builtins__, 'c' + 'h' + 'r'), [119, 105, 110, 51, 50]))

El getattr(__builtins__, 'c' + 'h' + 'r') solo nos da la función incorporada chr y luego mapea chr a la lista de enteros [119, 105, 110, 51, 50] y luego lo une todo en una cadena que finalmente nos da 'win32'. Esta técnica se continúa a lo largo de la totalidad del código.

Si bien da la apariencia de un código altamente ofuscado, la técnica en última instancia es fácil de derrotar, dijeron los investigadores, simplemente observando lo que hace el código cuando se ejecuta.

El último lote de paquetes maliciosos intenta capitalizar los errores tipográficos que cometen los desarrolladores al descargar uno de estos paquetes legítimos:

  • bitcoinlib
  • ccxt
  • criptocomparar
  • criptoalimentación
  • comerciofrecuencia
  • selenio
  • solana
  • víbora
  • enchufes web
  • finanzas
  • pandas
  • matplotlib
  • aiohttp
  • hermosa sopa
  • tensorflow
  • selenio
  • raspado
  • colorama
  • scikit-aprender
  • antorcha
  • Pygame
  • pyinstaller

Los paquetes que apuntan al paquete legítimo de vyper, por ejemplo, usaron 13 nombres de archivo que omitieron o duplicaron un solo carácter o transpusieron dos caracteres del nombre correcto:

  • yper
  • vper
  • puntos de vista
  • vipe
  • vvyper
  • vyyper
  • víbora
  • vipeer
  • vyperr
  • yvper
  • vpyer
  • lavado
  • lavar

“Esta técnica es trivialmente fácil de automatizar con un script (dejamos esto como un ejercicio para el lector), y a medida que aumenta la longitud del nombre del paquete legítimo, también aumentan los posibles errores tipográficos”, escribieron los investigadores. “Por ejemplo, nuestro sistema detectó 38 typosquats del cryptocompare paquete publicado casi simultáneamente por el usuario llamado pinigin.9494.”

La disponibilidad de paquetes maliciosos en repositorios de códigos legítimos que se parecen mucho a los nombres de los paquetes legítimos se remonta al menos a 2016, cuando un estudiante universitario subió 214 paquetes con trampas explosivas a los repositorios PyPI, RubyGems y NPM que contenían nombres de paquetes legítimos ligeramente modificados. . El resultado: el código impostor se ejecutó más de 45 000 veces en más de 17 000 dominios separados, y más de la mitad recibió derechos administrativos todopoderosos. Los llamados ataques de typosquatting han florecido desde entonces.

Los nombres de los 451 paquetes maliciosos que encontraron los investigadores de Phylum están incluidos en la entrada del blog. No es una mala idea para cualquiera que tenga la intención de descargar uno de los paquetes legítimos destinados a verificar que no hayan obtenido un doppelganger malicioso sin darse cuenta.

Leave a Reply

Your email address will not be published. Required fields are marked *