This post is also available in: English (英語)
概要
サイバー犯罪者が利益を上げる方法はたくさんあります。とりわけ簡単なのが他人のコンピューティングリソースを不正に使い、暗号通貨(仮想通貨)をマイニングするクリプトジャックです。コンテナイメージは、ソフトウェアの配布を簡単にしてくれる方法の1つとして知られていますが、悪意のあるクリプトジャッキングイメージもまた、攻撃者がクリプトマイナーを配布する簡単な方法となっています。
筆者がDocker Hubを詳しく調べてみたところ、悪意のあるイメージが30個見つかりました。それらは合計で2,000万回プルされており(つまり、これらのイメージは2,000万回ダウンロードされていたということ)、合計すると20万USドル相当(日本円では2,185万円相当)のクリプトジャックオペレーションが行われていたことになります。本稿では筆者の調査結果について説明するとともに、Docker Hubをはじめとするパブリックレジストリ上に、ほかにも未発見の悪意のあるイメージがたくさん存在するという想定がなぜ理にかなっているのかを説明します。
パロアルトネットワークスのPrisma Cloudをお使いのお客様は、クリプトマイナーをランタイムで検出するCryptominers Runtime Detection機能とTrusted Image(信頼済みイメージ)機能を通じ、これらの脅威から保護されています。。さらにパロアルトネットワークスの次世代ファイアウォールを脅威防御セキュリティサブスクリプションとともにお使いのお客様は、これらイメージの配布から保護されています。
悪意のあるクリプトジャックイメージの探索
ここ数年Unit42のリサーチャーはDocker Hubイメージでマイナーをデプロイするクラウドベースのクリプトジャッキング攻撃をよく目にしています。
クラウドは主に次の2つの理由からクリプトジャッキング攻撃で人気があります。
- クラウドはターゲットごとに多数のインスタンス(多数のCPU、多数のコンテナ、多数の仮想マシン、など)で構成されていることからマイニング利益を拡大しやすい
- クラウドは監視しづらいためマイナーが長時間検出されないまま実行されうる。なんらかの検出メカニズムが導入されていなければ、膨大なクラウド使用請求書を見てはじめてユーザーが何かおかしいと気づくことになるので、その間マイナーを実行しておける可能性がある
最新のクラウドテクノロジはコンテナベースのものが多く、Docker Hubがデフォルトのコンテナーレジストリになっている環境も存在します。それを利用すれば、攻撃者は侵害したクラウドにマイナーを展開することができます。
以上の事実から、筆者はDocker Hubで悪意のあるクリプトジャックイメージを見つけられるかどうかを確認してみたくなりました。この調査の結果、10個の異なるDocker Hubアカウントによる30個のイメージが見つかり、それらのイメージに対するプル数が合計で2,000万回を超えていることがわかりました。
個人はマイニングプールを使ってマイニング効率をあげることがありますが、それは攻撃者も同じです。
マイニングプールを調べれば、あるマイニングプールのアカウントに対してマイニングされた暗号通貨量を確認することができます。私が見つけたイメージの半分はこの情報を共有するマイニングプールを使用していたので、その半分から外挿すると、合計では全攻撃で20万米ドル相当の暗号通貨がマイニングされていたものと推定されました。
この調査結果についてさらに理解を深めるため、筆者は結果を分類しはじめました。パブリックマイニングプールの助けを借り、どの暗号通貨がマイニングされているか、どのクリプトマイナーが使用されているか、何枚のコインがマイニングされているかを確認しました。
コインの分布
Unit 42 ブログをよくお読みくださっているかたにはとくに驚きではないと思いますが、最初の発見は、攻撃者がマイニングする最も人気の高い暗号通貨がMoneroだということでした。これは、Pro-Ocean、Cetusなどのブログでも同じ結果でした。
攻撃者は次の3つの理由でMoneroを支持しています。
- 最大の匿名性を提供していること。他のコインと違い、Moneroはトランジションが非表示という特徴をもちます。サイバー犯罪活動を隠せるこのプライバシーはサイバー犯罪者にはうってつけです。サイバー犯罪者は取引所から締め出されることもなく、自身の資金を追跡する試みを回避しやすくなっています。
- マイニングにASICまたはGPUを必要とする他の多くの暗号とは異なり、マイニングアルゴリズムがCPUマイニングを優先すること。コンピュータにはかならずCPUが搭載されているため、これは便利です。どのマシンでもマイナーを効果的に実行できます。ほとんどのコンテナはGPUなしで実行されているのでこれはとくにコンテナ向きといえます。
- コインに人気があり、その取引高が1日約1億米ドルにおよび、攻撃者がコインを販売しやすいこと。
次の図は、Docker Hubで見つかったクリプトジャックイメージの暗号通貨の分布を示しています。
クリプトマイナーの分布
Hildegard、Graboidでも見てきたとおり、Moneroをマイニングするほとんどの攻撃で、攻撃者はXMRigを使用していました。XMRigは人気のあるMoneroマイナーです。使いやすく、効率的で、なによりもオープンソースであることから攻撃者に好まれています。オープンソースなので攻撃者がコードを変更することができます。
たとえばほとんどのMoneroクリプトマイナーは、マイニング時間の一部をマイナー開発者に強制的に寄付するようになっていますが、攻撃者がよく行う変更の1つがこの寄付割合を0に変更することです。
イメージタグ
コンテナレジストリを使用すると、ユーザーはイメージをアップグレードし、その過程で新しいタグをレジストリにアップロードすることができます。タグは同じイメージの異なるバージョンを参照する方法です。
筆者がイメージタグを調べたところ、CPUアーキテクチャやオペレーティングシステムごとに異なるタグが付いているイメージがあることがわかりました。一部の攻撃者は融通を利かせて多数のオペレーティングシステム(OS)やCPUアーキテクチャを含む幅広い潜在的被害者に対応するためにこうしたタグを追加しているようです。
なかには、さまざまな種類のクリプトマイナータグをつけてあるイメージまで存在していました。こうすることで、攻撃者は被害者のハードウェアに最適なクリプトマイナーを選択することができます。
ある特定のイメージのすべてのタグに共通しているのは、ウォレットアドレスないしマイニングプールの資格情報だけです。これらの識別子の助けを借り、各キャンペーンを分類することができました。これを掘り下げてみると、同じキャンペーンに属するDocker Hubアカウントが多数見つかることがありました。たとえば、以前の調査でUnit 42は悪意のあるアカウントazurenqlを発見しましたが、今回の調査では、このキャンペーンがもっと大きなもので、021982、dockerxmrig、ggcloud1、ggcloud2などのアカウントも含まれていたことがわかりました。
筆者の調査で、最近Unit 42が公開したazurenqlについての調査結果と同じキャンペーン用にMoneroをマイニングしている追加イメージを見つけることができました。これにより、同攻撃者名で1,000万回を超えるプルが追加されることになります。
結論
クラウドはクリプトジャック攻撃に大きなチャンスをもたらします。今回の調査では、単純な暗号化ペイロードだけを検出する暗号化スキャナを使用しました。またウォレットアドレスを以前の攻撃と関連付けることにより、識別されたイメージが悪意のあるものであることも確認しました。こんな単純なツールでも、何百万ものプル回数をもつイメージが数十個見つかったということは、こうした現象は今回見つけられたものよりずっと規模が大きいのではないかと思われます。ペイロードが簡単に検出できない場合も多いからです。
パロアルトネットワークスのPrisma Cloudをお使いのお客様は、クリプトマイナーをランタイムで検出するCryptominers Runtime Detection機能とTrusted Image(信頼済みイメージ)機能を通じてこれらの脅威から保護されています。。さらにパロアルトネットワークスの次世代ファイアウォールを脅威防御セキュリティサブスクリプションとともにお使いのお客様は、これらイメージの配布から保護されています。
IoC
Dockerイメージ
- 021982/155_138
- 021982/66_42_53_57
- 021982/66_42_93_164
- 021982/xmrig
- 021982/xmrig1
- 021982/xmrig2
- 021982/xmrig3
- 021982/xmrig4
- 021982/xmrig5
- 021982/xmrig6
- 021982/xmrig7
- avfinder/gmdr
- avfinder/mdadmd
- docheck/ax
- docheck/health
- dockerxmrig/proxy1
- dockerxmrig/proxy2
- ggcloud1/ggcloud
- ggcloud2/ggcloud
- kblockdkblockd/kblockd
- osekugatty/picture124
- osekugatty/picture128
- tempsbro/tempsbro
- tempsbro/tempsbro1
- toradmanfrom/toradmanfrom
- toradmanfrom/toradmanfrom1
- xmrigdocker/docker2
- xmrigdocker/docker3
- xmrigdocker/xmrig
- xmrigdocker/xmrig
- zenidine/nizadam