Docker Engineのコンテナで拡散する初めてのクリプトジャック(仮想通貨採掘)ワーム

This post is also available in: English (英語)

概要

パロアルトネットワークスの脅威インテリジェンスチームUnit 42のリサーチャーは新種のクリプトジャック ワーム(他者のコンピューティングリソースを無断で使って仮想通貨の採掘を行うワーム)を特定し、Graboidと命名しました。このワームは2,000を超える安全でないDockerホスト(コンテナ型の仮想化オープンソースソフトウェア)に拡散しています。私たちは1990年代の映画「Tremors (米国のパニック映画。邦題『トレマーズ』)」に出てくるサンドワームになぞらえてこの名を付けました。ちょうどこのサンドワームのように、普段はほとんど動かず、突発的に短時間だけ猛スピードで活動します。

ワームとして拡散するクリプトジャック マルウェアのインシデントはこれまでにもありましたが、Dockerの主要構成要素であるDocker Engine(無償のコミュニティ版)のコンテナを使用し、仮想通貨をマイニング(採掘)するクリプトジャック ワームが拡散することの確認したのは、これが初めてです。従来型のエンドポイント製品は、ほとんどがコンテナ内のデータやアクティビティを検査しないので、この種の悪意のある活動を検出することは困難です。

攻撃者は、セキュリティで保護されていないDockerデーモン(Dockerの管理機能)を通じて最初の足がかりを確保していました。これらDockerデーモンにDockerイメージがまずインストールされ、侵害ホスト上で実行されます。コマンド&コントロール(C2)サーバーからダウンロードされたマルウェアは、仮想通貨Moneroをマイニングするために展開されます。またこのマルウェアは定期的にC2に新しい脆弱なホストについて情報を求め、ワームを拡散する次のターゲットをランダムに選択します。私たちの分析では、各マイニングプログラムは平均して63%の時間は活動をしており、それぞれのマイニングの時間は250秒間継続します。Unit 42チームからこの活動について警告を受けたDockerチームは、弊社チームと連携して対策にあたり、悪意のあるDockerイメージをすみやかに削除しました。

脆弱なホストのIP所在地は世界中で確認されており、これには日本も含まれていました。

コンテナ環境で拡散するクリプトジャック ワーム 

図1 クリプトジャック ワーム活動の概要
図1 クリプトジャック ワーム活動の概要

Shodan(インターネットに接続された機器等の情報をデータベース化した検索サイト)を検索すると、2,000以上のDocker Engineが、セキュリティに問題のある状態でインターネットに公開されていることを示す検索結果が得られます。それらのDocker Engineには認証や認可が設定されておらず、悪意のある攻撃者はそうした無償版Docker Engineとホストを完全に制御下に置くことができます。攻撃者はこうした侵入ポイントからワームを展開・拡散します。

図1は、このワームがどのように配信・拡散されるかを示したものです。攻撃者は、セキュリティで保護されていないDocker デーモンを侵害し、Docker Hubからpull(取得)された悪意のあるDockerコンテナを実行し、C2から複数のスクリプトと脆弱なホストのリストをダウンロードし、次のターゲットを繰り返し選んでワームを拡散していました。

私たちが”Graboid”と名付けたこのマルウェアは、コンテナ内でワームの拡散とクリプトジャックの両方を実行します。また各拡散ごとに3つのターゲットをランダムに選択し、最初のターゲットではワームをインストール、2番目のターゲットではマイニングプログラムを停止、3番目のターゲットではマイニングプログラムを開始します。この手順が、きわめてランダムなマイニング動作につながります。

たとえばあるホストが侵害されても、悪意のあるコンテナはすぐには起動しません。そのホストは、侵害された別のホストが自分を選択し、マイニングプロセスを開始してくれるまで待つ必要があります。そのホストは、さらにべつの侵害ホストからマイニングプロセスをランダムに停止されることがあります。要するに、全感染ホストのマイニングプログラムはほかの全感染ホストによってランダムに制御されることになります。

このランダム化を組み入れた動機についてはわかっていません。単なる設計ミスかもしれないし、あまり効果的ではないによせ回避テクニックのつもりだったのかもしれません。あるいは自律型のシステムを目指したのかほかの何らかの意図があったのかもしれません。

