Negócio Arriscado: Pacotes npm que se Autodestroem Explicados

Negócio Arriscado: Os Pacotes Anti-Monitoramento Que Se Autodestroem

TL, DR

Os pacotes se autoexcluem. Ao longo de quinze dias em agosto, um operador do npm publicou nove pacotes sob nove nomes diferentes, provenientes de sete contas, e removeu oito deles pessoalmente. O tempo de permanência de cada pacote caiu de treze horas para dezessete minutos. Essa técnica não é exclusiva deles: outros sete pacotes, de operadores não relacionados e com conteúdos completamente diferentes, foram removidos por seus próprios autores em uma mediana de 37.8 minutos. O artefato desaparece antes que a maioria dos processos de segurança seja executada, e a instalação já ocorreu.

Tudo o que o registro expõe é rotativo; a carga útil, não. Todos os nove enviaram um byte idêntico. bin/ diretório, os mesmos hashes SHA-256 em três nomes de pacotes e duas contas, com quinze dias de intervalo. A identidade do conteúdo é o único sinal de rastreamento que este operador não quebrou, e o único pacote que ele nunca retirou é o motivo pelo qual tudo isso pôde ser examinado.

As pessoas que instalam o sistema não são vítimas e, de qualquer forma, estão muito expostas. Esta ferramenta não se destina a desenvolvedores: ela burla a supervisão remota de exames por meio de captura de tela oculta, extração de texto na tela e exibição das respostas em uma sobreposição. quem quer que administre npm install é o beneficiário pretendido, e não o alvo. Eles também executam um binário não assinado que descriptografa o armazenamento de cookies do navegador, a partir de uma conta que se exclui automaticamente em menos de uma hora. Não conseguem obter uma correção, não podem auditar posteriormente o que executaram e não podem denunciar os danos sem revelar o motivo da instalação.

Ecossistema: npm, mesmo padrão observado no PyPI. Período: Junho a agosto de 2026.

A Medição

O tempo de permanência é o intervalo entre o aparecimento e o desaparecimento de um pacote, calculado a partir dos metadados do próprio registro. Essas são medições, não estimativas.

PacotePublicado (UTC)Deixado de pé
moidev2026-08-16 16:315h 58m
moidevx2026-08-17 03:2413h 23m
moidevz2026-08-26 03:3812h 56m
moideva2026-08-26 18:581h 33m
amicat2026-08-28 20:4817m
bmcat2026-08-28 21:1747m
eyevox2026-08-28 21:4421m
moidevh2026-08-31 03:2247m

Lida na ordem de publicação, a janela de tempo se contrai em mais de quarenta vezes — de 13h23min na maior amplitude para 17 minutos na menor. Os quatro primeiros pacotes têm uma duração média de oito horas e meia; os quatro últimos, de trinta e três minutos. Em 28 de agosto, três pacotes foram publicados e retirados em um único intervalo de 77 minutos.

A contração não é uma deriva gradual. Ela se concentra entre 26 e 28 de agosto, e o que mudou foi a estimativa da operadora sobre quanto tempo um pacote pode permanecer em pé com segurança.

Cada retirada de conteúdo aqui é iniciada pela editora. O documento de registro de cada uma mostra uma lista de mantenedores vazia ao lado de um tempo.não publicado registro — a assinatura de uma despublicação em vez de uma remoção. Um nono pacote, eyiouss, nunca foi retirado; é por isso que tudo isso pôde ser examinado.

Existe um segundo regime de retirada que não deve ser confundido com este. Onde apenas o versão de carga útil Se o pacote for removido e sobreviver, a mediana é de aproximadamente 73 horas em 31 pacotes. Essas substituições chegam em lotes programados e deixam uma casca vazia — um package.json declarando um principal que não envia nenhum arquivo — cuja única função é manter o nome registrado. Esse regime é uma manutenção programada. Este aqui é uma janela de exposição ajustada.

O que sobrevive à eliminação

Nove desses pacotes pertencem a um único operador: moidev, moidevx, moidevz, moideva, moidevh, amicat, bmcat, eyevox e eyioussOs nomes não seguem nenhuma convenção — qualquer pessoa que acompanhe o moidev O stem teria deixado passar mais da metade delas — e elas foram publicadas a partir de sete contas diferentes, quase todas registradas em domínios de e-mail descartáveis.

O que eles têm em comum é uma entrada no manifesto sem motivo aparente:

"bin": { "": "bin/kalamasha-tool.js" } }

Guardamos cópias de cinco antes da remoção. Em todas as cinco, o inteiro bin / O diretório é idêntico em bytes:

