Aikido

Gone Phishin': pacotes npm que servem páginas personalizadas para recolha de credenciais

Charlie EriksenCharlie Eriksen
|
#
#
#

Às 18:03 UTC de 20 de janeiro de 2026, o nosso sistema começou a alertar-nos sobre um novo pacote npm chamado flockiali. Em 26 minutos, o atacante publicou quatro versões. Dois dias depois, eles entraram numa onda de publicações: opresc, prndn, oprnm, e operniQuando analisámos mais de perto, descobrimos uma campanha de spear phishing altamente direcionada que atingia funcionários de empresas industriais e energéticas na Europa, no Médio Oriente e nos Estados Unidos.

E o mecanismo de entrega? npm + jsDelivr. Porque porquê hospedar a sua própria infraestrutura de phishing quando pode aproveitar a CDN de outra pessoa?

O que descobrimos

Os pacotes contêm um único ficheiro JavaScript que, quando carregado, substitui completamente a página web por um kit de phishing. Mas eis o que torna isto interessante: cada versão tem como alvo uma pessoa específica.

Encontrámos cinco alvos em cinco empresas:

  • flockiali A versão 1.2.5 tem como alvo alguém da CQFD Composites, um fabricante francês de compósitos.
  • flockiali A versão 1.2.6 tem como alvo alguém da Ingeteam, uma empresa espanhola de turbinas eólicas.
  • opresc A versão 1.0.0 tem como alvo alguém da Emagine, uma empresa de carregamento de veículos elétricos dos Emirados Árabes Unidos.
  • prndn e oprnm ambos têm como alvo a mesma pessoa na Amixon GmbH, uma empresa alemã de mistura industrial
  • operni A versão 1.2.7 tem como alvo alguém da CMC America, uma empresa norte-americana de equipamentos de panificação.

O invasor não está a agir de forma aleatória. Ele está a publicar novos pacotes para cada alvo. E quando um alvo é particularmente interessante, ele publica vários pacotes com diferentes caminhos de entrega.

O fluxo do ataque

Eis o que acontece quando uma vítima abre o link de phishing.

A página carrega mostrando uma interface falsa de partilha de ficheiros "Micro-Share":

📁 Micro -Share
   partilha segura de ficheiros
   Documentos partilhados de forma segura, por favor verifique o seu e-mail e continue.
   Os seguintes documentos foram partilhados de forma segura com [vítima]@ingeteam.com

   📄 Especificação.pdf
      - RFQ.pdf
      - Descrições do projeto.pdf
      - Destino final do equipamento.pdf

                   [ Descarregar ]

Os documentos são relacionados à engenharia: solicitações de cotação, especificações de projetos, ficheiros CAD. Exatamente o que se esperaria que alguém em uma empresa industrial recebesse.

Quando a vítima clica em «Download», a página muda para um ecrã de login com a marca Microsoft:

⊞ Microsoft

Iniciar sessão

⚠ Autenticação necessária. Clique em «Seguinte» para iniciar sessão e continuar o download.

┌────────────────────────────────────────┐
│ [vítima]@ingeteam.com                  │  (somente leitura)
└────────────────────────────────────────┘

Não tem conta? Crie uma
Não consegue acessar sua conta?

                             [ Próximo ]

O e-mail da vítima já está preenchido e marcado como somente leitura. Quando clica em «Próximo», é redirecionado para o servidor de recolha de credenciais:

janela.location.href = "https://login.siemensergy[.]icu/DIVzTaSF";

Sim, siemensergy[.]icu. Trata-se de um typosquat da Siemens Energy. O atacante claramente fez o seu trabalho de casa sobre com quem os seus alvos fazem negócios.

Truques anti-bot

O kit de phishing não está para brincadeiras. Ele inclui várias técnicas para evitar análises automatizadas.

Verifica se existe WebDriver (navigator.webdriver), listas de plugins vazias e dimensões de ecrã nulas. Filtra os agentes do utilizador que correspondem a /bot|crawl|spider|headless|HeadlessChrome/i. Inclui campos de formulário honeypot que, se preenchidos por bots, acionam o kill switch. E o botão de download permanece desativado até que a página detecte movimentos do rato ou eventos de toque. Sem interação, sem phishing.

v1.2.5 vai além com um analisador de trajetória do mouse surpreendentemente sofisticado:

