Hildegard: Kubernetesを標的とする新たなTeamTNTのクリプトジャックマルウェア

This conceptual image covers the concept of container security. Attacks on containers, such as that of the Hildegard malware detailed here, can allow attackers access to a large amount of computing resources.

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

概要

2021年1月、Unit 42のリサーチャーは、Kubernetesクラスタを標的とした新しいマルウェアキャンペーンを検出しました。攻撃者は、誤って匿名アクセスを許可する構成にしてしまっているkubeletを経由して初期アクセスを取得していました。Kubernetesクラスタに足がかりを得ると、マルウェアは可能な限り多くのコンテナに拡散しようとし、最終的にクリプトジャックオペレーションを開始しました。使用された戦術、技術、手順(TTP)に基づき、私たちはこの攻撃者がTeamTNTであるものと考えています。私たちは、この新しいマルウェアをHildegardと呼んでいます。この名前は、マルウェアが使用していたtmateアカウントのユーザー名にちなむものです。

TeamTNTは、以前の調査で文書化されているように、セキュアではないDockerデーモンを悪用し、悪意のあるコンテナイメージをデプロイすることで知られています(詳細はCetusBlack-TTeamTNT DDoSを参照のこと)。しかしながら、TeamTNTがKubernetes環境をターゲットにする様子を確認したのはこれが初めてです。TeamTNTの以前のキャンペーンで特定されたものと同じツール、ドメインに加え、今回の新しいマルウェアにはステルス性・永続をさらに高める複数の新機能が備わっています。具体的には、TeamTNTのHildegardマルウェアには次の特徴がありました。

  • コマンド&コントロール(C2)接続を確立するために2つの方法、tmateリバースシェルとインターネットリレーチャット(IRC)チャネルを利用する
  • 既知のLinuxプロセス名(bioset)を使って悪意のあるプロセスを偽装する
  • 悪意のあるプロセスを隠すためにLD_PRELOADに基づくライブラリインジェクション手法を使用する
  • バイナリ内の悪意のあるペイロードを暗号化し自動静的分析されにくいようにする

この新しいマルウェアキャンペーンはまだ開発途中なのか、そのコードベースやインフラストラクチャはまだ不完全なようです。本稿執筆時点では、Hildegardのインフラストラクチャのほとんどは1か月しかオンラインになっていません。C2ドメインborg[.]wtfが登録されたのは2020年12月24日で、IRCサーバーがオンラインになったのは2021年1月9日です。また、悪意のあるスクリプトの一部は頻繁に更新されています。このマルウェアキャンペーンのハッシュパワーは約25.05KH/秒で、ウォレットの残高は11 XMR(米ドル換算で最大1,500ドル、日本円換算でおよそ16万円)です。

最初の検出以降は活動が確認されていません。これはこの脅威キャンペーンがまだ偵察・兵器化の段階にある可能性を示しています。しかしながら、マルウェアの性能や標的となった環境を考えるに、このグループが近く大規模な攻撃をしかけるだろうと考えるに足る根拠はあります。本マルウェアは、Kubernetes環境の豊富なコンピューティングリソースを活用してクリプトジャックを実行し、クラスタで実行されている何万ものアプリケーションから機微データを漏出させる可能性があります。

パロアルトネットワークス製品をご利用のお客様は、Prisma Cloudのランタイム保護、Cryptominer Detection、Prisma Cloud Compute Kubernetes Compliance Protectionによってこの脅威から保護されています。これは、不十分なKubernetes構成を警告し、安全な代替手段を提供します。

この図は、ノードA、B、Cに分割されたKubernetesクラスタを介した攻撃者の動きを示しています。攻撃からtmateの使用、IRCC2サーバーの使用への進行を示しています。
図1 攻撃者とマルウェアの動き

TTP(戦術、技術、および手順)