Envie oSHA-256
bin/kalamasha-tool.js0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
bin/uia_extract.exee2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
bin/chrome_cookies.ps121b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a
bin/stealth_capture.ps1c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c
bin/uia_extract.pyc20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e
bin/uia_get_text.ps14a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c

Outros dois sinais concordam. Três dos pacotes foram publicados às 03:24, 03:38 e 03:22 UTC nos dias 17 de agosto, 26 de agosto e 31 de agosto — um intervalo de dezesseis minutos ao longo de quinze dias e em três contas diferentes. E duas dessas contas estavam registradas no mesmo domínio de e-mail descartável, o que as vincula independentemente do código.

As contas

Estas são as contas de publicação do npm que enviaram o payload, com o pacote enviado para cada uma e o tempo que permaneceu disponível:

Conta de editorPacoteDomínio de e-mailDeixado de pé
letol39119moidev:1.0.0hutdot.com (descartável)5h 58m
so1d1a7i27moidevx:1.0.0ogzmail.com (descartável)13h 23m
lololololol435678eyiouss:3.0.21, 3.0.22, 4.0.1ogzmail.com (descartável)ainda publicado
tagadob568moidevz:1.0.0ebflyai.com (descartável)12h 56m
tayihim489moideva:1.0.0prodbits.com (descartável)1h 33m
sahihai123amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0webmail para consumidores17m / 47m / 21m
heytoshanmoidevh:1.0.0webmail para consumidores47m

so1d1a7i27 e lololololol435678 partilham a ogzmail.com domínio de registro — o link que vincula a conta que ainda hospeda uma cópia ativa à conta que publicou sob o domínio moidev caule duas semanas antes. sahihai123 Publicou e retirou três nomes de pacotes diferentes em um único intervalo de 77 minutos no dia 28 de agosto. heytoshan registrado, publicado moidevhe retirou-a 47 minutos depois; essa continua sendo a única publicação desse relato.

Cada uma dessas contas não possui e-mail verificado, não contém nenhum link verificado para o sistema de controle de versão e não publicou nenhum projeto não relacionado. Seis das sete não hospedam mais nada.

Um dos pacotes nunca foi retirado. eyiouss:4.0.1 O relatório foi publicado em 16 de agosto e ainda era solucionável no momento da redação deste texto. Oito artefatos eram irrecuperáveis; a campanha foi reconstruída inteiramente a partir do artefato remanescente. Um operador que apaga arquivos por reflexo ainda deixará, eventualmente, um deles intacto.

O que a ferramenta faz

eyiouss:4.0.1 O projeto se descreve no npm como uma "utilitária DOM de alto desempenho e ponte de diagnóstico para aplicações web modernas". Trata-se de uma ferramenta de captura de tela e recuperação de respostas, criada para funcionar em sistemas de monitoramento remoto de provas, conforme descrito em seu próprio código-fonte.

O inicializador copia o ambiente de execução do Electron com um nome de arquivo falso antes de executá-lo e especifica o que está sendo evitado:

// 🛡️ NOME BINÁRIO OCULTO: NÃO deve colidir com o Testpad real! const STEALTH_NAME = 'SearchApp.exe';

O cabeçalho do mesmo arquivo o chama de Cão de Guarda Fantasma Anti-Proctor e implementa um loop de respawn que recua ainda mais quanto mais rápido for finalizado. Em outro lugar, o processo aumenta sua própria prioridade. para combater a limitação de CPU por monitoramento, empurra o aplicativo de exame para fora do primeiro plano quando este recebe o foco e encerra um processo filho do Safe Exam Browser com taskkill /F /T.

A captura é executada por meio de um script PowerShell integrado, invocado com a política de execução desativada e a janela suprimida, com o texto na tela coletado em paralelo por meio da Automação da Interface do Usuário do Windows. As imagens e o texto enfileirados são enviados para uma sessão de modelo de linguagem em um navegador incorporado, e a resposta é exibida em uma sobreposição sempre visível. Essa conexão é adiada deliberadamente, e o código explica o motivo: para evitar exposição permanente do NETSTAT.

O pacote também é enviado chrome_cookies.ps1, dirigido EXTRATOR DE BISCOITOS CROMADO, que descriptografa cookies do Chrome e do Edge via DPAPI e lê o banco de dados de cookies de até quatro perfis de navegador. Declarado anteriormentecisely: não encontramos esse script invocado pelo nome em nenhum arquivo JavaScript fornecido. O que está presente e acessível é a parte que consome o script, que injeta os cookies de sessão armazenados no navegador incorporado.

A posição das pessoas que o instalam

