forge-jsxy npm Infostealer: Guia de Indicadores de Comprometimento (IOCs) e Detecção

forge-jsxy: O ladrão de informações do npm que vive mudando de nome

TL, DR

Por aproximadamente dois meses, um único infostealer do npm ressurgiu sob uma série rotativa de nomes de pacotes, embora distribuindo uma carga útil quase inalterada. Ele começou abertamente como forge-jsxy, gerado forge-jsx3 / forge-jsx4 irmãos, depois abandonaram completamente a marca "forge" para se apresentarem como infraestrutura de desenvolvedores — primeiro zredis-typedE, mais recentemente pinokio-redis.

Cada variante carrega o mesma cadeia de ferramentas interna: arquivos nomeados forge-jsx-explorer-* relayPackageServe módulo que serve um forge-jsxy-package.tgze um ambiente de execução durável oculto em um diretório pontilhado, de forma que sobreviva à exclusão do pacote npm.

A carga útil diz: material para carteira de criptomoedas e as credenciais de desenvolvedor do host, transmitindo-as para o Discord web.hooksO HuggingFace Hub realiza uploads e possui um endpoint C2 fixo. Ele instala inicialização automática no nível do sistema operacional para que seja executado novamente após a reinicialização e captura a atividade da área de transferência, do teclado e da tela. A variante mais recente, pinokio-redis, se descreve como uma integração com o "Autodesk Forge" — uma descrição que não tem relação com o que o código faz.

Ecossistemanpm
Classe PayloadAgente de roubo de informações em múltiplos estágios + agente de controle remoto (RAT)
Metas principaiscarteiras de criptomoedas, extensões de carteira para navegador, credenciais de desenvolvedor/nuvem
Persistênciaruntime oculto e durável + inicialização automática do SO (sobrevive à remoção do pacote)
exfiltrationdiscórdia na webhooks + relé, Hub HuggingFace, C2 fixo na porta 9877
Extensão observadaMaio de 2026 – Julho de 2026 (em andamento)
Último nomepinokio-redis:1.0.127

Anatomia do Ataque

Todas as variantes desta família são instaladas através do mesmo formato: um pacote. que parece inerte em sua página de listagem, mas declara um gancho de pós-instalação, então A carga útil é executada no momento em que o pacote é instalado como uma dependência. O gancho aciona uma corrente de cinco estágios.

  • Etapa 1 — materializar. O script de instalação decodifica um arquivo agrupado e codificado. O arquivo é compilado em um conjunto de scripts de tempo de execução e gravado em um diretório oculto sob o local de configuração da plataforma (as versões forge-jsxy usavam um caminho pontilhado .forge-jsxy/runtime/v). / caminho). Como esta cópia reside fora de node_modules, remover ou cancelar a publicação do pacote npm não remove o agente em execução.
  • Etapa 2 — persistir. A cadeia registra uma entrada de inicialização automática do sistema operacional para que o agente seja reiniciado na reinicialização. No Windows, isso é executado por meio de um script de diagnóstico oculto do PowerShell; o processo do agente é iniciado separadamente e com a opção windowsHide ativada para que nenhuma janela do console seja exibida.
  • Etapa 3 — evasão. O ambiente de execução verifica a presença de marcadores de integração contínua e encerra silenciosamente ao detectar um ambiente de CI, de modo que os ambientes de teste automatizados não detectam nada. Nas versões do forge-jsxy, um comentário no código-fonte afirmava que um campo visível, forgeInstall, foi deliberadamente omitido do package.json "porque esse campo seria visível no npm" — o operador manteve os metadados do gatilho fora da lista pública de propósito.
  • Etapa 4 — coletar. Uma vez em execução, o agente colhe os frutos em uma única passagem:
  1. Material para carteira de criptomoedas. Uma lista de alvos secret_filename_patterns.json agrupada executa uma varredura do sistema de arquivos em busca de wallet.dat, *.mnemonic /Arquivos .seed / *.phrase, keypair.json, Ethereum UTC– O pacote inclui keystores e keystores *.p12 / *.pfx / *.jks. Bibliotecas de derivação de carteiras (bip39, secp256k1, base58check e auxiliares Solana) também estão presentes.
  2. Extensões de carteira para navegador. O módulo chromiumExtensionDbHarvest lê os bancos de dados de armazenamento de extensões locais dos navegadores Chromium, o local onde as extensões de carteira baseadas em navegador armazenam seus dados de cofre.
  3. Credenciais e segredos. O agente analisa o histórico do shell e arquivos que contêm segredos, lê as credenciais de desenvolvedor/nuvem e, em seguida, codifica as credenciais do HuggingFace para upload.
  4. Entrada ao vivo. O conteúdo da área de transferência, as entradas do teclado e as capturas de tela são registrados continuamente.
  • Etapa 5 — exfiltraçãoOs dados coletados saem do host por três vias. Canais operando em paralelo: Discord webhooks (discordWebhookPost) e um servidor de retransmissão do Discord que se comunica com `discord.com/api/v10` (discordRelayUpload), uploads do HuggingFace Hub (hfUpload) e um O endpoint C2 codificado foi alcançado pela porta 9877. Um relayPackageServe O módulo também fornece um arquivo forge-jsxy-package.tgz como saída — o mesmo O nome do artefato persiste em todas as renomeações.

