クリプトマイナーに関する分析:マイニングボットネットのシャットダウン
目次
はじめに
弊社のブログシリーズ「クリプトマイナーに関する分析」の最終回です。
最初の記事では、暗号資産(仮想通貨)の基礎とさまざまな特性について、そして脅威アクターにとってその一部が他よりも魅力的である理由について説明しました。
2 番目の投稿では、異なるマイニングトポロジーを悪用したさまざまなクリプトマイニングのサンプルを分析しました。
シリーズの 3 番目になる今回の最後のブログ記事では、クリプトマイナーを打ち負かすために利用できる、プロアクティブな 2 つの新しい手法について説明します。
これらのブログ記事に加えて、当社のリポジトリでは、いくつかの分析ツールもリリースしています。
攻撃が最善の防御であることは、誰もが知っています。クリプトマイナーのキャンペーンには分散的な性質があるため、攻撃を停止することは非常に困難です。
このブログ記事では、一般的なマイニングトポロジーの設計を活用してマイニング動作を効果的にシャットダウンすることで、クリプトマイナーの攻撃阻止に伴う課題を克服する方法を説明します。ここで説明する手法は Monero クリプトマイナーを対象としていますが、他の暗号資産に対しても同じ原則を適用可能です。
クリプトマイナー動作のシャットダウン
悪性のあるクリプトマイナー動作が検知された場合、現在、そのシャットダウンを試みるには次の 2 つの方法があります。
プールサービスに攻撃者アカウントを禁止するようリクエストする方法
攻撃者のインフラ内の他のサービスを停止して、キャンペーンの妨害を試みる方法
これらのオプションの問題は、サードパーティに依存しているために、非常に複雑で時間がかかることです。
私たちは、よりよい方法を発見したのです。
マイニングトポロジーとプールポリシーを活用して 2 つの手法を開発しました。これにより、クリプトマイナーボットネットの効果を、完全にシャットダウンするまで削減できるため、攻撃者はインフラに根本的な変更を加えたり、キャンペーン全体を放棄したりせざるを得なくなります。
どちらの手法も、いわばマイニング活動のアカウントに関連するプロキシやウォレットなどの重要なコンポーネントを禁止できる方法であり、stratum 通信の利用に基づいています。
330 万回をゼロに
私たちが対象としたのは、6 年間アクティブであり続けている悪性のクリプトマイナー動作でした。マイニングトポロジーにおける主要な障害点の 1 つである攻撃者のマイニングプロキシを禁止することで、ハッシュレートを毎秒 330 万回からゼロまで削減できました(図 1)。
攻撃者が資金を稼いでいたのと同じくらい簡単に、攻撃者が 1 年間に得る可能性のある収益の生成を数秒で打ち切ることができました。シンプルなノート PC を使用するだけで、ハッシュレートが激減し、クリプトマイナーのオペレーターは年間 26,000 米ドルの収益源を失うことになりました。
図 2 の動画ではこの手法を説明しており、私たちはこれを「不正なシェア」と呼んでいます。悪性のマイニングプロキシに接続しているクリプトマイナーの被害者を示しています。「不正なシェア」を実行することで、マイニングプロキシをネットワークから禁止することができました。これにより、マイニング動作をシャットダウンし、被害者の CPU 使用率を 100% から 0% に低下させることができました。
図 2:ラボ環境での「不正なシェア」手法の適用
対抗できなければ禁止しよう
プールを介したクリプトマイニングは、シェアと呼ばれる有効なハッシュ計算結果の送信に基づいて行われます。収益を生み出すには、クリプトマイナーはマイニングプールにシェアを送信する必要があります。マイニングプールは、シェアを受信すると、ハッシュ結果とその難易度を検証します。
シェアの検証は、プールサーバーが処理する必要がある最も重いタスクの 1 つで、無効なシェアの場合には特に重くなります。人生における色々なことと同様に、ミスは起こり得ます。たとえば、ハードウェアの不具合により、間違ったシェアがプールに送信される可能性があります。
無効なシェアを処理すると大量のリソースが消費されるため、無効なシェアの大量送信による負荷でプール自体が破綻するのを防がなければなりません。そのため、送信されたシェアがサーバーの検証に合格しない場合、ほとんどのプールでは、通常は一時的な禁止という形で、マイナーに対するペナルティを適用します。
このインタラクションは、悪性のマイニング動作のシャットダウンを試みる際に、非常に興味深いものだと言えます。バックエンドノードやプールに攻撃者マイナー(すなわち被害者)を禁止させることができれば、クリプトマイナーのリソース悪用を停止し、実質的に被害者を解放することができます。
次のセクションでは、先に検討した 2 つのマイニングキャンペーンを対象に、この概念を説明します。各キャンペーンは、マイニングプロキシとパブリックプールへの直接接続という異なるマイニングトポロジーを代表しています。
不正なシェアで攻撃者のマイニングプロキシを禁止
悪意のあるクリプトマイナーが最も一般的に使用するマイニングトポロジーの 1 つが、マイニングプロキシです(図 3)。この構成では、攻撃者のバックエンドとウォレットの両方のアドレスを隠蔽することでプライバシーが強化されるため、ID が保護され、ネットワーク内のトレーサビリティが減少します。
マイニングプロキシは、マイナーが接続するターゲットプールを「隠す」ため、ネットワーク検知に固有の課題をもたらします。これは通常、ネットワーク検査で検知できます。ウォレットアドレスも隠すことで、マイナーの検知可能なフットプリントがさらに制限されます。しかしながら、マイニングプロキシがクリプトマイナーの弱点となりうることがわかりました。
プロキシを使用してマイニングを行う場合、すべての被害者が 1 台のサーバーに接続されます。つまり、そのプロキシを妨害するとすべてのマイニング動作が停止する可能性があるのです。私たちは、そのような操作を実行できる手法を開発しました。
考え方はシンプルです。悪性のプロキシにマイナーとして接続することで、無効なマイニングジョブ結果(不正なシェア)を送信できるようになります。この不正なシェアは、プロキシの検証をバイパスして、プールに送信されます。不正なシェアを連続して送信すると、最終的にプロキシが禁止され、クリプトマイニングボットネット全体のマイニング動作が実質的に停止します。
プロキシとの通信
クリプトマイナーは、最初に Stratum ログイン方式を使用してプロキシに接続する必要があります。他の構成が設定されていない場合、マイナーは XMRig プロキシサーバーによってデフォルトで x と識別されます(図 4)。
接続が成功した場合は、プロキシ側にリスナーが存在することを意味します。応答を解析することで、実際にマイニングプロキシであることを確認できます。有効な応答は Stratum プロトコルに準拠した JSON ドキュメントであり、その結果はジョブになります。
完全なマイニングプロセスは(Zero to Monero で説明されているように)複雑ですが、カスタムシェアの作成は比較的簡単です。プロキシ応答からいくつかの値(ワーカー ID、ジョブ ID、nicehash ノンス)を抽出するだけです。これら 3 つはすべて特定のマイニングジョブを追跡するために必要です。そのため、プロキシが不正なシェアを受け入れるようにするためには、これらのフィールドに正しく入力する必要があります(図 5)。
マイナーからシェアを受信すると、プロキシはそのシェアをほぼそのままプールに転送しますが、重要な違いが 1 つあります。それは、シェアが攻撃者のウォレットアドレスとして送信されることです。そのため、クリプトマイナーのサンプルから、攻撃者のアカウントやプールに関するウォレットなどの情報を知ることはできませんでした。
XMRogue
被害者の 1 人としてクリプトマイナーボットネットに侵入するのはそれほど難しくありません。通常、特別な承認は必要なく、多くの場合には、マイナーとして XMRig、マイニングプロキシとして XMRig-proxy など標準的なアプリケーションを使用します。
これが XMRogue の開発につながりました。XMRogue はマイナーになりすまして、マイニングプロキシへの接続、不正なシェアの連続した送信、そして最終的にはプールからのマイニングプロキシの禁止を実施できるツールです(図 6)。
重要な考慮事項の 1 つに、プロキシレベルでのシェアの検証があります。作成した不正なシェアはプロキシによってプールに転送されるため、識別されてドロップされる可能性があります。
たとえば、一般的な XMRig-proxy は、ジョブに供給される nicehash ノンスと結果の難易度を検証します。ノンスと難易度のいずれかが正しくない場合、不正なシェアはバックエンドプールに転送されません。図 7 では、コード内で検証が行われていることがわかります。この場合、難易度の低いハッシュのシェアや不正なナイスハッシュ値のシェアは破棄されます。
ジョブリクエストを解析し、プロキシが有効とみなすような「不正な」ジョブ結果を慎重に作成することで、そうした検証を乗り越えて、シェアをプールに転送させることができます。
理論をテストする
この手法をテストするために、このシリーズのパート 2 で私たちが特定したマイニングキャンペーンの 1 つをターゲットにしました。選択したキャンペーンで使用されているすべてのマイニングプロキシのアドレスを抽出できました。これにより、非常に多くの操作可能な情報が得られます。たとえば、中心的な攻撃者のプロキシ(「proxy」という独創的な名前)が、Nanopool から最大評価を受けており、広く使用されていることが分かります(図 8)。
このプロキシは毎秒 300 万個のハッシュを生成します。これは、およそ 1 時間あたり 3 米ドルあるいは年間で 26,000 米ドルの収益に相当します。XMRogue でこのプロキシを対象にすることで、これが迅速にプールから禁止され、接続されたすべての被害者のマイニングを停止することができました。プロキシのハッシュレートを検査すると、完全にゼロまで低下していることがわかります(図 9)。
XMRogue が攻撃者のキャンペーン全体に与える影響を検討してみると、その収益性が大幅に低下することが分かります。このキャンペーンが最初に記録された際には、年間約 50,000 米ドルを産み出していました。当社が妨害して不安定な状態になった後は、キャンペーンの年間収益は 76% 減少して 12,000 米ドルになっています。追加のプロキシを対象にしていれば、収益がゼロになっていた可能性もあります。このような影響により、攻撃者はキャンペーンを完全に中止せざるを得なくなったり、監視対象の変更を行う際に特定されるリスクを負ったりする可能性があります。
他のマイニングプールのポリシーの活用
攻撃者は常にプロキシを使用するとは限りません。多くの場合、被害者は直接プールに接続します。つまり、前述の手法は適用できません。不正なシェアを送信すれば、プールから自分の IP アドレスが禁止されるだけで、マイニング動作に影響を与えることはありません。
マイニングプールのソースコードを検査した際に、ウォレットアドレスを対象にした別の手法が思い浮かびました。以前の不正なシェアのポリシーはマイナー IP アドレスを対象にしていましたが、私たちはウォレットレベルで適用されている追加ポリシーを特定しました。それは、ワーカー数が 1,000 以上の場合にウォレットのアドレスを 1 時間禁止するというものです。
プロキシマイニングを使用すると、攻撃者は自身のウォレットアドレスをプロキシサーバーに排他的に埋め込み、効果的にそのアドレスになりすますことができます。しかし直接マイニングが行われる状況では、ウォレットアドレスが被害者のマシンに存在していなければなりません。つまり、攻撃者を抽出することができるのです。
この場合、攻撃者を禁止するのは簡単です。攻撃者のウォレットを使用して 1,000 以上のログインリクエストを同時に送信するだけでプールが攻撃者のウォレットを強制的に禁止します。この手法は、XMRogue ツールに 1 つの操作モードとして追加されました。
このアイデアを説明するために、パブリックプール MoneroOcean を使用する、私たちが発見した別のキャンペーンを使用します。キャンペーンの初期状態は、22 kH/s のハッシュレートでした(図 11)。このキャンペーンは、前述のキャンペーンよりもはるかに規模は小さいですが、その手法自体は、クリプトマイニングキャンペーンの広い範囲の構成に対応するものです。
数千回のログインを瞬時に開始するスクリプトを起動すると、マイニングレートが激減し、最終的には完全に掌握できました(図 12)。
広く対応する策では根本の解決にならない
この戦術は、より多くのマイニング活動を中断できるとしても、恒久的な解決策にはなりません。複数のログイン接続を停止すると、キャンペーンのハッシュレートが回復します(図 13)。
まとめ
上記の手法は、防御側がプールポリシーを利用して、正当なプール操作を中断することなく、悪性のクリプトマイナーキャンペーンを効果的にシャットダウンする方法を示しています。正規のマイナーは、IP やウォレットをローカルで簡単に変更できるため、この種の攻撃から迅速に回復できます。
ボットネット全体を変更する必要があるため、悪性のクリプトマイナーにとって、これは非常に困難なタスクになるでしょう。技術レベルの低いマイナーであれば、この防御によってボットネットが完全に無効になる可能性があります。
シリーズの最後に
この記事をもって、「クリプトマイナーに関する分析」シリーズは完結となります。クリプトマイニングの基礎について説明し、さまざまなマイニングトポロジーを実装するアクティブなキャンペーンを追い求めることで、攻撃者の考え方を探求してきました。
クリプトマイナーの脅威は今後も拡大を続けると私たちは考えています。しかし、攻撃者の活動に対抗してそれを阻止することが可能になっていることから、今やクリプトマイナーを効果的に収益化することは非常に困難なことであると言えるでしょう。