図1は、攻撃者がどのように侵入し、横展開し、最終的に複数のコンテナでクリプトジャックを実行したかを示しています。

  1. 攻撃者は、インターネット上のセキュアでないKubeletを悪用することから始め、Kubernetesノード内で実行されているコンテナを検索しました。攻撃者は、ノードAでコンテナ1を見つけた後、コンテナ1でリモートコード実行(RCE)を実行しようとしました。
  2. 攻撃者はtmateをダウンロードし、コマンドを発行してtmateを実行し、コンテナ1からtmate.ioへのリバースシェルを確立しました。その後、このtmateセッションで攻撃を続けました。
  3. 攻撃者はコンテナ1からmasscanを使ってKubernetesの内部ネットワークをスキャンし、ノードBとノードCのセキュアでないKubeletを見つけました。次に、これらのKubeletが管理するコンテナ(コンテナ2〜7)に悪意のあるクリプトマイニングスクリプト(xmr.sh)をデプロイしようとしました。
  4. xmr.shを実行したコンテナは、xmrigプロセスを開始し、IRC C2に戻るIRCチャネルを確立しました。
  5. 攻撃者は、コンテナの1つ(コンテナ4)からの別のtmateセッション作成にも成功していました。リバースシェルを使用すすることで、より手動の偵察やオペレーションが実行しやすくなります。

各コンテナで見つかった侵害の痕跡(IOC)は本稿巻末に付記します。これらのファイルはシェルスクリプトまたはExecutable Linkable Format(ELF)のいずれかです。本稿巻末のIOCのセクションに各ファイルのハッシュ値とその詳細についても記載しておきますのでご覧ください。

  • コンテナ1: TDGGが Kubelet を介してドロップ・実行された。TDGGはその後、tt.sh api.keytmateをダウンロード・実行。攻撃者は確立されたtmate接続を使用してsGAU.shkshell、install_monerod.bash、setup_moneroocean_miner.shxmrig(MoneroOcean)をドロップ・実行した
  • コンテナ2-7: xmr.shがKubeletを介してドロップ・実行された
  • コンテナ4: 攻撃者はこのコンテナではtmateセッションも確立。その後はpei.sh、pei64/32、xmr3.assi、aws2.sh、t.sh、tmate、x86_64.so、xmrig、xmrig.soをドロップ・実行

図2は本マルウェアキャンペーンのTTPをMITER ATT&CK戦術にマッピングしたものです。次のセクションで各段階で使用される手法について詳しく説明します。

これは、初期アクセス、実行、特権昇格、防御回避、資格情報アクセス、発見、横展開、コマンド&コントロール、影響などのMITRE ATT&CK戦術にマッピングされたHildegardマルウェアキャンペーンのTTP(戦術、技術、および手順)の詳細です。
図2 攻撃者のTTP(戦術、技術、手順)

初期アクセス

kubeletは各Kubernetesノードで実行されているエージェントで、さまざまなコンポーネント(主にkube-apiserver)からのRESTfulリクエストを受け取ってポッドレベルのオペレーションを実行します。構成次第でkubeletは未認証のリクエストを受け入れまたは拒否します。標準Kubernetesデプロイメントのデフォルトではkubeletへの匿名アクセスが有効です。ただしAzure Kubernetes ServiceなどのほとんどのマネージドKubernetesサービス(AKS)や、Google Kubernetes Engine(GKE)、Kubernetesオペレーション(Kops)などは、すべてデフォルトで適切な認証をエンフォースしてくれます。

私たちはTeamTNTが匿名アクセスを許可するkubeletsでコマンドを実行することでHildegardマルウェアによる初期アクセスを得ていたことを突き止めました。攻撃者はこれをkubeletのrun command APIにアクセスして実行中のコンテナ上でコマンドを実行することで達成していました。

実行

Hildegardは、kubeletのAPIを使ってコンテナ内でコマンドを実行します。最初のコマンドはtmateリバースシェルを作成します。これにより攻撃者がその後のオペレーションを行えるようになります。TeamTNTがこれまで使用してきた手法とは異なり、このマルウェアキャンペーンでは新しいコンテナイメージがプルされたり実行されたりはしていませんでした。

権限昇格

Unit 42のリサーチャーは特権昇格の試みは観測していませんが、このマルウェアは2つの敵対的ツールをドロップしていました。ドロップされていたのはPeiratesBOtBで、これらにより既知の脆弱性を介してコンテナブレイクアウトをしたり、公開されたクラウド資格情報を介してクラウドリソースにアクセスしたりすることができるようになります。