以下、順を追って詳細にオペレーション内容を解説します。

  1. 攻撃者は、セキュリティで保護されていないDockerホストをターゲットとして選択し、リモートコマンドを送信して、悪意のあるDockerイメージpocosow/centos:7.6.1810をダウンロードしてデプロイします。このイメージにはDockerクライアントツールが含まれており、それがほかのDockerホストとの通信に使用されます。
  2. pocosow/centosコンテナ内に存在する侵入ポイントのスクリプト/var/sbin/bashが、C2から4つのシェルスクリプトをダウンロードし1つずつ順に実行します。ダウンロードされるスクリプトはlive.shworm.shcleanxmr.shxmr.shです。
  3. live.shが侵害ホスト上で利用可能なCPU数をC2に送信します。
  4. worm.shは”IP”というファイルをダウンロードします。このファイルには2000件を超えるIPアドレスが記載されています。これらのIPアドレスは、セキュリティで保護されていないDocker APIエンドポイントを持つホストのものです。worm.shはランダムに1つのIPアドレスをターゲットとして選択し、Dockerクライアント ツールを使ってpocosow/centosコンテナをリモートからpullしてデプロイします。
  5. cleanxmr.shはランダムに脆弱なホストをIPアドレスのファイルから1つ選択し、選んだホスト上でクリプトジャック用コンテナを停止します。cleanxmr.shは、ワームがデプロイするクリプトジャック用コンテナ(gakeaws/nginx)だけでなく、ほかに実行しているxmrigベースのコンテナがあれば、それらも複数停止します。
  6. xmr.shはランダムに脆弱なホストをIPアドレスのファイルから1つ選択し、gakeaws/nginxのイメージを選んだホスト上にデプロイします。gakeaws/nginxには、nginxを偽装したxmrigバイナリが含まれています。

侵害されたすべてのホストで、ステップ1からステップ6が定期的に繰り返されます。最新の既知更新間隔は100秒に設定されます。更新間隔、シェルスクリプト、IPアドレスのファイルはすべて、pocosow/centosコンテナの起動後にC2からダウンロードされます。

本稿執筆時点では、Dockerイメージpocosow/centosは1万回以上ダウンロードされています。またgakeaws/nginxは、図2に示すように、6,500回以上ダウンロードされています。私たちは、同じユーザー(gakeaws)が別のクリプトジャック イメージgakeaws/mysqlを公開していることにも気付きました。その内容はgakeaws/nginxと同一でした。

pocosow/centosイメージが悪意のあるものであるかどうかは、シェルスクリプトがダウンロードされ、コンテナ内で実行されるまでは判別できません。ただしgakeaws/nginxイメージが悪意のあるものであることは、イメージのビルド履歴から容易に確認できます。図3に示すように、こちらはビルド時にxmrigのバイナリ名を単純にnginxに変更しているだけだからです(7行目)。こちらは支払い用のアドレスでさえ、ビルド時に環境変数にハードコードされています(6行目)。

図4は、IPアドレスのファイルにリストされている2,034台の脆弱なホストの場所を示しています。これらIPアドレスの57.4%は中国のもので、続く13%が米国のものです。また、マルウェアが使用する15台のC2サーバーのうち、14台のホストについては当該IPアドレスのファイルに記載されているもので、もう1台のホストには50を超える既知の脆弱性がありました。このことから、攻撃者はこれらのホストを侵害し、C2サーバーとして使用していたた可能性が高いことがわかります。Dockerデーモンを掌握してしまえば、Webサーバーのコンテナ(httpd、nginxなど)をデプロイしてそこにペイロードを配置するのは簡単です。

図2 Docker Hub上の悪意のあるDockerイメージ

図3 Gakeaws/nginxイメージの履歴

図4 IPアドレスファイルに記載された脆弱なホストの所在国

ワームのシミュレーション