O ponto estrutural importante é que as etapas 1 a 3 são executadas durante a instalação com Sem interação do usuário, e a etapa 1 coloca a carga útil em algum lugar do pacote. O gerente não acompanha. Um desenvolvedor que percebe a dependência estranha e Executar o comando `npm uninstall` remove a listagem, mas não o agente.

A carga útil também resiste a uma leitura rápida. Os scripts de tempo de execução não são fornecidos. em texto claro: uma etapa de codificação e implantação mantém a lógica operacional como um Um bloco codificado que só se expande em scripts legíveis após a conclusão da cadeia de instalação. decodifica-o no diretório de tempo de execução oculto. Os arquivos que são visíveis na listagem — a fina camada de calço pós-instalação e uma materialização de distribuição auxiliar — revela pouco sobre o que é executado em última instância. Esta entrega codificada O design teve um efeito mensurável na triagem: ao longo da vida da família, Diversas variantes confirmadas foram consideradas seguras pela classificação automatizada. e a carga útil tem sido suficientemente opaca para impedir completamente a revisão automatizada. Os comportamentos que denunciam a família só se tornam visíveis após a codificação. O palco é expandido e o tempo de execução é lido diretamente.

Timeline

A carga útil da família permaneceu notavelmente estável; o que muda é a nome na caixa. O arco vai da marca aberta "forja" em direção a disfarça-se de ferramentas de desenvolvedor não relacionadas.

Data (2026) Pacote: versão Observação
Maio (início) forge-jsxy:1.0.81, :1.0.90 Primeiras variantes confirmadas — RAT com C2 criptografado com AES-256-GCM
Maio de 19 forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 Campanha em publicação ativa; a versão 1.0.92 foi inicialmente rotulada incorretamente como segura e revertida após revisão do código.
Final de maio forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino Nomes de pacotes irmãos, mesma cadeia de ferramentas
junho 4 forge-jsxy:1.0.120 Continuação; classificado como seguro pelo modelo de aprendizado de máquina (um erro)
21 a 23 de junho forge-jsxy:1.0.121 Conjunto de módulos inalterado em relação à versão 1.0.120
julho 6 zredis-typed:1.0.127 "Forja" foi retirada do nome; ainda são navios forge-jsxy-package.tgz e forgeAgent* chaves de configuração
julho 7 pinokio-redis:1.0.127 Mesma cadeia de ferramentas; novo C2; se descreve como uma integração com o "Autodesk Forge".

Duas coisas se destacam ao longo da linha do tempo. Primeiro, o número da versão 1.0.127 é reutilizado literalmente tanto pelo zredis-typed quanto pelo pinokio-redis — a nomenclatura muda, mas a linhagem de compilação não é reiniciada. Segundo, a mudança para nomes que não começam com “forge-*” coincide com uma mudança para nomes que soam como infraestrutura comum (redis, pinokio), diminuindo a chance de um desenvolvedor ler o nome rapidamente e hesitar.

Indicadores de compromisso

Os indicadores de comprometimento (IOCs) abaixo foram desativados. O host C2 alternava entre as linhas forge-jsxy. e a variante mais recente, mantendo a mesma porta.

Indicador Valor Visto em
Ponto final C2 212.193.3[.]61:9877 pinokio-redis:1.0.127
Ponto final C2 79.108.162[.]160:9877 linha forge-jsxy, zredis-typed:1.0.127
Canal de extração discord.com/api/webhooks/… (postagem de webhook) todas as variantes
Canal de extração discord.com/api/v10 (envio por retransmissão) todas as variantes
Canal de extração Upload do HuggingFace Hub todas as variantes
Artefato servido forge-jsxy-package.tgz (através relayPackageServe) todas as variantes
Arquivos da cadeia de ferramentas chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* todas as variantes
Lista de alvos secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) todas as variantes
Tempo de execução oculto pontilhado …/.forge-jsxy/runtime/v<version>/ caminho do diretório de configuração linha forge-jsxy
Persistência do Windows script oculto do PowerShell "forge diagnostics" de inicialização automática todas as variantes
Instalar gatilho Gancho postinstall invocando uma cadeia de scripts de materialização de distribuição todas as variantes

