En los últimos meses, nos encontramos con algunos archivos JavaScript aparentemente usados para minar criptomonedas directamente dentro del navegador. Ya hace tiempo que los cibercriminales se aprovechan de la minería de estas divisas para obtener ganancias, aunque generalmente usan malware o aplicaciones potencialmente indeseadas que instalan en la máquina de la víctima a tal fin.

Pero en este caso particular, la minería se ejecuta directamente dentro del navegador cuando el usuario navega hacia determinados sitios web. Por lo tanto, no hay necesidad de infectar a la víctima o explotar vulnerabilidades; solo se necesita un navegador con JavaScript activado, lo cual ocurre por defecto en la mayoría de los casos. Este artículo describe la investigación que hicimos para entender mejor esta amenaza.

Comenzamos explorando nuestra telemetría y hallamos que, parcialmente, la amenaza se distribuye usando malvertising. Este tipo de tarea de uso intensivo de la CPU generalmente está prohibida en la mayoría de las redes publicitarias, porque degrada sustancialmente la experiencia del usuario. Minar criptomonedas en el navegador podría parecer contraproducente (sabemos que hacerlo requiere mucha potencia de la CPU), pero los cibercriminales, como veremos más adelante, eligieron divisas que no requieren hardware personalizado para ser creadas. Por otro lado, es más fácil llegar a una cantidad significativa de equipos “infectando” sitios web que infectando a los usuarios particulares.

Aunque esta técnica podría ser usada en cualquier país, notamos que esta campaña en particular impactó principalmente en Rusia y Ucrania. Es importante señalar que esto se debe probablemente al idioma de los sitios web en que se inyectan los scripts, ya que pudimos acceder a ellos desde una dirección IP de los Estados Unidos.

La Figura 1 muestra los cinco países más afectados:

Figura 1: Países afectados por el web miner según la telemetría de ESET LiveGrid®.

La Figura 2 muestra el ranking histórico de Cisco Umbrella Top 1M de uno de los dominios (reasedoper[.]pw) que aloja estos scripts. Notamos un aumento significativo en las consultas de DNS para el dominio durante el período marzo-abril de 2017. El 28 de junio de 2017, reasedoper[.]pw ocupaba el puesto 26.300 de la lista, casi el mismo puesto que el popular sitio para compartir texto GitHub Gist (gist.github.com), que estaba 26.293° en la misma fecha.

Figura 2: reasedoper[.]pw en el ranking Cisco Umbrella Top 1M. Cuanto más abajo, más popular.

Historia

La idea de minar criptomonedas en navegadores no es exactamente nueva. En 2013, un grupo de estudiantes del MIT fundó una compañía llamada Tidbit, que ofrecía un servicio web para minar bitcoins. En vez de mostrar anuncios publicitarios, los webmasters podían incluir los scripts de Tidbit en sus sitios para ganar dinero de esta forma.

Sin embargo, los fundadores del servicio recibieron una citación de la oficina del Fiscal General de Nueva Jersey porque utilizaron el poder de cómputo de los usuarios sin su consentimiento. Finalmente llegaron a un arreglo, pero tuvieron que abandonar su proyecto.

Previamente, muchos otros servicios, como bitp[.]it, proveían minería de bitcoins en navegadores web. Pero debido a la creciente ineficacia del uso de CPU o GPU regulares, estos servicios cerraron. Por ejemplo, bitp[.]it cerró en julio de 2011.

Cómo se distribuye

La distribución de este tipo de script es clave para determinar si es legítimo o indeseado. En este caso, pudimos encontrar dos formas distintas en las que los usuarios se pueden ver forzados a ejecutarlos: malvertising y un snippet de código JavaScript hardcodeado.

La Figura 3 muestra el esquema de distribución global de los scripts de minería:

Figura 3: Esquema de distribución de los scripts de minería.

Malvertising

Como decíamos, el principal método de distribución de los scripts de minería es el malvertising. Generalmente, consiste en comprar tráfico de una red de anuncios y distribuir JavaScript malicioso en vez de un anuncio publicitario tradicional. En esta campaña, no estamos seguros si la inyección del script fue intencional o si listat[.]biz fue comprometido.

De cualquier manera, listat[.]biz es muy sospechoso porque parece imitar a LiveInternet counter (LI stat), que es un contador web legítimo. Además, muchos dominios sospechosos se registraron con la misma dirección de email, incluyendo lmodr[.]biz, que también está presente en la cadena de malvertising.

Los sitios que más tráfico proveyeron a los scripts de minería durante julio de 2017 se muestran en la Figura 4. Advertimos que la mayoría son sitios de streaming de video o de juegos que se juegan desde el navegador, lo cual tiene sentido, porque sus usuarios tienden a pasar mucho tiempo en la misma página cuando miran una película o juegan.

Adicionalmente, esas páginas suelen tener una carga de CPU mayor que lo normal, lo cual escondería la carga adicional del script de minería. Así, le permite ejecutarse más tiempo y aprovechar una mayor capacidad de cómputo.

Figura 4: Sitios web que proveen tráfico a los scripts de minería según la telemetría de ESET LiveGrid®.

El sitio en el que observamos mayor cantidad de impresiones publicitarias maliciosas, okino[.]tv, parece ser particularmente popular. Al momento de escribir este artículo, Alexa Rank lo posicionaba 907 en Rusia y 233 en Ucrania. Algunos de los otros sitios web también parecen ser populares, ya que figuran en el Alexa Top 1000 para Rusia.

 

Figure 5 – Okino[.]tv Alexa Rank.

La Figura 6 muestra el consumo de CPU cuando se visita el sitio wotsite[.]net:

Figura 6: Consumo de CPU cuando se visita wotsite[.]net.

La Figura 7 provee un ejemplo de la cadena de redirección descrita anteriormente en la Figura 3. Los primeros tres saltos solo inyectan el script provisto por el siguiente salto, como se muestra en las figuras 8, 9 y 10. El primer dominio usado en la redirección (skyadsvideo1[.]ru en nuestro ejemplo) no es siempre el mismo: también hemos visto a code.moviead55[.]ru.

Ambos resuelven hacia las mismas direcciones IP, 167.114.238.246 y 167.114.249.120. Según datos de Whois para el dominio skyad[.]video, cuyo subdominio code.skyad[.]video también resuelve a las mismas IP, los dominios parecen estar relacionados a SkyAdVideo, dueño de una red de anuncios.

Figura 7: Cadena de redirección desde okino[.]tv al script de minería.

Figura 8: Desde la página de inicio de Okino[.]tv

Figura 9: Desde el script en Skyadsvideo1[.]ru/code.php (tras la desofuscación).

Figura 10: lmodr[.]biz/mdstat2.php.

Ua búsqueda en PassiveTotal muestra que listat[.]biz solo redirigía a los scripts, excepto los días 1 de junio y 5 de julio, en los que también redirigía a contadores web reales y a anstatalsl[.]biz. Por lo tanto, parece que lmodr[.]biz y listat[.]biz solo se usan para inyectar los scripts de minería.

Figura 11: listat[.]biz/3.html.

Sorprendentemente, también notamos que moviead55[.]ru, el primer salto, también podía inyectar un miner, que está alojado directamente en este sitio y puede minar la criptomoneda ZCash. Usa un pool ubicado en ws.zstat[.]net:8889, y se comunica a través de web sockets. Sin embargo, no pudimos demostrar similitudes entre su código y el de los scripts alojados en reasedoper[.]pw. Por lo tanto, podemos asumir que hay diferentes grupos tratando de obtener ganancias usando el poder de cómputo de sus visitantes.

Código JavaScript hardcodeado

También encontramos en Google Cache cerca de 60 sitios web inyectados con lo que parece el mismo snippet de JavaScript mostrado en la Figura 10. La página de inicio de estos sitios inyecta un script desde una URL script.php.

Figura 12: Inyección de script en la página de inicio.

Este script llama a URLs de varios dominios, incluyendo static.reasedoper[.]pw, que aloja los scripts JS usados para la minería, cuyo análisis se encuentra en la siguiente sección. Notamos también que uno de los otros dominios inyectados, listat[.]org, comparte direcciones IP con el usado para la campaña de malvertising (listat[.]biz). Otra similitud es el nombre de una función, show_260, que también se usa en esa campaña.

En la sección de IoCs ofrecemos una lista no exhaustiva de dominios afectados, aunque ninguno de ellos parece ser un sitio muy conocido.

Cómo se minan criptomonedas

Varios scripts se alojan en static.reasedoper[.]pw y mataharirama[.]xyz. Los que tienen “multi” en su nombre son multiproceso, mientras que aquellos con “single” usan un solo proceso. Son los archivos JavaScript principales que pondrán en marcha a los trabajadores para minar diferentes criptomonedas. Estos scripts están ligeramente ofuscados: los literales de cadena se escriben solo con la secuencia de escape hexadecimal (“\x42\x43…”).

La Figura 13 muestra que se puede minar FeathercoinLitecoin y Monero usando este script. Sin embargo, parece que actualmente no están minando Litecoin.

Figura 13: Se pueden minar tres monedas.

Feathercoin y Litecoin están inspiradas en Bitcoin, aunque la principal diferencia es que usan diferentes algoritmos de hash: neoscrypt y scrypt, respectivamente. El objetivo es reducir la necesidad de usar hardware personalizado, como mineros ASIC, en vez de CPUs regulares. Minarlas no solo requiere potencia de la CPU, sino también una gran cantidad de memoria.

La última moneda alternativa, Monero, es diferente a las otras dos. Su característica principal es un nivel de privacidad mayor en comparación con Bitcoin, porque es más difícil rastrear las transacciones dado que el blockchain no es transparente. En particular, usa firmas de círculo para esconder la dirección del remitente entre muchas otras direcciones de remitente posibles. También genera una nueva clave pública para cada transferencia, con el fin de esconder al destinatario real. El algoritmo de hash usado, cryptonight, también requiere mucha memoria. Por lo tanto, tiene sentido que hayan elegido este tipo de monedas alternativas para minar con JavaScript en máquinas regulares.

Como la minería requiere mucho poder de cómputo, no es ninguna sorpresa que el operador haya decidido usar asm.js en vez de JavaScript regular para implementar los algoritmos de hash. Se dice que asm.js es entre 1,5 y 2 veces más lento que la implementación regular de estos algoritmos en C. Se proveen tres de ellos: scrypt.asm.js (Litecoin), cryptonight.asm.js (Monero) y neoscrypt.asm.js (Feathercoin).

Finalmente, la dirección de la billetera Feathercoin es la misma en todos los scripts, mientras que se utilizan varias direcciones de Monero. Sin embargo, varios scripts comparten la misma dirección; por lo tanto, creemos que pertenecen al mismo grupo.

Como la principal característica de Monero es el anonimato, no pudimos acceder a la cantidad de dinero almacenada en las billeteras. En cuanto a Feathercoin, la dirección no figuraba en la red y no estamos seguros por qué, pero podría deberse al uso de un pool para minería.

Relación con web miners anteriores

En los scripts de minería encontramos esta dirección de Feathercoin hardcodeada: 6nmfjYVToBWb2ys4deasdydPj1kW9Gyfp4. Una búsqueda rápida en Gooble muestra que esta dirección se ha estado usando durante varios años.

En un artículo publicado a principios de 2016, un usuario de Internet se quejaba de un script que usaba el 100% de su CPU. Lo que describía es muy similar a lo que hemos analizado y la dirección de Feathercoin coincide. Al momento de descubrirlo, el script estaba alojado en minecrunch[.]co y, al buscar ese dominio, llegamos a una conversación en cryptocurrencytalk.com en la que el usuario Kukunin describe su “humilde servicio, MineCrunch”.

En relación al funcionamiento, Kukunin explica:

“Mientras que la minería clásica con CPU da poca ganancia, la minería distribuida (cientos y miles de visitantes) de una nueva Criptomoneda (que use solo CPU o similar) con velocidad casi nativa (gracias a asm.js) sería muy bueno.

[…]

El miner C Scrypt fue compilado a Javascript usando Emscripten para alcanzar el mejor desempeño. El desempeño es cerca de 1,5x más lento que la aplicación nativa cpuminer”.

 

Un enlace en el primer post (https://kukunin.github.io/webminer/) muestra la misma dirección de Feathercoin como ejemplo. Esto refuerza la relación entre el miner de reasedoper[.]pw y minecrunch[.]co. Sin embargo, si el objetivo de MineCrunch era proponer un servicio abierto para minería distribuida, las ganancias generadas por reasedoper[.]pw beneficiarían solo al autor de MineCrunch (o a los dueños de las direcciones hardcodeadas), ya que es poco probable que sea posible especificar un identificador del afiliado.

Conclusión

A pesar de la baja en el desempeño al usar un miner JavaScript en vez de un programa nativo, el número de visitantes que recibe el sitio probablemente permite que los operadores obtengan ganancias. En junio, hubo tantas consultas DNS para reasedoper[.]pw como para gist.github.com, según el ranking Cisco Umbrella Top 1M.

Incluso si se puede considerar una alternativa a los anuncios tradicionales, este comportamiento es no deseado cuando no hay consentimiento del usuario. La División de Asuntos del Consumidor de Nueva Jersey consideró que minar bitcoins en la máquina de un usuario sin consentimiento es equivalente a obtener acceso a la computadora. Por lo tanto, los desarrolladores de estos servicios deben anunciarlo claramente antes de iniciar la minería, lo que claramente no es el caso en un esquema de distribución utilizando malvertising.

Por último, los usuarios pueden protegerse contra este tipo de amenazas al instalar un complemento de bloqueo de anuncios o un bloqueador de scripts bien configurado en su navegador. Los usuarios de ESET pueden protegerse de estas secuencias de comandos malintencionadas, detectadas como aplicación potencialmente no deseada JS/CoinMiner.A, habilitando la detección de aplicaciones potencialmente no seguras.

IOCs

URLs de minería y malvertising

Dominio 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
[…]
Sitio que aloja los scripts de minería.
mataharirama[.]xyz mataharirama[.]xyz/launcher.9.single.js
[…]
Copia de reasedoper. Comparten dos direcciones IP:·         163.172.162.231

·         163.172.153.226

listat[.]biz listat[.]biz/3.html Redirección a reasedoper[.]pw o mataharirama[.]xyz
lmodr[.]biz lmodr[.]biz/mdstat.php Redirección a listat[.]biz

 

Hash

Hash (SHA-1) Nombre de archivo Detección
fa2f4cf2f38383477a0a78d7e3d0841f254c5adf launcher.0.multi.js Aplicación potencialmente indeseadaJS/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

 

Dominios con script de inyección 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