ワームの有効性と全体的なマイニング性能についての理解を深めるため、私たちはワームをシミュレートする単純なPythonプログラムを作成しました。ここでは、IPアドレスのファイルには2,000台のホストが記載されており、これらのホストの30%がオペレーション中にフェイルし、更新間隔は100秒で、各侵害ホストにはCPUが1つあるものと仮定しています。この検証では30日間のキャンペーンをシミュレートし、以下についての知見が得られることを期待しています。

  1. ワームが脆弱なDockerホストすべてに拡散するのにかかる時間はどれぐらいか
  2. この攻撃者はどのぐらいのマイニング性能を有しているのか
  3. 感染ホストで各マイニングプログラムが活動している時間はどれくらいか

図5の左側半分はワームの拡散速度を示しています。ワームが1,400台ある脆弱なホストのすべて(2,000台以上のホストの70%)に到達するのに、約60分かかりました。図5の右側半分は、侵害ホストの全体的なマイニング性能を示しています。平均では、常に900台程度、活動中のプログラムが存在しています。言い換えれば、攻撃者は少なくとも900個のCPUマイニング性能を持つ1,400ノードのマイニングクラスターを所有していることになります。感染ホストのマイニングプログラムはランダムに開始・停止可能なので、各プログラムは全体の65%の時間しか活動は行っておらず、各マイニング期間は平均でわずか250秒しか続きません。

図5 ワームのシミュレーション

結論

このクリプトジャック ワームには、さほど高度な戦術や手法、手順は含まれていません。ですが、定期的にC2から新しいスクリプトを取得でき、ランサムウェアやマルウェアへの転用は容易で、その後もいかようにでもホストを侵害することができるので、このワームを無視することはできません。同様の侵入方法を取るいっそう強力なワームが作成されれば、さらに損害が大きくなる可能性があります。このため、各組織でのDockerホストの保護は必須です。

以下に、組織が侵害を防止するためのベストプラクティス(対策)を記載します。

  • Dockerデーモンをインターネットに公開するのであれば、適切な認証メカニズムをもたせる。なお、デフォルトでは、Docker Engine(無償コミュニティ版)はインターネットに公開されません。
  • Unixソケットを使ってDockerデーモンとローカル上で通信するか、SSHを使ってリモートのDockerデーモンに接続する。
  • ファイアウォール ルールを使い、限定された接続元からの着信トラフィックのみをホワイトリストに登録しておく。
  • 未知のレジストリや未知のユーザー名前空間からのDockerイメージは絶対にpullしない。
  • システム内に不明なコンテナやイメージがないかを頻繁に確認する。
  • パロアルトネットワークスが提供するPrisma CloudやTwistlockなどのような、クラウドセキュリティソリューションを利用する。こうしたソリューションを使うことで悪意のあるコンテナを識別し、クリプトジャックの活動を防止することができます。

パロアルトネットワークスは本稿で見つかったファイルサンプルや侵害の兆候などをふくむ調査結果をCyber Threat Alliance(CTA: サイバー脅威アライアンス)のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使用して、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害することができます。

Cyber Threat Allianceの詳細については、次のWebサイトをご覧ください: www.cyberthreatalliance.org

IoC

Dockerイメージ:

pocosow/centos:7.6.1810:

ダイジェスト: sha256:6560ddfd4b9af2c87b48ad98d93c56fbf1d7c507763e99b3d25a4d998c3f77cf

gakeaws/nginx:8.9:

ダイジェスト: sha256:4827767b9383215053abe6688e82981b5fbeba5d9d40070876eb7948fb73dedb

gakeaws/mysql:

ダイジェスト: sha256:15319b6ca1840ec2aa69ea4f41d89cdf086029e3bcab15deaaf7a85854774881

Moneroアドレス:

45TwKEr1LjoEPuxnbfuPhaXCf138AoQvtSJ3jdqg1gPxNjkSNbQpzZrGDaFHGLrVT7AzM7tU9QY8NVdr4H1C3r2d3XN9Cty

C2サーバー:

120.27.32[.]15
103.248.164[.]38
101.161.223[.]254
61.18.240[.]160
182.16.102[.]97
47.111.96[.]197
106.53.85[.]204
116.62.48[.]5
114.67.68[.]52
118.24.222[.]18
106.13.127[.]6
129.211.98[.]236
101.37.245[.]200
106.75.96[.]126
47.107.191[.]137