Um erro de digitação aparentemente inocente em um nome de módulo Go tem servido silenciosamente como um backdoor ativo por quase três anos. Pesquisadores de segurança descobriram um pacote malicioso chamado github.com/shopsprint/decimal que se passa pela biblioteca popular github.com/shopspring/decimal, diferindo apenas por uma única letra em seu nome. O pacote foi ao ar em 2017, mas foi armado em agosto de 2023, quando os atacantes inseriram uma função oculta que abre um canal de comando e controle (C2) sobre registros DNS.
Descoberta e escopo
O ataque visa desenvolvedores Go que trabalham em software financeiro, sistemas de faturamento, plataformas de criptomoedas e ferramentas de análise. Esses desenvolvedores dependem da biblioteca legítima shopspring/decimal para cálculos aritméticos precisos sem erros de arredondamento. O pacote falso espelha o real tão de perto que qualquer projeto que o importe compilará e executará normalmente, sem erros visíveis ou saída incomum para levantar suspeitas.
Pesquisadores da Socket.dev identificaram o módulo rogue e rastrearam sua atividade até o momento exato em que foi armado. A versão maliciosa é a v1.3.3, publicada em 19 de agosto de 2023, apenas sete minutos após uma versão limpa ser enviada para criar a ilusão de manutenção normal. Sete versões anteriores eram inteiramente inofensivas, uma estratégia deliberada para construir confiança antes que o ataque fosse finalmente acionado.
Vetor e exploração
O que torna essa ameaça especialmente séria é como ela sobrevive mesmo após a conta original do GitHub ser excluída. O Go Module Proxy em proxy.golang.org armazena permanentemente cada versão publicada de um módulo como parte da garantia de reprodutibilidade do Go. Isso significa que a versão maliciosa v1.3.3 permanece totalmente acessível para qualquer desenvolvedor que execute go get com esse caminho de pacote hoje, sem nenhum aviso.
A diferença inteira entre o pacote seguro e o perigoso é um único caractere. A biblioteca legítima é shopspring, enquanto o typosquat usa shopsprint, substituindo o g final por um t. O ataque ativa o momento em que qualquer binário Go que importa o pacote é executado, porque a carga maliciosa vive dentro de uma função init() que o Go executa na inicialização antes de qualquer outro código.
Uma vez acionado, o init() malicioso inicia um loop em segundo plano que contata um subdomínio DNS a cada cinco minutos, solicitando um registro TXT. Os registros TXT são um tipo de entrada DNS usado para manter texto arbitrário, que o atacante usa para entregar comandos do sistema operacional diretamente às máquinas infectadas. O subdomínio que atua como servidor de comando é dnslog-cdn-images[.]freemyip[.]com.
Impacto e alcance
O ator da ameaça permaneceu em silêncio por anos, construindo um ponto de apoio persistente dentro de ambientes de desenvolvimento em todo o mundo. Com um beacon disparando a cada cinco minutos e sem atividade de processo visível, o backdoor pode passar despercebido por semanas ou meses em qualquer máquina que importou o pacote comprometido. O tráfego DNS raramente dispara os mesmos alarmes que o HTTP de saída, permitindo que o atacante emita comandos permanecendo abaixo do radar da maioria das ferramentas de segurança.
Medidas de mitigação recomendadas
Se um desenvolvedor ou sistema CI executou código puxando a versão v1.3.3, a Socket.dev recomenda tratar esse host como comprometido. Credenciais nessa máquina, incluindo tokens Git, chaves de nuvem e chaves SSH, devem ser rotacionadas imediatamente. As equipes devem auditar seus arquivos de módulo Go por github.com/shopsprint/decimal e substituí-lo pelo pacote correto. Monitorar o tráfego DNS por consultas a freemyip[.]com de ambientes de build ou produção é fortemente recomendado.
Indicadores de comprometimento (IoCs)
- Malicious Go Module:
github.com/shopsprint/decimal(v1.3.3) - Malicious Commit Hash:
2f0ee073c6f29d66188a845592029c9b52528f04 - C2 Domain:
dnslog-cdn-images[.]freemyip[.]com - Parent Domain:
freemyip[.]com