コンテナブレイクアウト

BOtBは、CVE-2019-5736などの既知の脆弱性を使ってコンテナブレイクアウトができるようにするツールです。また、CAPSとSYSCALLSを有効にしている特権コンテナからエスケープすることもできます。

クラウドリソースへのアクセス

Peiratesは複数のインフラストラクチャとクラウドの資格情報を収集できます。このツールはクラウドメタデータサービスからIAM(IDとアクセス管理)資格情報を検索し、Kubernetesクラスタからサービスアカウントトークンを検索します。識別された資格情報を使用し、さらに横展開するか、クラスタの制御を奪取しようとします。私たちは、Peiratesが使用されたことは確認しましたが、それが実行されていたコンテナには資格情報がありませんでした。

防衛回避

ライブラリインジェクション

HildegardはLD_PRELOADを使ってコンテナ内で起動された悪意のあるプロセスを隠蔽します。このマルウェアは/etc/ld.so.preloadファイルを改ざんし、共有ライブラリのインポートされた関数をインターセプトします。具体的にいうとreaddir()とreaddir64()という2つの関数を上書きしています。これらの関数にはファイルシステムのディレクトリエントリを返す役割がありますが、上書きされた関数は/proc以下のディレクトリエントリに対して行われたクエリを除外し、tmate、xmrig、ziggyなどのキーワードを含むクエリをドロップします。これにより、アプリケーションがコンテナ内で実行中のプロセスを(/procの下のファイルを読み取ることによって)識別しようとしてもtmate、xmrig、ziggyは見つからなくなります。この結果、pstopなどのLinuxツールや多くのコンテナ監視ツールからはこれら悪意のあるプロセスが見えなくなります。

このスクリーンショットは、HildegardがX86_64.soのreaddir64()を上書きするために使用する関数を示しています。
図3 X86_64.soのreaddir64()を上書きする関数

暗号化されたELFバイナリ

Hildegardは、オープンソースプロジェクトziggystartuxからビルドしたIRCエージェントを展開します。自動静的分析ツールによる検出を回避するため、ziggystartuxのELFは暗号化され、べつのバイナリ(ziggy)にパックされます。バイナリが実行されるとziggystartux ELFはハードコードされたAdvancedEncryption Standard(AES)キーで復号されてメモリ内で実行されます。

Hildegardは、オープンソースプロジェクトziggystartuxからビルドしたIRCエージェントを展開します。自動静的分析ツールによる検出を回避するため、ziggystartuxのELFは暗号化され、べつのバイナリ(ziggy)にパックされます。
図4 ペイロードの解凍と実行

偽装されたプロセス名

このマルウェアはIRCプロセスに「bioset」という名前をつけていますが、これはよく知られているLinuxカーネルプロセス名biosetを指します。ホスト上で実行されているプロセス名だけを見ていると偽装されたこのプロセスを見落とす可能性があります。

DNS監視のバイパス
このマルウェアはシステムのDNSリゾルバを変更してGoogleが公開しているDNSサーバーを使うことでDNS監視ツールからの検出を回避します。

Hildegardは、システムDNSリゾルバを変更し、GoogleのパブリックDNSサーバーを使用して、DNS監視ツールによって検出されないようにします。
図5 DNSリゾルバの変更

ファイルの削除とシェルのヒストリのクリア

すべてのスクリプトは実行後すぐに削除されます。またTeamTNTは「history -c」コマンドですべてのスクリプトのシェルログをクリアしています。

TeamTNTは「history -c」コマンドですべてのスクリプトのシェルログをクリアしています。
図6 スクリプトはヒストリをクリアして自身を削除する

資格情報へのアクセス

Hildegardはホスト上で資格情報ファイルを探し、クラウド固有の資格情報がないかメタデータのクエリをかけます。識別された資格情報はC2に返送されます。

検索されていた資格情報には次のものが含まれていました。

  • クラウドアクセスキー
  • クラウドアクセストークン
  • SSHキー
  • Dockerの資格情報
  • Kubernetesのサービストークン

