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.
| Pacote | Publicado (UTC) | Deixado de pé |
|---|---|---|
moidev | 2026-08-16 16:31 | 5h 58m |
moidevx | 2026-08-17 03:24 | 13h 23m |
moidevz | 2026-08-26 03:38 | 12h 56m |
moideva | 2026-08-26 18:58 | 1h 33m |
amicat | 2026-08-28 20:48 | 17m |
bmcat | 2026-08-28 21:17 | 47m |
eyevox | 2026-08-28 21:44 | 21m |
moidevh | 2026-08-31 03:22 | 47m |
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 o | SHA-256 |
|---|---|
bin/kalamasha-tool.js | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
bin/uia_extract.exe | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
bin/chrome_cookies.ps1 | 21b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a |
bin/stealth_capture.ps1 | c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c |
bin/uia_extract.py | c20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e |
bin/uia_get_text.ps1 | 4a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c |
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 editor | Pacote | Domínio de e-mail | Deixado de pé |
|---|---|---|---|
letol39119 | moidev:1.0.0 | hutdot.com (descartável) | 5h 58m |
so1d1a7i27 | moidevx:1.0.0 | ogzmail.com (descartável) | 13h 23m |
lololololol435678 | eyiouss:3.0.21, 3.0.22, 4.0.1 | ogzmail.com (descartável) | ainda publicado |
tagadob568 | moidevz:1.0.0 | ebflyai.com (descartável) | 12h 56m |
tayihim489 | moideva:1.0.0 | prodbits.com (descartável) | 1h 33m |
sahihai123 | amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0 | webmail para consumidores | 17m / 47m / 21m |
heytoshan | moidevh:1.0.0 | webmail para consumidores | 47m |
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.
| Pacote | operador | Deixado de pé |
|---|---|---|
octopus-action | farol de reconhecimento | 2.5 minutos |
mt-ts-serverless-starter | farol de reconhecimento | 9.6 minutos |
2fa-secretkey | nomes de cobertura 2FA | 35.7 minutos |
secretkey2fa | nomes de cobertura 2FA | 37.6 minutos |
secretkey-2fa | nomes de cobertura 2FA | 37.8 minutos |
auth-otp | nomes de cobertura 2FA | 274.9 minutos |
hex-encode-utils | Outros | 724.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
| Formato | Valor |
|---|---|
| Envie o | bin/kalamasha-tool.js — não-standard ponto de entrada do lixo |
| SHA-256 | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
| SHA-256 | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
| Processo | SearchApp.exe escrito ao lado de um ambiente de execução Electron legítimo |
| Comportamento | powershell -ExecutionPolicy Bypass -File com as windowsHide: true |
| Comportamento | taskkill /F /T visando um processo de navegador de exame seguro |
| metadados | Lista de mantenedores vazia ao lado de um time.unpublished registro |
| Contas | letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan |
| Registro | ogzmail.com, hutdot.com, ebflyai.com, prodbits.com — domínios de e-mail descartáveis |
Referências
- política de despublicação do npm — o período de 72 horas dentro do qual uma editora pode remover um pacote sem intervenção.