Ninguém instala isso por acidente. Não tem função alguma fora de um exame monitorado, e sua saída é uma sobreposição de respostas na tela do usuário. A descrição enganosa do pacote não se destina ao instalador — ela é direcionada ao registro do sistema e a qualquer pessoa que audite a máquina posteriormente. O instalador sabe o que está instalando; a descrição existe para que ele saiba. registro A instalação não reflete isso.

As partes prejudicadas são terceiros que nunca interagiram com o npm: a instituição que administra o exame, os outros candidatos e todos os demais que dependem da validade da credencial.

Mas, portanto, o instalador não está seguro, e é esta a parte que vale a pena esclarecer, porque o próprio modelo de "pacote que desaparece" é o que cria a exposição.

Eles estão executando um binário não assinado proveniente de ninguém. uia_extract.exe Naves compiladas, sem código-fonte e sem histórico de compilação, a partir de uma conta que não existe mais. O mesmo arquivo, por hash, foi republicado por letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123 e heytoshan ao longo de quinze dias. Não há responsável pela manutenção a quem perguntar, nenhum repositório para consultar e nenhum histórico para verificar — todas as identidades que o enviaram se autoexcluíram.

Eles concederam exatamente as capacidades que o malware precisa. Um processo oculto, executado sob um nome falso, descriptografa o armazenamento de cookies do navegador, lê a tela continuamente, encerra o software de segurança e reinicia quando finalizado. Atualmente, a descriptografia de cookies está limitada aos domínios de um único fornecedor e serve à sessão do usuário. Essa limitação pode ser alterada com apenas uma linha de código, e nenhuma alteração no modelo de entrega a revelaria caso fosse modificada — um novo nome, uma nova conta, um novo upload.

Eles não conseguem receber uma solução. O pacote é despublicado em menos de uma hora. Não há caminho de atualização, nenhum aviso e nenhuma maneira de descobrir posteriormente que a versão instalada era diferente da instalada pelo amigo. O que estiver na máquina permanece lá.

Eles não podem auditar o que executaram. O arquivo de bloqueio deles agora faz referência a um pacote que não é mais resolvido. Se, posteriormente, eles precisassem verificar o que havia em sua máquina — após um incidente ou uma disputa —, o registro não teria nenhum registro para fornecer.

E eles não podem denunciar danos. Um usuário comprometido por esta ferramenta não pode registrar uma denúncia de abuso sem revelar o motivo da instalação. Isso não é por acaso. Denúncias de abuso no registro são um dos principais canais para detectar pacotes de curta duração, e a base de usuários deste operador é estruturalmente incapaz de utilizá-lo. O único adversário restante é a varredura automatizada — que é calibrada com base em uma janela de dezessete minutos.

A estrutura da vítima e o tempo de permanência são o mesmo fato observado duas vezes. Isso também explica a anomalia na linha do tempo: se a retirada fosse motivada pelo medo de reclamações, o pacote popular de longa duração seria o primeiro a ser retirado. Isso não aconteceu, porque as reclamações nunca ocorreram.

O mesmo padrão, um operador diferente.

O operador de monitoramento não está sozinho nisso, e o paralelo mais claro ocorre em uma carga útil não relacionada.

Entre 24 e 27 de agosto, quatro pacotes npm apareceram com nomes emprestados de ferramentas de autenticação de dois fatores — autenticação-otp, chave-secreta-2fa, secretkey2fa e chave secreta de autenticação de dois fatores — contendo dezesseis versões entre elas. Cada uma foi publicada a partir de sua própria conta recém-registrada (beayilol, jeanpaul686g, zzzalipay, dluuuuu), todos com e-mail não verificado, nenhum com link de controle de versão verificado, nenhum publicando qualquer outra coisa. Todos foram retirados por seus respectivos editores.

O payload não tem nada a ver com o software de exame. Ele lê os armazenamentos de credenciais do navegador e os tokens do Discord, e percorre uma cadeia de autenticação do Xbox Live contra o inicializador do Minecraft para capturar um token de atualização. Aqui está o instalador. is a vítima no sentido comum — e é isso que torna a comparação útil, porque o comportamento de entrega é idêntico em ambos os casos.

Os quatro ciclos foram executados na ordem de publicação, com durações de 274.9, 37.8, 37.6 e 35.7 minutos: uma primeira tentativa longa, seguida de convergência para um valor que se mantém. Outros três pacotes pertencem a outros operadores e apresentam o mesmo comportamento de retirada.