検索対象となったメタデータサーバーは次の通りです。

  • 169.254.169.254
  • 169.254.170.2
Hildegardはホスト上で資格情報ファイルを探し、クラウド固有の資格情報を探してメタデータのクエリをかけます。
図7 スクリプトが資格報を探す

探索

Hildegardは環境内の探索のため、複数の偵察オペレーションを実行します。

  • ホストのOS、CPU、メモリ情報の収集・返送
  • masscanを使いKubernetes内部ネットワークでkubeletsを検索
  • kubeletのAPIを使い特定ノード内で実行中のコンテナを検索
ここに示すようにHildegardは環境の探索のため、複数の偵察オペレーションを実行します。
図8 スクリプトがシステムとネットワークの情報を探す

横展開

Hildegardは、セキュアでないkubeletを主に使用してKubernetesクラスタ内を横展開します。探索段階のマルウェアはエクスプロイト可能なkubeletとそれらkubeletが管理しているコンテナを検出します。次にマルウェアはC2チャネル(tmateまたはIRC)を作成してこれらコンテナに悪意のあるクリプトマイナーを展開します。Unit 42のリサーチャーによる観測はされていませんが、攻撃者は窃取した資格情報で横展開を行う可能性もあります。

コマンド&コントロール

コンテナへの最初の足がかりを得ると、HildegardはC2に戻るためtmateセッションないしIRCチャネルのいずれかを確立します。どちらも同じ目的を果たすのでTeamTNTがこれら2つのC2チャネルをどのように使い分けてタスクを実行しているかは不明です。本稿執筆時点ではtmateセッションが攻撃者が侵害コンテナと対話する唯一の方法で、Unit 42のリサーチャーはIRCチャネル経由のコマンドは観測していません。しかしながらIRCサーバーのメタデータが示すのは、当該サーバーが展開されたのが2021年の1月9日であること、現在このサーバーには接続されている約220のクライアントがあることです。

コンテナへの最初の足がかりを得ると、マルウェアはtmateセッションを確立する可能性があります。
図9 マルウェアが作成したtmateの名前付きセッション
コンテナへの最初の足がかりを得ると、マルウェアはC2に戻るIRCチャネルを確立する可能性があります。IRCサーバーはziggyバイナリ内にハードコードされています。
図10 IRCサーバーはziggyバイナリ内にハードコードされている
スクリーンショットは、IRCクライアントでキャプチャされたIRCトラフィックを示しています。IRCサーバーのメタデータが示すのは、当該サーバーが展開されたのが2021年の1月9日であること、現在このサーバーには接続されている約220のクライアントがあることです。
図11 IRCクライアントでキャプチャされたIRCトラフィック

影響

このマルウェアから受ける最も重大な影響はリソース乗っ取りとサービス拒否(DoS)です。クリプトジャックオペレーションがシステム全体のリソースをすぐに使い果たし、クラスタ内のすべてのアプリケーションの正常動作を妨げる可能性があります。xmrigマイニングプロセスはsupportxmrマイニングプールに428uyvSqdpVZL7HHgpj2T5SpasCcoHZNTTzE3Lz2H5ZkiMzqayy19sYDcBGDCjoWbTfLBnc3tc9rG4Y8gXQ8fJiP5tqeBdaというウォレットアドレスを使って参加します。本稿執筆時点で、同マルウェアキャンペーンのハッシュパワーは約25.05 KH/sで、ウォレットの残高は11 XMR(米ドル換算で最大1,500ドル、日本円換算でおよそ16万円)です。

本稿執筆時点で、Hildegardマルウェアキャンペーンのハッシュパワーは約25.05 KH/sで、ウォレットの残高は11 XMR(米ドル換算で最大1,500ドル、日本円換算でおよそ16万円)です。
図12 supportxmr上のマイニングアクティビティ

結論

