Nos últimos meses, nos deparamos com alguns arquivos JavaScript aparentemente usados para criptografar criptomoedas diretamente no navegador. Há muito tempo, os cibercriminosos se aproveitam da mineração destas moedas para obter lucro, embora geralmente usem malware ou aplicativos potencialmente indesejáveis que são instalados na máquina da vítima para tal finalidade.
No entanto, neste caso particular, a mineração é realizada diretamente no navegador quando o usuário navega em determinados sites. Portanto, não é necessário infectar a máquina da vítima ou explorar vulnerabilidades. Para isso, basta um navegador com JavaScript ativado, que é o estado padrão na maioria dos casos. Este post descreve a pesquisa que realizamos para entender melhor esta ameaça.
Começamos explorando a nossa telemetria e descobrimos que a ameaça foi parcialmente distribuída por meio de malvertising. Esse tipo de tarefa de uso intensivo da CPU geralmente está proibida pela maioria das redes publicitárias, pois degrada substancialmente a experiência do usuário. Minar criptomoedas no navegador pode parecer improdutivo (sabemos que os bitcoins de mineração requerem muita energia da CPU), mas os cibercriminosos, como veremos mais adiante, optaram por moedas que não requerem hardware personalizado para serem criadas. Por outro lado, é mais fácil alcançar um número significativo de máquinas "infectando" sites do que infectando máquinas de usuário.
Embora esta técnica possa ser usada em qualquer país, percebemos que essa campanha em particular impactou principalmente a Rússia e a Ucrânia. É importante notar que isso se deve provavelmente ao idioma dos sites, nos quais os scripts são injetados, já que conseguimos acessá-los a partir de um endereço IP nos Estados Unidos.
A Figura 1 mostra os cinco principais países mais afetados:
A Figura 2 mostra o ranking histórico do Cisco Umbrella Top 1M de um dos domínios (reasedoper [.]pw) – que hospeda estes scripts. Observamos um aumento significativo nas pesquisas de DNS para o domínio durante o período de março a abril de 2017. Em 28 de junho de 2017, reasedoper [.]pw ficou no posto 26.300 da lista, quase o mesmo lugar que o popular site de compartilhamento de texto do GitHub GitHub Gist (gist.github.com), que estava em 26.293° na mesma data.
História
A idéia de mineração de criptomoedas em navegadores não é exatamente algo novo. Em 2013, um grupo de estudantes do MIT fundou uma empresa chamada Tidbit, que ofereceu um serviço web para minar Bitcoins. Em vez de exibir anúncios, os webmasters podem incluir os scripts da Tidbit em seus sites para ganhar dinheiro desta forma.
No entanto, os fundadores do serviço receberam uma intimação do escritório do Procurador-Geral de Nova Jersey porque usaram o poder de computação dos usuários sem consentimento. Eles finalmente chegaram a um acordo, mas tiveram que abandonar o projeto.
Anteriormente, muitos outros serviços, como bitp[.]it, forneceram mineração de bitcoins em navegadores. No entanto, devido à crescente ineficiência do uso de uma CPU ou GPU regulares, esses serviços foram encerrados. Por exemplo, o projeto bitp[.]it foi fechado em julho de 2011.
Como ocorre a distribuição?
O método de distribuição deste tipo de script é um ponto chave para determinar se é legítimo ou indesejado. Neste caso em particular, conseguimos encontrar duas formas distintas pelas quais os usuários podem ser obrigados a executar esses scripts: malvertising e un snippet do código JavaScript hardcodeado.
A Figura 3 mostra o esquema de distribuição global dos scripts de mineração.
Malversing
Como já destacamos, o principal método de distribuição dos scripts de mineração é o malvertising. Geralmente, consiste em comprar o tráfego de uma rede de anúncios e distribuir JavaScript malicioso em vez de um anúncio publicitário tradicional. Nesta campanha, não temos certeza se a injeção do script foi intencional ou se o listat[.]biz foi comprometido.
De qualquer forma, listat[.]biz é realmente suspeito, pois parece imitar ao LiveInternet counter (LI stat), que é um contador web legítimo. Além disso, muitos domínios suspeitos foram registrados com o mesmo endereço de -mail, incluindo lmodr[.]biz, que também está presente na cadeia de malvertising.
Os principais sites que forneceram tráfego aos scripts de mineração durante julho de 2017 são mostrados na Figura 4. Alertamos que a maioria são sites de streaming de vídeo ou de jogos que são utilizados no navegador. Isso faz sentido, já que seus usuários costumam gastar mais tempo na mesma página enquanto assistem a um filme ou jogam.
Além disso, essas páginas costumam ter uma carga de CPU maior do que a normal, o que tenderia a mascarar a carga adicional do script de mineração. Assim, permite que os scripts de mineração sejam executados por mais tempo e usem uma maior capacidade de computação.
O site no qual observamos maior quantidade de impressões de anúncios maliciosos, okino[.]tv, parece ser particularmente popular. No momento de escrever este post, Alexa Rank o posicionava em 907 lugar na Rússia e no 233 lugar na Ucrânia. Alguns dos outros sites também parecem ser populares, já que aparece no Alexa Top 1000 para a Rússia.
A Figura 6 mostra o consumo da CPU ao visitar o site wotsite[.]net: Um exemplo específico da cadeia de redirecionamento descrito na Figura 3, acima, é fornecido na Figura 7. Os primeiros três saltos apenas injetaram o script fornecido pelo seguinte salto, como é apresentado nas Figuras 8, 9 e 10. O primeiro domínio usado no redirecionamento (skyadsvideo1[.]ru no nosso exemplo) nem sempre é o mesmo: também temos visto o code.moviead55[.]ru.
Ambos determinam os mesmos endereços IP, 167.114.238.246 e 167.114.249.120. De acordo com dados do Whois para o domínio skyad[.]video, cujo subdomínio code.skyad[.]video também determinam os mesmos dois endereços IP, os domínios parecem estar relacionados ao SkyAdVideo, proprietário da rede de anúncios.
Uma pesquisa no PassiveTotal mostra que o listat[.]biz apenas redirecionava os scripts, exceto em 1 de junho e 5 de julho, quando também estava redirecionando para contadores web reais e para anstatalsl[.]biz. Portanto, parece que o lmodr[.]biz e o listat[.]biz apenas são usados para injetar os scripts de mineração. Surpreendentemente, também percebemos que o moviead55[.]ru, no primeiro salto, também conseguiu injetar um mineiro, que estava hospedado diretamente neste site e pode minar a criptomoeda ZCash. Ele usa um pool, localizado em ws.zstat[.]net:8889, e se comunica através de sockets. No entanto, não fomos capazes de demonstrar semelhanças no código com os scripts hospedados em reasedoper[.]pw. Portanto, parece que diferentes grupos estão tentando obter lucro usando o poder de computação de seus visitantes.Código JavaScript hardcodeado
Também encontramos no Google Cache cerca de 60 sites injetados com o mesmo snippet de JavaScript mostrado na Figura 10. A página inicial desses sites injeta um script a partir de uma URL script.php.
Este script chama URLs de vários domínios, incluindo static.reasedoper[.]pw, que hospeda os scripts JS usados para a mineração, cuja análise é abordada na próxima seção. Também observamos que um dos outros domínios injetados, listat[.]org, compartilha endereços IP com o usado para a campanha de malvertising (listat[.]biz). Outra semelhança é o nome de uma função, show_260, que também é usada nessa campanha.
Uma lista não abrangente de domínios afetados é fornecida na seção IOCs. No entanto, nenhum deles parecem ser sites muito conhecidos.
Como minar cryptomoedas?
Vários scripts são hospedados em static.reasedoper[.]pw e mataharirama[.]xyz. Os scripts com “multi” no nome são multiprocessos, enquanto aqueles com “single” usam um só processo. Estes são os principais arquivos de JavaScript que irão lançar os trabalhadores para explorar diferentes criptomoedas. Estes scripts são levemente ofuscados: os literais de cadeia são gravados apenas com a sequência de escape hexadecimal ("\x42\x43...").
A Figura 13 mostra que Feathercoin, Litecoin e Monero podem ser minados usando este script. No entanto, parece que atualmente não estão minando o Litecoin.
Feathercoin e Litecoin são inspirados em Bitcoin, embora a principal diferença seja o uso de diferentes algoritmos de hash: neoscrypt e scrypt, respectivamente. O objetivo é reduzir a necessidade de usar hardware personalizado, como mineiros ASIC, em vez de CPUs comuns. Para miná-los, é necessário não só a energia da CPU, mas também uma grande quantidade de memória.
A última moeda alternativa, Monero, é diferente das outras duas. Sua característica principal é um maior nível de privacidade em comparação com o Bitcoin, considerando que é mais difícil de rastrear transações tendo em conta que o blockchain não é transparente. Em particular, usa assinaturas de círculo para esconder o endereço do remetente entre vários endereços de remetente possíveis. Também gera uma nova chave pública para cada transferência, a fim de esconder o destinatário real. O algoritmo de hash usado, cryptonight, também requer muita memória. Portanto, faz sentido escolher este tipo de moedas alternativas para minar com JavaScript em máquinas regulares.
Como a mineração requer muita energia de computação, não é nenhuma surpresa que o operador tenha decidido usar asm.js em vez de JavaScript regular para implementar os algoritmos de hash. Dizem que o asm.js é entre 1,5 e 2 vezes mais lento do que a implementação regular desses algoritmos em C. Três deles são fornecidos: scrypt.asm.js (Litecoin), cryptonight.asm.js (Monero) e neoscrypt.asm.js (Feathercoin).
Finalmente, o endereço da carteira Feathercoin é o mesmo em todos os scripts, enquanto que utilizam vários endereços do Monero. No entanto, vários scripts compartilham o mesmo endereço. Por isso, acreditamos que pertençam ao mesmo grupo.
Como a principal característica do Monero é o anonimato, não conseguimos acessar a quantidade de dinheiro armazenada nas carteiras. Com relação ao Feathercoin, o endereço não figura na rede e não temos certeza do motivo disso, mas pode ser devido ao uso de um pool para mineração.
Relação com web mineiros anteriores
Nos scripts de mineração, encontramos este endereço de Feathercoin hardcodeado: 6nmfjYVToBWb2ys4deasdydPj1kW9Gyfp4. Uma pesquisa rápida no Google mostra que esse endereço foi usado por vários anos.
Em um texto publicado no início de 2016, um usuário da Internet reclamava de um script que usava 100% de sua CPU. O que ele descrevia era muito semelhante ao que temos analisado e o endereço de Feathercoin coincide. No momento dessa descoberta, o script estava hospedado no minecrunch[.]co e, ao buscar este domínio, chegamos a um tópico sobre cryptocurrencytalk.com que o usuário Kukunin descreve em seu “humilde serviço, MineCrunch".
Com relação ao funcionamento, Kukunin explica:
"Enquanto a mineração clássica da CPU gera pouco lucro, a mineração distribuída (centenas e milhares de visitantes) de uma nova Criptomoeda (que use apenas CPU ou semelhante) com velocidade quase nativa (graças a asm.js) seria muito excelente.
[...]
O mineiro C Scrypt foi compilado para o Javascript usando o Emscripten para obter o melhor desempenho. O desempenho é cerca de 1.5x mais lento que o aplicativo nativo cpuminer."
Um link no primeiro post (https://kukunin.github.io/webminer/) mostra o mesmo endereço de Feathercoin como um exemplo. Isso reforça o vínculo entre o mineiro reasedoper[.]pw e o minecrunch[.]co. No entanto, se o objetivo do MineCrunch fosse propor um serviço aberto para mineração distribuída, os lucros gerados pelo reasedoper[.]pw beneficiariam apenas o autor do MineCrunch (ou os proprietários dos endereços hardcodeadas), pois é improvável que seja possível especificar um identificador do afiliado.
Conclusão
Apesar da redução no desempenho ao usar um mineiro JavaScript em vez de um programa nativo, o número de visitantes recebidos pelo site mineiro provavelmente permite obter lucros. Em junho, ocorreram muitas pesquisas de DNS para reasedoper[.]pw como para gist.github.com de acordo com o Cisco Umbrella Top 1M.
Mesmo que possa ser considerado como uma alternativa aos anúncios tradicionais, este comportamento é indesejado quando não há o consentimento do usuário. A Divisão de Assuntos do Consumidor de Nova Jersey considerou que a mineração de bitcoins na máquina de um usuário sem consentimento é equivalente a obter acesso ao computador. Portanto, os desenvolvedores de tais serviços devem anunciá-lo antes de iniciar a mineração, o que claramente não é o caso em um esquema de distribuição usando malvertising.
Por último, os usuários podem se proteger contra esses tipos de ameaças, tendo um complemento de bloqueio de anúncios ou um bloqueador de scripts bem configurado em seu navegador. Os usuários da ESET podem se proteger destas sequencias de comandos mal-intencionados, detectadas como um aplicativo não desejado JS/CoinMiner.A, habilitando a detecção de aplicativos potencialmente inseguros.
IOCs
URLs de mineração e malvertising
Domínio | URL | Nota |
static.reasedoper.pw | static.reasedoper[.]pw/launcher.0.single.js static.reasedoper[.]pw/launcher.1.single.js static.reasedoper[.]pw/launcher.2.single.js static.reasedoper[.]pw/launcher.0.multi.js static.reasedoper[.]pw/launcher.1.multi.js static.reasedoper[.]pw/launcher.2.multi.js […] |
Site que hospeda os scripts de mineração. |
mataharirama[.]xyz | mataharirama[.]xyz/launcher.9.single.js […] |
Cópia do reasedoper. Compartilham dois endereços IP:
· 163.172.162.231 · 163.172.153.226 |
listat[.]biz | listat[.]biz/3.html | Redirecionamento para o reasedoper[.]pw ou mataharirama[.]xyz |
lmodr[.]biz | lmodr[.]biz/mdstat.php | Redireção para listat[.]biz |
Hash
Hash (SHA-1) | Nome do arquivo |
Detecção |
fa2f4cf2f38383477a0a78d7e3d0841f254c5adf | launcher.0.multi.js | Aplicativo potencialmente indesejado JS/CoinMiner.A |
b9cd68313b72deac23a53f44ae68598ec139ad27 | launcher.0.single.js | |
e44c502ff69b6bbe291e8125304203af0f675aa3 | launcher.1.multi.js | |
7ce2fb5cea77cbd38cd54533bce81d1b0b0d7a82 | launcher.1.single.js | |
3b28b5f079f6d2bdaa028b31a2b5fa9734f832f2 | launcher.2.multi.js | |
51b97b46fe53cc5aaedc3f45d6517a74008ca9cd | launcher.2.single.js | |
38ccae4555505c8d5f36a9d9c9a20fe80a11304a | launcher.3.multi.js | |
2aa56f945c7d3805d3ee7851cdd4e932f1cd3160 | launcher.3.single.js | |
ae6fe31b8355a3e70d6bf6c89ff7ae18c8de41d0 | launcher.4.single.js | |
fc7e8fb976cc260ceb680e10713e4640b23dde79 | launcher.4.multi.js | |
d5482f2f7bab8a8832f65f6ba5dc2edc5e19687f | launcher.5.multi.js | |
b5d475d9c084d652faabe3888bbda5b673ebe9dd | launcher.5.single.js | |
626646c572211e157dceeb4b918b9f46c3c656f5 | launcher.6.single.js | |
3c70b32180c2e6ae39006eee867135650c98cfa0 | launcher.6.multi.js | |
80c11eb331758a4d6d581ddcb5ebeca9410afe93 | launcher.7.multi.js | |
52317c0abdc69f356dd2865c1fd35923f8beb7d3 | launcher.7.single.js | |
31d40684cd765ef6625fd9a03d2522d84f0ca79b | launcher.8.single.js | |
9bc931ec55d1fed45bec1c571a401f4a201a02cf | launcher.8.multi.js | |
afae4cf246125671b7eae976c7329b4e0729e109 | launcher.9.multi.js | |
3ac2e2d827e39bd802d5e3f7619099696bc38955 | launcher.9.single.js | |
c4c5f13f0250364bd1321d038d56dbf1a97154f8 | launcher.10.single.js | |
29695469e53822602d9b1884c2268a68e80df999 | launcher.10.multi.js | |
b34216ee46ea1355cbc956514012e74ff9712129 | launcher.11.multi.js | |
9394db4ba0ee70673d451547fd4ae40bfea6112d | launcher.11.single.js | |
6f0bf3fa4dea541a7293b89661d539bb602218c6 | launcher.12.single.js | |
3512351bd8903ae82cc1162fed4faaafceba893d | launcher.12.multi.js | |
5adf5146a84699b6aca5e9da52bb629bceaa7726 | launcher.13.single.js | |
8c45141791b94e172fd5ad8eaefebe5ebb8e729c | launcher.13.multi.js | |
519928629becb1f8b18a56609b03d4cea3c52ddd | launcher.14.multi.js | |
c5629530af39c99c25f83baee7db4a24a9d0aa03 | launcher.14.single.js | |
bf3a1151bc4f8188f735583257ecbbd1eaff123f | launcher.15.multi.js | |
6e5d2b1b9f1140079f3b48edec09c8515e77e14d | launcher.15.single.js | |
12b1bfd6b49c02f928f0429f1505d114583c213c | monero.worker.js | |
885f102c9d4dd2e286401756ca265e4aa3f7a664 | scrypt.worker.js |
Domínios com script de injeção hardcodeado
allday[.]in[.]ua
anekbook[.]ru
bike[.]co[.]ua
cg-lab[.]ru
dikobras[.]com
doctrina62[.]ru
ekavuz[.]ru
fenix-45[.]ru
ipnalog[.]ru
jobochakov[.]com
kharkov-arenda[.]com[.]ua
kuzdoska[.]ru
laminirovanievolos[.]ru
marlin-group[.]ru
mat4ast[.]com
megalifez[.]net
mirstihoff[.]ru
munirufa[.]ru
murlyka[.]net[.]ua
newscom[.]ru
obad[.]ru
ogms[.]ru
opinionblog[.]ru
optiplast[.]ru
otdamprimy[.]ru
pcook[.]ru
pogelanie[.]info
posbank[.]ru
programs-tv[.]ru
psinovo[.]ru
scoot-club[.]ru
ska4ka[.]com
stihi[.]by
stihoslov[.]ru
subcar[.]org
sumytex[.]in[.]ua
suntehnic[.]ru
td-klassik[.]ru
trbook[.]com[.]ua
vstupino[.]su
x-sport[.]info