isLegitimateTrajectory() {
  if (this.mouseTrail.length < 20) return false;
  const t = this.mouseTrail.slice(-10);
  const variance = t.reduce((acc, p) => 
    acc + Math.pow(p.x - t[0].x, 2), 0) / 10;
  return variance > 100;
}

Isto calcula a variação das últimas 10 posições do rato. Se o cursor se moveu numa linha suspeitamente reta (como um bot faria), a variação permanece baixa e o botão nunca é ativado. Pessoas reais movem-se.

Alguém se esforçou bastante para criar este kit de phishing.

Cinco pacotes, cinco alvos, dois modelos

As versões de carga útil não visam apenas pessoas diferentes. Elas utilizam dois designs diferentes de kits de phishing.

O v1.2.5 A carga útil (direcionada à CQFD Composites) usa a marca «MicroSecure Pro» com um gradiente roxo e a fonte Inter. Ela mostra ficheiros CAD e resultados de engenharia como isca, possui um sofisticado analisador de trajetória do mouse e envia credenciais para oprsys.deno[.]dev.

O resto (v1.2.6, opresc, prndn, oprnm, operni) utilizam um design mais limpo, "Micro-Share", com fundo branco e fonte Segoe UI. Mostram pedidos de orçamento e especificações de projetos, utilizam verificações básicas de interação e enviam credenciais para os typosquats da Siemens Energy.

O v1.2.5 O kit é mais chamativo, com animações e fundos gradientes. Os kits mais recentes são mais minimalistas, mais próximos da aparência real da Microsoft. Talvez o invasor tenha feito testes A/B e descobriu que os mais simples convertem melhor. Ou talvez eles estejam apenas iterando.

A carga útil do CMC America (operni) personalizou iscas documentais para a indústria alimentar: «Especificações do produto e detalhes dos ingredientes», «Metas de capacidade de produção e parâmetros operacionais». O atacante está a personalizar a sua isca.

O que é interessante é a escolha do C2. Todos os alvos recentes são enviados para typosquats da Siemens Energy. Isso não é aleatório. A Ingeteam fabrica turbinas eólicas. A Emagine faz infraestrutura de carregamento de veículos elétricos. A Amixon e a CMC America fabricam equipamentos de mistura industrial (a Amixon até trabalha com materiais para baterias). Todas operam em mercados onde a Siemens Energy é um participante importante. O atacante pesquisou as relações comerciais dos seus alvos.

Observe a evolução subtil: siemensergy[.]icu (sem hífen) tornou-se siemens-energy[.]icu (com hífen). A segunda variante está mais próxima da realidade. siemens-energy[.]com domínio. Confirmámos através do DNS que o domínio sem hífen não tem nenhum registo. O invasor abandonou-o.

A infraestrutura conta uma história

É aqui que fica interessante. Usámos registos de transparência de certificados para verificar quando a infraestrutura C2 foi configurada. O primeiro certificado SSL para *.siemens-energy[.]icu foi emitido em 24 de outubro de 2025. Em seguida, houve renovações em 14, 16 e 17 de janeiro. A campanha npm começou em 20 de janeiro.

O invasor registou o domínio e obteve certificados SSL três meses antes do aparecimento dos pacotes npm. Pense nisso. Não se trata de oportunismo. Alguém planeou essa operação, montou a infraestrutura em outubro de 2025 e depois esperou.

O servidor C2 (163.123.236[.]118) é hospedado pela RackGenius, um pequeno provedor de hospedagem em Muskegon, Michigan. Enquanto isso, o antigo v1.2.5 utilizações da carga útil oprsys.deno[.]dev, que resolve para Cloud do Google Cloud (Deno Deploy). Hospedagem sem servidor gratuita para phishing. Clássico. Notificamos a equipa Deno sobre esta campanha quando a observámos, e eles foram muito rápidos em removê-la. 

Porquê npm + jsDelivr?

O ficheiro package.json conta a história:

{
  "keywords": ["jsdelivr", "cdn", "template"],
  "main": "resp/template.min.js"
}

O jsDelivr espelha automaticamente os pacotes npm. Publique no npm e obtenha hospedagem CDN instantânea em cdn.jsdelivr[.]net/npm/flockiali@1.2.6/resp/template.min.jsSem servidores para manter, sem hospedagem para pagar, e a vítima vê um URL CDN com aparência legítima em vez de um domínio de phishing suspeito.