シングルホストで実行されているDockerエンジンとは異なり、Kubernetesクラスタには通常複数のホストが含まれ、すべてのホストが複数のコンテナを実行可能です。Kubernetesインフラストラクチャには豊富なリソースがあることを考えると、ハイジャックされたKubernetesクラスタはハイジャックされたDockerホストを収益面で上回る可能性があります。今回の新しいTeamTNTマルウェアキャンペーンは、Kubernetesを標的とする最も複雑な攻撃の1つですし、TeamTNT関連でこれまでに確認された中では最も高機能なマルウェアでもあります。とくにこの脅威アクターは初期アクセス、実行、防御回避、C2のにおいて、高度な戦術を開発していました。これらの取り組みにより本マルウェアは高いステルス性・永続性をもつものになっています。本マルウェアはまだ開発途中で、キャンペーンはさほど広まっていませんが、このグループは近くツールを成熟させ、大規模な攻勢をしかけるものと思われます。

パロアルトネットワークス製品をご利用のお客様は Prisma Cloud のランタイム保護、Cryptominer Detection、Prisma Cloud Compute Kubernetes Compliance Protectionによってこの脅威から保護されています。これは、不十分なKubernetes構成について警告し、安全な代替手段を提供します。

Prisma Cloudを実行されておられるお客様は、Prisma Cloud Compute Kubernetes Compliance Protectionによってこの脅威から保護されています。これは、不十分なKubernetes構成を警告し、安全な代替手段を提供します。
図13 Prisma Cloud Compute Kubernetesのコンプライアンス保護
Prisma Cloudは、Cryptominer Detection機能によりHildegardからの保護を提供します。このスクリーンショットは、クリプトマイニングインシデントについて警告するソフトウェアの例を示しています。
図14 Prisma Cloud Computeが暗号通貨(仮想通貨)のマイニングインシデントについて警告しているところ

IoC

ドメイン/IP:

ドメイン/IP 説明
The.borg[.]wtf

(45.9.150[.]36)

このマシンがキャンペーンに使用する悪意のあるファイルをホスティングして収集したデータをC2として受信している。ホストされているファイルは TDGG、api.key、tmate、tt.sh、sGAU.sh、t.sh、x86_64.so、xmr.sh、xmrig、xmrig.so、ziggy、xmr3.assi
147.75.47[.]199 マルウェアはこのIPに接続して侵害したホストのパブリックIPを取得する
teamtnt[.]red
(45.9.148[.]108)
このホストは悪意のあるスクリプトとバイナリをホストしている。ホストされているファイルはpei.sh、pei64
Borg[.]wtf
(45.9.148[.]108)
このホストは悪意のあるスクリプトとバイナリをホストしている。ホストされているファイルはaws2.sh
irc.borg[.]wtf
(123.245.9[.]147)
このホストはC2の1つでポート6667でIRCサーバーを実行している
sampwn.anondns[.]net

(13.245.9[.]147)

このホストはC2の1つでポート6667でIRCサーバーを実行している
164.68.106[.]96 このホストはC2の1つでポート6667でIRCサーバーを実行している
62.234.121[.]105 このホストはC2の1つでポート6667でIRCサーバーを実行している

ファイル:

