Los atacantes usan el código de bytes compilado de Python para evadir la detección
Por Luciano Constantino
Redactor sénior de CSO, CSO |
Los atacantes que tienen como objetivo los repositorios de paquetes de código abierto como PyPI (Python Package Index) han ideado una nueva técnica para ocultar su código malicioso de los escáneres de seguridad, revisiones manuales y otras formas de análisis de seguridad. En un incidente, los investigadores encontraron un código de malware oculto dentro de un archivo de código de bytes de Python (PYC) que se puede ejecutar directamente en lugar de los archivos de código fuente que son interpretados por el tiempo de ejecución de Python.
"Puede ser el primer ataque a la cadena de suministro que aprovecha el hecho de que los archivos de código de bytes de Python se pueden ejecutar directamente, y se produce en medio de un aumento en los envíos maliciosos al índice de paquetes de Python", dijeron en un informe los investigadores de la firma de seguridad ReversingLabs. "Si es así, representa otro riesgo para la cadena de suministro en el futuro, ya que es probable que la mayoría de las herramientas de seguridad pasen por alto este tipo de ataque, que solo escanea archivos de código fuente (PY) de Python".
La gran mayoría de los paquetes que se encuentran en repositorios públicos como npm para JavaScript, PyPI para Python y RubyGems para Ruby consisten en archivos de código fuente abierto que se empaquetan en archivos. Son fáciles de desempaquetar y leer y, como resultado, se han creado escáneres de seguridad para estos repositorios para manejar este tipo de paquetes.
Los atacantes están en una batalla constante con las empresas de seguridad para evadir la detección, y la técnica de evasión más común cuando se trata de código de texto sin formato es la ofuscación. Esto consiste en utilizar funciones del propio lenguaje de programación, como la codificación, la decodificación o la evaluación, para hacer que el código sea ilegible pero funcional. Por ejemplo, la codificación de código malicioso en base64 es una técnica de uso común, pero las herramientas de seguridad pueden lidiar con dicha codificación.
En el ecosistema PyPI, los ciberdelincuentes detrás del malware W4SP Stealer son conocidos por emplear técnicas que incluyen codificación base64, compresión LZMA y minificación: la eliminación de espacios y comentarios del código para hacerlo más compacto pero también más difícil de leer. El grupo utiliza algunas herramientas de código abierto de terceros para lograr esto, como pyminifier, Kramer o Hyperion. En una variación de los ataques W4SP, el código malicioso ofuscado en los archivos se desplazó más allá del borde de los bordes de pantalla predeterminados, de modo que alguien que revisara manualmente el archivo de código fuente no lo viera.
Sin embargo, los archivos PYC son diferentes. No son legibles por humanos como los scripts PY de texto sin formato. Los archivos PYC se generan cuando el intérprete de Python importa o ejecuta un script de Python. Dado que ya son código interpretado (compilado), más adelante el intérprete de Python puede ejecutarlos directamente sin reinterpretar el script original. Esto ayuda con el rendimiento porque tiene tiempos de ejecución más rápidos y el uso más común de dichos archivos es en la distribución de módulos de Python.
En la mayoría de los casos de malware PyPI, el código ofuscado malicioso está destinado a llegar a una URL externa y descargar el malware, generalmente un ladrón de información, que es otra oportunidad para que las herramientas de seguridad detecten comportamientos sospechosos. En este último incidente, con un paquete llamado fshec2 que contenía un archivo PYC malicioso, la carga útil maliciosa completa puede ocultarse dentro del archivo y es mucho más difícil detectarlo si la herramienta de seguridad no está diseñada para descompilarlo.
"Los scripts de carga como los descubiertos en el paquete fshec2 contienen una cantidad mínima de código de Python y realizan una acción simple: cargar un módulo de Python compilado", dijeron los investigadores de ReversingLabs. "Simplemente resulta ser un módulo malicioso. Inspector, la herramienta predeterminada proporcionada por el equipo de seguridad de PyPI para analizar los paquetes de PyPI, por el momento no proporciona ninguna forma de analizar archivos binarios para detectar comportamientos maliciosos. Código compilado de la El archivo .PYC necesitaba ser descompilado para poder analizar su contenido".
El paquete fshec2 encontrado por ReversingLabs exhibió un comportamiento adicional que probablemente estaba destinado a evadir la detección. Normalmente, un módulo se importa desde un script de Python usando la directiva de importación. Sin embargo, el módulo PYC malicioso en este caso se cargó usando importlib, un paquete separado que implementa la funcionalidad de importación y se usa solo para casos particulares, como cuando una biblioteca importada se modifica dinámicamente al importar. En este caso, el PYC malicioso no se modificó, por lo que no hay ninguna razón técnica para usar importlib aparte de evitar el uso de la directiva de importación normal, probablemente para evadir la detección.
Una vez que se ejecuta en una máquina, la carga útil maliciosa fshec2 recopila información sobre el sistema, como nombres de usuario, listas de directorios y nombres de host, y luego configura un trabajo cron en Linux o una tarea programada en Windows para ejecutar comandos obtenidos de un servidor remoto. Los comandos permiten que el malware se actualice automáticamente, y los atacantes pueden entregar una nueva versión, así como cargas útiles adicionales en forma de secuencias de comandos de Python.
Los investigadores de ReversingLabs analizaron el servidor de comando y control y encontraron configuraciones incorrectas que les permitieron echar un vistazo a cierta información. Por ejemplo, descubrieron que las máquinas de las víctimas reciben una identificación incremental y pudieron confirmar que varias víctimas ejecutaron el malware.
"La gran cantidad de estos errores podría llevarnos a la conclusión de que este ataque no fue obra de un actor patrocinado por el estado y no una amenaza persistente avanzada (APT)", dijeron los investigadores. "Si bien mi equipo no recopiló suficiente evidencia para probar esa suposición de una forma u otra, la recopilación de los nombres de archivo incrementando la identificación del archivo nos permitió determinar que el ataque fue exitoso en algunos casos. Nuestros investigadores aún no pueden decir quién o qué objetivos Sin embargo, podemos confirmar que los desarrolladores instalaron el paquete PyPI malicioso y que, como resultado, se recolectaron los nombres de sus máquinas, nombres de usuario y listas de directorios".
Algunos de los nombres de archivo encontrados en el servidor sugieren que los atacantes implementaron la funcionalidad de registro de teclas en algunas de las máquinas.
"Históricamente, npm ha sido el líder desafortunado y PyPI también participó en la carrera para ver qué plataforma de código abierto atrae la mayor atención de los autores de malware", dijeron los investigadores. "En los últimos seis meses, sin embargo, ReversingLabs y otros han observado un marcado aumento en el volumen de malware publicado en PyPI. De hecho, en mayo, la creación de nuevas cuentas de usuario y proyectos en PyPI se suspendieron temporalmente durante unas horas debido a a un alto volumen de actividad maliciosa".
ReversingLabs informó el nuevo vector de ataque al equipo de seguridad de PyPI, quien eliminó el paquete y dijo que no había visto esta técnica de ataque antes. Esto no excluye la posibilidad de que otros paquetes similares lleguen al repositorio.
Para hacer frente a estas amenazas modernas de la cadena de suministro de software, las organizaciones necesitan más que soluciones de análisis de código estático. Necesitan herramientas que también puedan monitorear los sistemas de desarrollo confidenciales para detectar la creación de procesos sospechosos, la ejecución de archivos, el acceso a URL no autorizado, los comandos de recopilación de información y el uso de funciones fáciles de abusar como get_path o importlib.
Lucian Constantin es escritor sénior en CSO y se ocupa de la seguridad de la información, la privacidad y la protección de datos.
Derechos de autor © 2023 IDG Communications, Inc.
Código compilado versus código fuente El robo de credenciales parece ser el objetivo principal Siguiente lea esto