A linha do tempo

20 de janeiro (quatro versões em 26 minutos):

  • 18:03 UTC: flockiali v1.2.3 (espaço reservado vazio)
  • 18:10 UTC: flockiali v1.2.4 (atualização de metadados)
  • 18:15 UTC: flockiali v1.2.5 (Meta da CQFD Composites)
  • 18:29 UTC: flockiali v1.2.6 (meta Ingeteam)

22 de janeiro (mais cinco pacotes):

  • 09:52 UTC: opresc v1.0.0 (alvo Emagine)
  • 12:29 UTC: prndn v1.0.0 (alvo Amixon)
  • 12:49 UTC: oprnm v1.0.0 (Amixon novamente)
  • 13:11 UTC: operni v1.2.6 (danificado, vazio)
  • 13:16 UTC: operni v1.2.7 (alvo CMC América)

O invasor tem uma lista de alvos e está a trabalhar nela. O funcionário da Amixon recebeu dois pacotes com 20 minutos de diferença (exagero, não?). O pacote da CMC America tinha um erro ortográfico (reps/ em vez de resp/) e uma primeira versão defeituosa. Opa. Este invasor está a agir rapidamente e a cometer erros.

O que você deve fazer?

Se estiver numa das empresas visadas, verifique se alguém recebeu links para URLs do jsDelivr ou clicou em algo relacionado com a partilha de documentos «Micro-Share».

Pesquisar registos de e-mail por links que contenham cdn.jsdelivr[.]net/npm/flockiali, cdn.jsdelivr[.]net/npm/opresc, cdn.jsdelivr[.]net/npm/prndn, cdn.jsdelivr[.]net/npm/oprnm, ou cdn.jsdelivr[.]net/npm/operniBloqueie os domínios do COI no seu perímetro. Se as credenciais foram introduzidas, altere-as imediatamente.

Indicadores de Comprometimento

Domínios C2:

  • login.siemens-energy[.]icu (163.123.236[.]118, RackGenius)
  • login.siemensergy[.]icu (abandonado, sem DNS)
  • oprsys.deno[.]dev (34.120.54[.]55, Deno Deploy)

URLs de phishing:

  • https://login.siemensergy[.]icu/DIVzTaSF
  • https://login.siemens-energy[.]icu/DIVzTaSF

URLs jsDelivr:

  • hxxps://cdn.jsdelivr[.]net/npm/flockiali@1.2.6/resp/template.min.js
  • hxxps://cdn.jsdelivr[.]net/npm/flockiali@1.2.5/resp/template.min.js
  • hxxps://cdn.jsdelivr[.]net/npm/opresc@1.0.0/resp/template.min.js
  • hxxps://cdn.jsdelivr[.]net/npm/prndn@1.0.0/template.min.js
  • hxxps://cdn.jsdelivr[.]net/npm/oprnm@1.0.0/resp/template.min.js
  • hxxps://cdn.jsdelivr[.]net/npm/operni@1.2.7/reps/template.min.js

Pacotes:

  • flockiali (1.2.3-1.2.6)
  • opresc (1.0.0)
  • prndn (1.0.0)
  • oprnm (1.0.0)
  • operni (1.2.6-1.2.7)

Hashes da carga útil (SHA256):

  • 3ceb182fb32a8fb0f0fcf056d6ab8de1cf6e789053f1aadc98ba315ae9a96f0c – flockiali 1.2.6
  • fdb6c79a8d01b528698c53ebd5030f875242e6af93f6ae799dee7f66b452bf3e – flockiali 1.2.5
  • 4631584783d84758ae58bc717b08ac67d99dee30985db18b9d2b08df8721348e – opresc
  • 211f88a55e8fe9254f75c358c42bb7e78e014b862de7ea6e8b80ed1f78d13add – prndn/oprnm
  • 7d7f795ac1fcb5623731a50999f518877fd423a5a98219d0f495c488564a1554 – operni 1.2.7

4.7/5

Proteja seu software agora

Comece Gratuitamente
Não é necessário cc
Agendar uma demonstração
Seus dados não serão compartilhados · Acesso somente leitura · Não é necessário cartão de crédito

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.