satetsu888のブログ

アラサーwebエンジニアのブログ

Coinhiveとその周りの攻防を解説するよ

Webサイトの新たな収益化手法としての期待されたり、ただのマルウェアだと非難を受けたりあちこちで盛り上がってるCoinhiveですが、残念ながらいろんなアンチウイルスソフトにブロックされはじめたようで完全に闇のツール扱いになってしまったようです。

さすがにウイルスだと言われているところから逆転するには相当の奇跡的なこと(ex. 突然Googleが買収して GoogleMinig として Adsense と並べられるとか)がない限り無理だろうとは思っていますが、その一方でCoinhiveをブロックする手法とそれを回避する方法が色々提唱されてちょっと面白い展開になってると思ったので、ブラウザマイニング技術の落ち着く先に期待しつつ、Coinhive周辺で発生している攻防を簡単に紹介してみようと思います。

Coinhiveの基本動作

まずはCoinhive自体はどのような仕組みで動いているのかのおさらいからです。 個人的にはCoinhive自体が悪だとは思ってないんですが、わかりやすさ優先でCoinhiveスクリプトの設置者は泥棒アイコンにしました。

f:id:satetsu888:20171009220526j:plain
Coinhiveの基本動作

サイトオーナーがサイト上のCoinhiveスクリプトを閲覧者へ送り込み、そのスクリプトがCoinhiveサービスの本体と通信して採掘を行います。 採掘を手伝った報酬はCoinhiveからサイトオーナーへ支払われます。

この関係図だけ見るとサイト閲覧者はタダ働きさせられているように見えますが、本当はサイトのコンテンツ閲覧と引き換えに採掘させられているというポイントは覚えておいてください。ここテストに出ます。

Coinhiveの通信ブロッカー

サイト閲覧者とCoinhiveの間の通信を邪魔してしまおうというのが通信ブロッカーです。 具体的にはhostsを書き換えて coinhive.com への通信を全部落としてしまうなどがあります。

f:id:satetsu888:20171009220629j:plain
通信ブロック

これで採掘はできず、サイトオーナーに報酬が支払われることもありません。

ブロッカーをプロキシで回避

coinhive.com への通信をブロックするのは簡単ですが、それだけで採掘を完全に止められるわけではありません。

github.com

coin-hive-proxycoinhive.com への通信ブロック対策で作られたもので、別のドメインを経由させることで止められている経路を迂回してCoinhiveを使おうという戦略です。

f:id:satetsu888:20171009220653j:plain
通信ブロック回避

またそのドメインもブロックすれば良いだけに見えますが、いろんなサイトのオーナーがそれぞれプロキシを立てまくって毎日新しいものが生まれているような状態になってしまうと、通信させたくない全てのドメインを管理して延々と追加し続ける必要があり、これはなかなか現実的ではないと思います。

Coinhiveのスクリプトブロッカー

通信を止めるのではなくサイトオーナーから送り込まれたスクリプト側を止める方法もあります。 具体的にはアンチウイルスソフトによる削除や隔離がこれに当たります。

f:id:satetsu888:20171009220903j:plain
スクリプトブロック

すでにアンチウイルスによってスクリプトが止められる報告が上がっていて、僕もSophosによって coinhive.min.js が隔離されるのを確認しました。 これによってCoinhive自体はもう使い物にならないのではないかというのが僕の意見です。

ただし、アンチウイルスソフトの検出方法によってはまだ抜け道がある可能性はあります。 該当スクリプトMD5をみるだけのような単純な検出だと今後それを回避するための亜種がいくらでも出てくると思います。スクリプト中のマイニング特有の計算を行なっている部分をパターンマッチで検出してるようであればほとんど全ての亜種を退治してくれる気がしますが、この辺りどうなってるのかは誰か詳しい人教えてください。

Coinhive alternative

Coinhive自体はもうダメそうだと言いましたが、ブラウザでのマイニング自体がダメになった訳ではありません。 Coinhiveの流行によってすでにクローンサービスが複数立ち上がっているようです。

Crypto-Loot - A Web Browser Miner | Traffic Miner | CoinHive Alternative

首页 – ProjectPoi – ProjectPoi 是一个基于JavaScript的门罗币挖矿程序

また仮想通貨周りはほとんど全てのものがオープンソースなので、自分でマイニングプールを立てて、そこにつなぎに行くプロキシを立てて、アンチウイルスに引っかからないようにスクリプトを改造すればオリジナルCoinhiveが作れます。

github.com

github.com

f:id:satetsu888:20171009220947j:plain
別のサービスがあるし自分でも作れる

アンチウイルスの検出精度によっては無限にイタチごっこが続きそうです。

ただ幸か不幸か今のところブラウザマイニングによる収益はめちゃくちゃ小さいので、アンチウイルスソフトを避けながらでもどうしてもマイニングさせたいモチベーションというのは実はあんまりなさそうで、 めちゃくちゃ多数のアクセスと滞在時間をもってるサービスの収益化(ex. Youtube x GoogleMinigとか夢がある)とかでない限りは真剣に研究する人はいないかもしれません。

ブラウザでのマイニング行為に対する妨害

さてようやくこの記事で一番書きたいことまできました。

今までの手法はマイニングをしない・させないことでサイト閲覧者を守っていましたが、逆転の発想でマイニングはする、ただし不真面目にやる、という方法でも防御が可能なことを発見しました。

f:id:satetsu888:20171009221342j:plain
不真面目にマイニングする

細かい話をすると難しくなるので雰囲気だけ説明します。

暗号通貨の分散マイニングというのは地面に埋まっているダイヤモンドをみんなで手分けして掘って探す感じです。

掘らせる人(Coinhive)はそれぞれの掘る人(サイト閲覧者)がちゃんと仕事をしているのか監視するために、地面を掘って出てきたもののうちダイヤじゃなくてもまあまあ綺麗な石があったら提出するように言います。

地面に埋まっているまあまあ綺麗な石の存在確率はだいたいわかっているので、まあまあの石1つを持ってきたということはこいつはこれくらいの範囲を掘ったな、というのがわかりそのぶんの報酬がもらえるという風になっています。

しかし不真面目に掘る場合は、地面を掘って出てきた普通の石を全部まあまあ綺麗だと言い張って提出しようとします。(これはツイートしてるlow-diff share attackとは違うinvalid share attackとでも呼ぶべき方法でずっと簡単です)

その結果Coinhive側からお前はもう採掘すんなと言われ通信できなくなるという寸法です。

この方法の面白いポイントは、仮想通貨のマイニングの仕組み自体の邪魔をするので別のサービスでも自作マイニングプールでも仮想通貨を掘らせたい相手には汎用的に使えるところと、これをやられた時にサイトオーナーが打てる対策がおそらくないというところです。ここもテストに出るので覚えて帰ってください。

終わりに

Coinhiveに注目が集まったことでブラウザでのマイニングが議論されると共に、アングラサイトを中心に人のマシンのCPUを全力で使う迷惑なサイトが沢山でてきそうです。 当面はアンチウイルスソフトさえ入れておけば大丈夫な感じはしますが、アンチウイルスを回避する悪い奴がいた時にこの記事が自分の身を自分で守れるような知識の一助になれば幸いです。

あとマイニングへの妨害は法律的にどうなのか誰か教えてください