SHA256値 ファイル名 タイプ 説明
2c1528253656ac09c7473911b24b243f083e60b98a19ba1bbb050979a1f38a0f TDGG スクリプト このスクリプトがtt.shをダウンロードして実行する
2cde98579162ab165623241719b2ab33ac40f0b5d0a8ba7e7067c7aebc530172 tt.sh スクリプト このスクリプトがtmateをダウンロードして実行する。侵害したホストからシステム情報を収集し、収集したデータをC2(45.9.150[.]36)に送信する
b34df4b273b3bedaab531be46a0780d97b87588e93c1818158a47f7add8c7204 api.key テキスト このAPIキーを使って侵害したコンテナから名前付きtmateセッションを作成する
d2fff992e40ce18ff81b9a92fa1cb93a56fb5a82c1cc428204552d8dfa1bc04f tmate ELF tmate v2.4.0
74e3ccaea4df277e1a9c458a671db74aa47630928a7825f75994756512b09d64 sGAU.sh スクリプト このスクリプトがmasscanをダウンロードして実行する。このスクリプトはポート10250で実行されているKubernetesの内部IP Kubeletsをスキャンする。masscanが悪用可能なKubeletを見つけると、すべてのコンテナでクリプトジャックスクリプトをダウンロードして実行しようとする
8e33496ea00218c07145396c6bcf3e25f4e38a1061f807d2d3653497a291348c kshell スクリプト このスクリプトはKubelet API経由でコンテナ内でリモートコード実行を実行する。このほか、標的コンテナにxmr.shをダウンロードして実行する
518a19aa2c3c9f895efa0d130e6355af5b5d7edf28e2a2d9b944aa358c23d887 install_monerod.bash スクリプト このスクリプトはこのGithubリポジトリにホストされている。これが公式moneroプロジェクトをプルしてビルドする。その後「monerodaemon」という名前のユーザーを作成してmoneroサービスを開始する
5923f20010cb7c1d59aab36ba41c84cd20c25c6e64aace65dc8243ea827b537b setup_moneroocean_miner.sh スクリプト このスクリプトはこのGithubリポジトリにホストされている。これがxmrigのアドバンスバージョン MoneroOceanをプルして実行する
a22c2a6c2fdc5f5b962d2534aaae10d4de0379c9872f07aa10c77210ca652fa9 xmrig (oneroocean) ELF xmrig 6.7.2-mo3. このスクリプトはMoneroOcean/xmrig Githubリポジトリにホストされている
ee6dbbf85a3bb301a2e448c7fddaa4c1c6f234a8c75597ee766c66f52540d015 pei.sh スクリプト このスクリプトがホストのアーキテクチャに応じてpei64またはpei32をダウンロードして実行する
937842811b9e2eb87c4c19354a1a790315f2669eea58b63264f751de4da5438d pei64 ELF peiratesプロジェクトからのKubernetesペネトレーションツール。このツールで特権を昇格させ、Kubernetesクラスタ内をピボット探索することが可能
72cff62d801c5bcb185aa299eb26f417aad843e617cf9c39c69f9dde6eb82742 pei32 ELF pei64と同じでi686アーキテクチャ用
12c5c5d556394aa107a433144c185a686aba3bb44389b7241d84bea766e2aea3 xmr3.assi スクリプト このスクリプトがaws2.sh、t.sh、xmrigをダウンロードして実行する
053318adb15cf23075f737daa153b81ab8bd0f2958fa81cd85336ecdf3d7de4e aws2.sh スクリプト このスクリプトがクラウド資格情報を検索し、識別された資格情報をC2(the.borg[.]wtf)に送信する
e6422d97d381f255cd9e9f91f06e5e4921f070b23e4e35edd539a589b1d6aea7 t.sh スクリプト このスクリプトがC2からx86_64.so、tmateをダウンロードしてくる。このスクリプトはld.so.preloadを改ざんしてtmateの名前付きセッションを開始し、その後、侵害したシステムの情報とtmateセッションをC2に送り返す
77456c099facd775238086e8f9420308be432d461e55e49e1b24d96a8ea585e8 x86_64.so ELF この共有オブジェクトが既存/etc/ld.so.preloadファイルを置き換える。LD_PRELOADのテクニックを使い、tmateプロセスを表示させないようにする
78f92857e18107872526feb1ae834edb9b7189df4a2129a4125a3dd8917f9983 xmrig ELF xmrig v6.7.0
3de32f315fd01b7b741cfbb7dfee22c30bf7b9a5a01d7ab6690fcb42759a3e9f xmrig.so ELF この共有オブジェクトが既存/etc/ld.so.preloadを置き換える。LD_PRELOADのテクニックを使い、xmrigプロセスを表示させないようにする
fe0f5fef4d78db808b9dc4e63eeda9f8626f8ea21b9d03cbd884e37cde9018ee xmr.sh スクリプト このスクリプトがxmrigとziggyをダウンロードして実行する
74f122fb0059977167c5ed34a7e217d9dfe8e8199020e3fe19532be108a7d607 ziggy ELF ziggyは暗号化されたELFをパックするバイナリで、このバイナリは実行時にELFを復号してメモリ内で実行する。暗号化されたELFはZiggyStarTuxからビルドされている。ZiggyStarTuxは組み込みデバイス用IRCクライアント