O sinal de detecção mais duradouro não é um único host ou webhook — esses girar — mas os nomes dos arquivos da cadeia de ferramentas e o forge-jsxy-package.tgz artefato, que persistiu literalmente em todas as renomeações.

Atribuição e comportamento observado

Os pacotes foram publicados em mais de uma conta npm. O forge-jsxy linha usada pelo editor jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); A variante mais recente de pinokio-redis foi publicada por donimique. (donimiqueakers@gmail[.]com). Nenhuma das contas possuía um e-mail verificado ou um repositório de código-fonte interligado. O elo comum entre as contas é o cadeia de ferramentas, não a identidade do editor — os mesmos nomes de módulos, o mesmo Serviu arquivos .tgz, e o mesmo design de exfiltração se repete independentemente de quem publicou.

Diversos comportamentos observáveis ​​indicam ocultação deliberada em vez de coleta excessiva acidental:

O ambiente de execução é colocado fora da pasta node_modules, em um diretório oculto, de forma que sobreviva ao pacote que o forneceu.

O agente é interrompido ao detectar um ambiente de CI (Integração Contínua), limitando a exposição em ambientes de análise automatizados.

O processo do agente é iniciado de forma separada e janela-oculta.Em Nas versões forge-jsxy, um comentário relacionava a omissão de um campo de instalação visível ao fato de esse campo ser "visível no npm".

As descrições públicas dos pacotes não têm relação com o código — o pinokio-redis se apresenta como uma integração com o “Autodesk Forge”.

Uma lacuna de detecção recorrente que vale a pena destacar para os defensores que dependem de Classificação automatizada: múltiplas variantes confirmadas nesta família foram classificado como seguro por um classificador de aprendizado de máquina antes da revisão de código corrigir o veredicto. Os elementos estáveis ​​nos quais um avaliador pode se basear — o tempo de instalação cadeia, o runtime oculto, os nomes dos arquivos da cadeia de ferramentas — são exatamente os mesmos. que sobrevivem às mudanças de nome.

Descrevemos o acima como comportamento observado. Não atribuímos o campanha para qualquer ator nomeado, e não fazemos nenhuma afirmação sobre o operador identidade ou objetivos que vão além do que o código e a infraestrutura demonstram.

Quem está exposto. A coleção é direcionada especificamente para desenvolvedores. máquinas: carteiras e keystores de criptomoedas, extensões de carteira para navegador, histórico do shell e credenciais de nuvem/serviço. Qualquer pessoa que instale um pacote afetado — direta ou indiretamente dependência transitiva — durante o A janela em que estava ativa está dentro do escopo, e o design de persistência significa que A exposição não termina quando a embalagem é removida.

Por que a persistência é importante. Porque a etapa 1 copia a carga útil para um diretório de tempo de execução oculto e registros de estágio 2 inicializam automaticamente, o usual instinto de correção (desinstalar a dependência problemática, excluir node_modules, A reinstalação não remove o agente. A equipe de resposta a incidentes precisa procurar o agente. O ambiente de execução externo à árvore e a entrada de inicialização automática, não apenas o pacote.

A tendência. Essa família ilustra um padrão que vale a pena observar: uma carga útil estável e madura, envolta em um fluxo descartávelnomes de pacotes que migram de qualquer nome que uma remoção anterior tenha feito reconhecível, com nomes que soam como infraestrutura comum. Baseado em nomes. Listas de bloqueio e reputação de editoras se tornam obsoletas rapidamente diante disso; comportamento- e os sinais baseados em artefatos não.

Para desenvolvedores e consumidores

Considere os scripts de instalação como a principal superfície de risco. Instale com os scripts desativados sempre que possível e revise qualquer dependência que declare um pós-instalação. Identifique e verifique as dependências transitivas; essa classe de malware chega tão facilmente por meio de uma subdependência quanto por uma dependência direta.

Em um host suspeito, investigue além do pacote: procure por um diretório de tempo de execução oculto no local de configuração da plataforma, uma entrada de inicialização automática inesperada, e conexões de saída para webhooks do Discord ou endpoints :9877.

Considere que qualquer frase mnemônica de carteira, keystore ou credencial presente em um host afetado durante o período de exposição esteja comprometida e faça a troca.

Para registros e defensores

Alerta sobre os artefatos duráveis ​​(forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload) nomes de arquivos) em vez do nome do pacote, que muda.

Indique a combinação estrutural da qual a família depende — uma pós-instalação que materializa scripts em um caminho oculto de diretório de configuração, além de um sistema operacional. Registro de inicialização automática — independente das strings específicas envolvidas.

O nome na embalagem mudou pelo menos quatro vezes; a caixa dentro Não. A detecção baseada no que o código faz sobreviveu a todas as gerações. Até o momento, apenas reetiquetagem.

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
Crie sua conta gratuita.
Nenhum cartão de crédito é necessário.

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni