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:
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.
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:
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.
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.
La Figura 6 muestra el consumo de CPU cuando se visita el sitio 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.
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. 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.
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 Feathercoin, Litecoin y Monero usando este script. Sin embargo, parece que actualmente no están minando Litecoin.
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 indeseada 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 |
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