This post is also available in: English (英語)
概要
2021年1月、Unit 42のリサーチャーは、Kubernetesクラスタを標的とした新しいマルウェアキャンペーンを検出しました。攻撃者は、誤って匿名アクセスを許可する構成にしてしまっているkubeletを経由して初期アクセスを取得していました。Kubernetesクラスタに足がかりを得ると、マルウェアは可能な限り多くのコンテナに拡散しようとし、最終的にクリプトジャックオペレーションを開始しました。使用された戦術、技術、手順(TTP)に基づき、私たちはこの攻撃者がTeamTNTであるものと考えています。私たちは、この新しいマルウェアをHildegardと呼んでいます。この名前は、マルウェアが使用していたtmateアカウントのユーザー名にちなむものです。
TeamTNTは、以前の調査で文書化されているように、セキュアではないDockerデーモンを悪用し、悪意のあるコンテナイメージをデプロイすることで知られています(詳細はCetus、Black-T、TeamTNT 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構成を警告し、安全な代替手段を提供します。
TTP(戦術、技術、および手順)
図1は、攻撃者がどのように侵入し、横展開し、最終的に複数のコンテナでクリプトジャックを実行したかを示しています。
- 攻撃者は、インターネット上のセキュアでないKubeletを悪用することから始め、Kubernetesノード内で実行されているコンテナを検索しました。攻撃者は、ノードAでコンテナ1を見つけた後、コンテナ1でリモートコード実行(RCE)を実行しようとしました。
- 攻撃者はtmateをダウンロードし、コマンドを発行してtmateを実行し、コンテナ1からtmate.ioへのリバースシェルを確立しました。その後、このtmateセッションで攻撃を続けました。
- 攻撃者はコンテナ1からmasscanを使ってKubernetesの内部ネットワークをスキャンし、ノードBとノードCのセキュアでないKubeletを見つけました。次に、これらのKubeletが管理するコンテナ(コンテナ2〜7)に悪意のあるクリプトマイニングスクリプト(xmr.sh)をデプロイしようとしました。
- xmr.shを実行したコンテナは、xmrigプロセスを開始し、IRC C2に戻るIRCチャネルを確立しました。
- 攻撃者は、コンテナの1つ(コンテナ4)からの別のtmateセッション作成にも成功していました。リバースシェルを使用すすることで、より手動の偵察やオペレーションが実行しやすくなります。
各コンテナで見つかった侵害の痕跡(IOC)は本稿巻末に付記します。これらのファイルはシェルスクリプトまたはExecutable Linkable Format(ELF)のいずれかです。本稿巻末のIOCのセクションに各ファイルのハッシュ値とその詳細についても記載しておきますのでご覧ください。
- コンテナ1: TDGGが Kubelet を介してドロップ・実行された。TDGGはその後、tt.sh、 api.key、tmateをダウンロード・実行。攻撃者は確立されたtmate接続を使用してsGAU.sh、kshell、install_monerod.bash、setup_moneroocean_miner.sh、xmrig(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戦術にマッピングしたものです。次のセクションで各段階で使用される手法について詳しく説明します。
初期アクセス
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つの敵対的ツールをドロップしていました。ドロップされていたのはPeiratesとBOtBで、これらにより既知の脆弱性を介してコンテナブレイクアウトをしたり、公開されたクラウド資格情報を介してクラウドリソースにアクセスしたりすることができるようになります。
コンテナブレイクアウト
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は見つからなくなります。この結果、ps、topなどのLinuxツールや多くのコンテナ監視ツールからはこれら悪意のあるプロセスが見えなくなります。
暗号化されたELFバイナリ
Hildegardは、オープンソースプロジェクトziggystartuxからビルドしたIRCエージェントを展開します。自動静的分析ツールによる検出を回避するため、ziggystartuxのELFは暗号化され、べつのバイナリ(ziggy)にパックされます。バイナリが実行されるとziggystartux ELFはハードコードされたAdvancedEncryption Standard(AES)キーで復号されてメモリ内で実行されます。
偽装されたプロセス名
このマルウェアはIRCプロセスに「bioset」という名前をつけていますが、これはよく知られているLinuxカーネルプロセス名biosetを指します。ホスト上で実行されているプロセス名だけを見ていると偽装されたこのプロセスを見落とす可能性があります。
DNS監視のバイパス
このマルウェアはシステムのDNSリゾルバを変更してGoogleが公開しているDNSサーバーを使うことでDNS監視ツールからの検出を回避します。
ファイルの削除とシェルのヒストリのクリア
すべてのスクリプトは実行後すぐに削除されます。またTeamTNTは「history -c」コマンドですべてのスクリプトのシェルログをクリアしています。
資格情報へのアクセス
Hildegardはホスト上で資格情報ファイルを探し、クラウド固有の資格情報がないかメタデータのクエリをかけます。識別された資格情報はC2に返送されます。
検索されていた資格情報には次のものが含まれていました。
- クラウドアクセスキー
- クラウドアクセストークン
- SSHキー
- Dockerの資格情報
- Kubernetesのサービストークン
検索対象となったメタデータサーバーは次の通りです。
- 169.254.169.254
- 169.254.170.2
探索
Hildegardは環境内の探索のため、複数の偵察オペレーションを実行します。
- ホストのOS、CPU、メモリ情報の収集・返送
- masscanを使いKubernetes内部ネットワークでkubeletsを検索
- kubeletのAPIを使い特定ノード内で実行中のコンテナを検索
横展開
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のクライアントがあることです。
影響
このマルウェアから受ける最も重大な影響はリソース乗っ取りとサービス拒否(DoS)です。クリプトジャックオペレーションがシステム全体のリソースをすぐに使い果たし、クラスタ内のすべてのアプリケーションの正常動作を妨げる可能性があります。xmrigマイニングプロセスはsupportxmrマイニングプールに428uyvSqdpVZL7HHgpj2T5SpasCcoHZNTTzE3Lz2H5ZkiMzqayy19sYDcBGDCjoWbTfLBnc3tc9rG4Y8gXQ8fJiP5tqeBdaというウォレットアドレスを使って参加します。本稿執筆時点で、同マルウェアキャンペーンのハッシュパワーは約25.05 KH/sで、ウォレットの残高は11 XMR(米ドル換算で最大1,500ドル、日本円換算でおよそ16万円)です。
結論
シングルホストで実行されているDockerエンジンとは異なり、Kubernetesクラスタには通常複数のホストが含まれ、すべてのホストが複数のコンテナを実行可能です。Kubernetesインフラストラクチャには豊富なリソースがあることを考えると、ハイジャックされたKubernetesクラスタはハイジャックされたDockerホストを収益面で上回る可能性があります。今回の新しいTeamTNTマルウェアキャンペーンは、Kubernetesを標的とする最も複雑な攻撃の1つですし、TeamTNT関連でこれまでに確認された中では最も高機能なマルウェアでもあります。とくにこの脅威アクターは初期アクセス、実行、防御回避、C2のにおいて、高度な戦術を開発していました。これらの取り組みにより本マルウェアは高いステルス性・永続性をもつものになっています。本マルウェアはまだ開発途中で、キャンペーンはさほど広まっていませんが、このグループは近くツールを成熟させ、大規模な攻勢をしかけるものと思われます。
パロアルトネットワークス製品をご利用のお客様は Prisma Cloud のランタイム保護、Cryptominer Detection、Prisma Cloud Compute Kubernetes Compliance Protectionによってこの脅威から保護されています。これは、不十分なKubernetes構成について警告し、安全な代替手段を提供します。
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クライアント |