Investigadores de la empresa Socket descubrieron una campaña denominada GemStuffer, en el marco de la cual se cargaron más de 150 paquetes en el repositorio RubyGems con un objetivo atípico: utilizar el registro de paquetes no para distribuir código malicioso entre desarrolladores, sino como canal para almacenar y extraer datos recopilados de portales de gobiernos locales del Reino Unido. La campaña afecta tanto al ecosistema RubyGems en general como a los operadores de portales públicos basados en la plataforma ModernGov, aunque los objetivos finales de los atacantes siguen sin estar claros.
Mecánica del ataque: el registro como almacén
Según los investigadores, los paquetes GemStuffer no estaban diseñados para comprometer masivamente a los desarrolladores. Muchos de ellos prácticamente no tenían descargas, y la carga útil se describe como repetitiva, ruidosa y de una autonomía inusualmente alta. En lugar de introducir backdoors o robar credenciales, los scripts dentro de los paquetes realizaban una tarea completamente distinta:
- Cargaban páginas desde URL codificadas de forma rígida de portales de consejos municipales del Reino Unido
- Empaquetaban las respuestas HTTP obtenidas en archivos válidos con formato
.gem - Publicaban estos archivos de nuevo en RubyGems, utilizando API keys del registro incrustadas en el código
Los investigadores identificaron dos variantes de implementación. En la primera, la carga útil creaba un entorno temporal con credenciales de RubyGems en el directorio /tmp, sobrescribía la variable de entorno HOME, compilaba el paquete localmente y lo enviaba mediante la interfaz de línea de comandos gem. En la segunda, el archivo se cargaba directamente en el API de RubyGems mediante una petición HTTP POST, sin pasar por la CLI. Tras la publicación, para extraer los datos recopilados bastaba con ejecutar el comando gem fetch indicando el nombre y la versión del paquete.
Este enfoque convierte un registro público de paquetes en una especie de almacenamiento en la nube, accesible sin autenticación en la fase de lectura. Esto difiere de forma fundamental de los ataques típicos a la cadena de suministro, donde los paquetes maliciosos están pensados para ser instalados por las víctimas.
Datos objetivo y motivaciones poco claras
Según se informa, la campaña estaba dirigida a portales públicos del sistema ModernGov, utilizados por los consejos municipales de Lambeth, Wandsworth y Southwark, distritos de Londres. La información recopilada incluía:
- Calendarios de reuniones de los comités
- Listas de puntos del orden del día
- Documentos PDF relacionados
- Datos de contacto de cargos públicos
- Contenido de fuentes RSS
Es significativo que toda esta información ya se encuentre en acceso abierto en los portales de los municipios. Esto hace que el objetivo final de la campaña no sea evidente. Socket propone varias posibles interpretaciones: spam de registro, prototipo de gusano, scraper automatizado que abusa de RubyGems como capa de almacenamiento, o pruebas dirigidas de las posibilidades de abuso de los registros de paquetes.
Vínculo con el incidente en RubyGems
La campaña GemStuffer fue identificada en el contexto de que RubyGems desactivó temporalmente el registro de nuevas cuentas tras un ataque malicioso a gran escala. No se ha confirmado una relación directa entre estos sucesos; sin embargo, Socket señala que GemStuffer encaja en el mismo patrón de abusos: creación de nuevos paquetes con nombres sin sentido para alojar datos. Debe tenerse en cuenta que en las fuentes disponibles no se aporta una confirmación oficial por parte de RubyGems sobre la relación entre estos incidentes.
Evaluación del impacto
La amenaza directa para los desarrolladores que utilizan RubyGems en este caso es mínima: los paquetes no están destinados a ser instalados en proyectos y no contienen código malicioso tradicional. No obstante, el precedente en sí pone de manifiesto un problema grave: los registros de paquetes pueden utilizarse como infraestructura para operaciones no relacionadas con la distribución de software. Esto genera carga para la moderación, llena el registro de ruido y potencialmente socava la confianza en el ecosistema.
Para los operadores de portales ModernGov, la recopilación sistemática de datos públicos no constituye por sí misma una brecha de seguridad, pero puede ser indicio de actividad de reconocimiento, especialmente en lo relativo a los datos de contacto de cargos públicos.
Recomendaciones
- Administradores de dependencias RubyGems: comprueben si han aparecido en las dependencias de sus proyectos paquetes desconocidos con nombres sin sentido y un número mínimo de descargas. Utilicen herramientas de análisis de dependencias para identificar paquetes anómalos.
- Operadores de portales ModernGov: analicen los logs de los servidores web en busca de peticiones automatizadas sistemáticas a páginas de reuniones, órdenes del día y datos de contacto. Consideren implantar limitaciones de frecuencia de peticiones para protegerse contra el scraping masivo.
- Equipos de seguridad de registros de paquetes: el incidente subraya la necesidad de monitorizar no solo el contenido malicioso de los paquetes, sino también patrones anómalos de publicación, como la generación masiva de paquetes con incremento de versiones y credenciales incrustadas.
- Titulares de API keys de RubyGems: asegúrense de que sus claves no estén comprometidas. Rote las claves si sospechan de una filtración y activen la autenticación de dos factores para la publicación de paquetes.
La campaña GemStuffer es un caso atípico de abuso de un registro de paquetes, en el que RubyGems se utiliza no como vector de ataque contra desarrolladores, sino como infraestructura gratuita de almacenamiento de datos. Independientemente de si se trata de una prueba de concepto o de parte de una operación más amplia, el incidente pone de relieve la necesidad de ampliar los modelos de detección de amenazas en los ecosistemas de paquetes más allá de la búsqueda tradicional de código malicioso, incorporando el análisis de patrones de comportamiento en la publicación y del contenido de los paquetes.