Os nossos pipelines de deteção de malware recentemente identificaram um pequeno conjunto de pacotes no npm que pareciam... familiares.
Pacotes como json-bigint-extend, jsonfx, e jsonfb estavam a imitar o popular json-bigint biblioteca: mesma funcionalidade, um ficheiro README idêntico e até mesmo um nome de autor desconfortavelmente próximo do mantenedor original.
Na maioria das vezes, esse padrão indica ataques comuns à cadeia de suprimentos, como typosquatting e confusão de dependências, projetados para comprometer sistemas e extrair secrets. Mas este parecia diferente quase imediatamente.
Não estava a tentar atingir toda a gente. Estava a tentar atingir alguma coisa.
O sequestro
À primeira vista, json-bigint-extend comporta-se exatamente como o legítimo json-bigint biblioteca: exporta as funções familiares parse/stringify utilizadas para suportar números inteiros grandes em JSON. Na verdade, a maioria dos programadores e organizações não notaria nada de anormal. Esta carga útil foi especificamente concebida para permanecer silenciosa e só ser acionada quando deteta que está a ser executada dentro de um ambiente-alvo específico, verificando o valor de uma variável de ambiente específica chamada SERVICE_NAME.
Assim que detecta que está no ambiente certo, instala duas backdoors:
Primeiro, instala um middleware Express direcionado, conectado especificamente a uma rota de pagamento (/v1/pagamento/compra-de-produtos). Este middleware foi concebido para executar dinamicamente código adicional obtido a partir de um ponto final. Após uma análise mais aprofundada do código obtido, parece tratar-se de um complexo sistema de reescrita de fluxo de caixa utilizado para manipular um jogo de azar.
const routeInjectionRules = {
'/v1/pay/purchase-goods': {
identify: function (handlers, fn, index) {
...
},
position: 'after',
extraMiddlewares: [function (req, res, next) {
// Translation: [Plugin] Mount risk middleware as post-payment success logic.
log('[插件] 支付成功后的后置逻辑挂载risk');
riskCode(req, res, next); // Executes dynamically fetched code
}]
}
};
Em segundo lugar, um middleware em nível de protótipo que silenciosamente faz monkey patches no Express.js, adicionando middleware global ao todos Rota POST. Este middleware escuta por um segredo x-operação cabeçalho e desbloqueia quatro tipos de comandos para o operador:
- RunSQL: executa SQL arbitrário na base de dados de produção.
- RunFileList: lista ficheiros e diretórios do lado do servidor.
- RunFileContent: descarregar o conteúdo de um ficheiro selecionado.
- Comprimir e descarregar: descarregar um diretório como um ficheiro zip.
O painel do operador
Dentro do pacote, há também uma página HTML incorporada para um «serviço de download de compressão de diretório» (título em chinês: Serviço de download de compactação de diretórios).

Embora esta página nunca tenha sido conectada a nenhum ponto do código backdoor que observámos, ela parece ser uma interface de utilizador voltada para o operador, destinada à navegação e extração de diretórios como ficheiros zip.
Manipulação dos resultados dos jogos de azar
A parte assustadora: isso código de risco(...) A função chamada no middleware é controlada remotamente e atualizada a cada 30 segundos.
Embora a carga útil ainda não tenha sido ativada, observámos uma lógica capaz de ajustar retroativamente o histórico recente de jogos de um utilizador para que o seu saldo seja alterado em um valor escolhido, enquanto reconstrói toda a cadeia de saldo para que os registos do jogo continuem a parecer internamente consistentes.
É um sofisticado reescritor de equilíbrio e história que:
- Lê as linhas recentes de fluxo de caixa de um utilizador.
- Seleciona uma janela de rodadas do jogo.
- Ajusta os valores de aposta/pagamento para atingir um montante alvo na carteira do utilizador.
- Reconstrói os registos completos do jogo para que permaneçam internamente consistentes na base de dados.
Isso significa que o objetivo não é apenas a fraude. É uma fraude que sobrevive às verificações de consistência interna, fabricando vitórias e derrotas enquanto mantém a contabilidade consistente.
Algumas das referências circundantes apontam para uma aplicação de jogos de azar chamada Bappa Rummy, amplamente divulgada online através de programas de referência e lojas de aplicações alternativas, mas que já não está disponível na loja oficial Google Play.

Detecção e prevenção
Embora não saibamos quem está por trás do backdoor, o mais assustador é o que ele faz quando chega ao ambiente certo. Não se trata "apenas" de um implante de dependência típico que extrai código-fonte, secrets ou dados de clientes.
Em vez disso, ele se conecta diretamente à lógica de negócios, executa código controlado remotamente no tráfego real e pode reescrever o histórico financeiro armazenado no banco de dados. Se o seu monitoramento presume que os registos do banco de dados são confiáveis, esse tipo de manipulação pode permanecer invisível por muito tempo.
Se já utiliza Aikido, este pacote seria sinalizado no seu feed como uma descoberta crítica 100/100.
Aikido não está no Aikido ? Crie uma conta gratuita e vincule os seus repositórios. O plano gratuito inclui a nossa cobertura de deteção de malware (não é necessário cartão de crédito).
Por fim, ter uma ferramenta capaz de bloquear malware em tempo real, assim que ele aparece, pode evitar uma infecção grave. Essa é a ideia por trás Aikido Chain, uma ferramenta gratuita e de código aberto que envolve npm, npx, yarn, pnpm e pnpx e usa IA e pesquisadores humanos de malware para detectar e bloquear os riscos mais recentes da cadeia de suprimentos antes que eles entrem no seu ambiente.
Indicadores de comprometimento
Pacotes e autores:
- jsonfb (por sidoraress)
- jsonfx (por sidoraress)
- json-bigint-extend (por sidoraress & infinitynodestudio)
A porta traseira comunica com um host remoto tanto para atualizações de carga útil como para registo.
Desfechos observados:
https://payment[.]y1pay[.]vip/v1/risk/get-risk-codehttps://payment[.]y1pay[.]vip/v1/risk/loghttps://payment[.]snip-site[.]cc
Outros IOCs e comportamentos passíveis de detecção:
- Pedidos contendo o cabeçalho x-operation com um dos quatro tokens de operação:
- RunSQL (token: cfh2DNITa84qpYQ0tdCz)
- RunFileList (token: m3QiEkg8Y1r9LFTI5e4f)
- RunFileContent (token: Y3SrZjVqWOvKsBdpTCh7)
- CompressDownload (token: SJQf31UJkZ1f88q9m361)
- Modificações em tempo de execução para
express.Route.prototype.post