PacoteoperadorDeixado de pé
octopus-actionfarol de reconhecimento2.5 minutos
mt-ts-serverless-starterfarol de reconhecimento9.6 minutos
2fa-secretkeynomes de cobertura 2FA35.7 minutos
secretkey2fanomes de cobertura 2FA37.6 minutos
secretkey-2fanomes de cobertura 2FA37.8 minutos
auth-otpnomes de cobertura 2FA274.9 minutos
hex-encode-utilsOutros724.2 minutos

Sete pacotes, com duração média de 37.8 minutos, nenhum deles relacionado a software de exame.

Três cargas úteis não relacionadas, três conjuntos de contas não relacionados, uma técnica compartilhada.

Por que a janela está se fechando

Algo mudou no ambiente do registro durante 2026, e o candidato óbvio é que a verificação ficou mais rápida.

Até recentemente, pacotes maliciosos eram encontrados principalmente após o fato: por um usuário que percebia algo, por um relatório posterior ou por uma varredura periódica. A latência de detecção era medida em dias. Esse não é mais o único cenário. Análise quase em tempo real de pacotes recém-publicados — Alerta antecipado de malware da própria Xygeni Em meio a um número crescente de sistemas desse tipo em todo o setor, o que reduz significativamente o intervalo entre a publicação e a inspeção, torna-o muito mais curto.

Um operador que se depara com isso tem duas opções: dificultar o reconhecimento da carga útil ou reduzir o tempo em que ela fica disponível para análise. A segunda opção é mais barata, não exige engenharia e o registro fornece o mecanismo gratuitamente: dentro do prazo de 72 horas para despublicação do npm, um editor pode remover um pacote unilateralmente, e o nome pode ser reutilizado posteriormente. A retirada não custa nada ao operador.

O momento é oportuno. Ambos os operadores acima convergem para um valor e o mantêm, em vez de oscilarem, o que caracteriza um parâmetro ajustado, e não uma mera questão de conveniência. E o parâmetro para o qual convergiram — dezenas de minutos — permanece precisDe forma que fique posicionado exatamente onde precisaria para passar por uma inspeção automatizada, permitindo ao mesmo tempo que a embalagem permaneça instalável por tempo suficiente para chegar ao seu público-alvo.

Isso permanece uma hipótese. Os dados de tempo não conseguem separar uma resposta à varredura de uma resposta à aplicação de regras de registro, ou da maturação operacional comum à medida que esses operadores aprendem uns com os outros. O que pode ser dito sem inferência é mais restrito e ainda útil: O período de exposição agora é tão curto que qualquer controle que dependa da inspeção de um pacote após a publicação está correndo contra o tempo definido pelo operador. Os controles que não dependem de inspeção — quarentena por idade, scripts de instalação desativados — não são afetados por essa condição, o que é a razão prática para preferi-los.

O que fazer sobre isso

Quarentena por faixa etária. Nenhum item na tabela de tempo de permanência sobreviveu por treze horas. Uma política que impedisse a instalação de qualquer versão de dependência até que ela existisse por 72 horas teria excluído todas elas sem detectar nada.

Desativar scripts de instalação por padrão. –Ignore-scripts Remove o mecanismo de entrega do qual dependem os pacotes de roubo de credenciais neste conjunto de dados. Não ajuda contra uma ferramenta que o usuário executa deliberadamente, que é pré-cisÉ justamente essa distinção que vale a pena entender.

Considere o desaparecimento como um evento de segurança. Alerta quando uma dependência instalada para de ser resolvida. O arquivo de bloqueio, e não o registro do sistema, é onde as evidências ainda residem.

Acompanhe o conteúdo, não os nomes. Os seis resumos acima correspondem independentemente do nome do pacote, da conta do editor ou da string de versão — todos os campos que este operador demonstrou que serão alterados. Uma regra do lado do registro que considerasse um padrão reportável como o de uma conta recém-registrada que retira seu único pacote em uma hora teria sido acionada em todos os pacotes aqui, apenas com base nos metadados.

E se você estiver pensando em instalar algo nesta categoria: As características que dificultam a detecção por um registro são as mesmas que deixam você sem qualquer recurso. Não há editor para responsabilizar, nenhum caminho de atualização e nenhum registro do que você executou.

indicadores

FormatoValor
Envie obin/kalamasha-tool.js — não-standard ponto de entrada do lixo
SHA-2560c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
SHA-256e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
ProcessoSearchApp.exe escrito ao lado de um ambiente de execução Electron legítimo
Comportamentopowershell -ExecutionPolicy Bypass -File com as windowsHide: true
Comportamentotaskkill /F /T visando um processo de navegador de exame seguro
metadadosLista de mantenedores vazia ao lado de um time.unpublished registro
Contasletol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan
Registroogzmail.com, hutdot.com, ebflyai.com, prodbits.com — domínios de e-mail descartáveis

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