マルウェア
公開状態のDocker Remote APIサーバからマルウェア「perfctl」を送り込む攻撃活動について分析
公開状態のDocker Remote APIサーバを介してマルウェア「perfctl」を配備する攻撃活動について、不正なコンテナの作成からペイロードの実行に至る過程を含めて、詳しく解説します。
- 公開状態のDocker Remote APIサーバを介してマルウェア「perfctl」を配備する攻撃活動が展開されています。
- 攻撃者は、はじめに脆弱なDocker Remote APIサーバを探索します。続いて、そのAPI経由で特殊な設定に基づくDockerコンテナを作成し、Base64でエンコードされたペイロードを実行します。
- ペイロードの実行時には、bashスクリプトの作成、環境変数の設定、PHP形式に扮したバイナリのダウンロード操作に加え、コンテナ・エスケープの手口を行使します。
- 検知回避の手段として、類似プロセスの存在確認や、チェック用ディレクトリの作成、独自の関数によるダウンロード操作を行います。
- 本稿では、当該活動の進行過程や、脆弱なDocker Remote APIサーバを不正利用する手口について、解説します。
最近に入り、未保護の「Docker Remote APIサーバ」を通して不正なコードを送り込む攻撃活動が展開されています。本活動は、Docker Remote APIサーバの探索からペイロードの実行に至るまで、各手順が明確に構造化されています。
本稿では、当該活動の進行過程や、Docker Remote APIサーバを不正利用する手口について、詳しく解説します。また、最近発生したインシデントに基づき、Docker Remote APIサーバを保護する重要性や、本攻撃がもたらす影響について説明します。
過去に発生した類似のインシデントでは、未知の攻撃者が脆弱なDocker Remote APIサーバを利用し、標的環境内に暗号資産マイナーをインストールしました。今回の攻撃者は、Docker Hubに置かれたイメージ「ubuntu:mantic-20240405」をベースにDockerコンテナをセットアップした上で、コマンド「nsenter」によってコンテナ外部に抜け出し(コンテナ・エスケープ)、Base64でエンコードされたペイロードを実行しました。
攻撃の流れ
Docker Remote APIの探索
今回の攻撃キャンペーンは計画的であり、はじめに、Docker Remote APIサーバの探索が行われます。探索には、ping通信が使用されます。
上図において攻撃者は、設定項目「Privileged」として「true」を指定することで、「特権モード」を有効化しています。また設定項目「PidMode」を「host」とすることで、当該のコンテナ内で動くプロセスに対し、ホスト上で動くプロセス(コンテナ外)と同一の「PID(プロセスID)名前空間」を付与しています。結果、コンテナ内プロセスが、ホスト上で直接動いている場合と同様に、ホスト上の全プロセスにアクセスし、やり取りすることが可能となります。
被害端末にUbuntuのイメージが存在しない場合、下図のリクエストによってDocker Hubから当該イメージを取得し、再度、コンテナの作成を試みます。
ペイロードの内容は、2段階に分けられます。第1段階では、ルート権限でコマンド 「nsenter」を実行し、PIDが「1」となるプロセス(init)の名前空間に入り込みます。この際、フラグとして「--mount」、「--uts」、「--ipc」、「--net」、「--pid」を指定することで、それぞれ「マウント名前空間」、「UTS名前空間」、「プロセス間通信名前空間」、「ネットワーク名前空間」、「プロセスID名前空間」に入ることを可能としています。これにより、ホスト上での稼働時に近い権限が得られます。ペイロードの第2段階はシェルコードであり、Base64でエンコードされています。
デコード後のシェルコードは、下記の処理を実行します。
ステップ1:多重起動の防止
本シェルコードは、「nsenter.*bash.*base64」のパターンに一致するプロセスが複数起動していないかをチェックします。これは、自身と同様のプロセスが多重起動しないようにするための制御です。
ステップ2:bashスクリプトの作成
続いて本シェルコードは、ディレクトリ「/tmp」の配下に新規のbashスクリプトを「kubeupd」の名前で作成します。このbashスクリプトは、環境変数「VEI」に下記の値を設定します。
dck_{Docker APIのパブリックIPアドレス}
また、本bashスクリプトには、Base64でエンコードされた別のペイロードが埋め込まれています。
ステップ3:Base64でエンコードされたペイロードの中身
bashスクリプト「kubeupd」に埋め込まれたペイロードの動作を、以降に示します。
- 本ペイロードには、標的環境内に通信コマンド「curl」や「wget」が存在しない場合の代替手段として、関数「__curl」が実装されている。
- 標的環境のアーキテクチャが「x86_64」でない場合、処理を終了する。ディレクトリ「/tmp」の存在確認を行い、存在しない場合は新規に作成する。次に、「/tmp」をマウントし、オプション「exec」によって「実行可能属性」を付与する。さらに、「/tmp」の配下にディレクトリ「.perfc」と「.xdiag」を作成する。
- 環境変数「AAZHDE」が未設定の場合、その値として「localhost」を指定する。
- 先に「dck_{パブリックIPアドレス}」と定義済みの環境変数「VEI」を、ファイル「/tmp/.xdiag/vei」に書き出す。
- 不正なプロセスが稼働中であるかを確認するため、当該プロセスのPIDが格納されるファイル「/tmp/.xdiag/p」の有無や、ディレクトリ「proc」の状態をチェックする。追加の確認手段として、ポート番号「44870」や「63582」を介したアクティブなTCP通信をチェックする。
- 不正なプロセスが稼働中でないと判定した場合、不正なバイナリファイルをダウンロードする。本ファイルには、偽装用の拡張子「PHP」が付与されている。これは、拡張子ベースの検知を回避する手段である。また、標的環境内にダウンロード用のコマンド「curl」や「wget」が用意されていない場合、先述の独自版関数「__curl」を使用する。ダウンロード先のディレクトリは「/tmp」であり、正規を装ったファイル名「httpd」を付与する。現状、当該ファイルの内容を特定するには至っていない。
- ダウンロードしたファイルが存在し、そのサイズが想定通り(9301499)の場合は、追加の活動を行う。具体的にはプロセス「perfctl」の停止、権限の設定、環境変数「PATH」の更新、バックグラウンドでのコマンド起動(KRI=kr httpd)などが挙げられる。
- 最後にマーカーファイル「/tmp/.install.pid33」を削除する。
ステップ4:永続化の手続き
本マルウェアは、標的環境で長期に渡って活動できるように、永続化の手口を行使します。まず、systemdが非オフラインモードで起動している場合、「multi-user.target」を用いてsystemdのサービスを作成します。それ以外の場合、除去されにくいcronジョブを作成します。
- fallback:シェル「/bin/sh」の置き換えにより、永続化用のバックドアを設置する。本バックドアは、権限昇格や任意コマンドの実行をサポートする。また、元のファイル「sh」を「kkbush」や「kbush」の名前で複製し、後のクリーンアップ時に改めて復元する。さらに、追加操作のためにバックグラウンドプロセス(kubeupd)をセットアップし、後述の関数「wait_run」を用いてバックドアを維持、管理する。
- kill_container:「sleep 9955」を引数として含むプロセスを停止する。
- wait_run:ファイル「/tmp/k8s.run42」が作成されるか、一定時間が経過するまでの間、待機する。
- restore_sh:検知回避の手段として、ファイル「/bin/sh」を「/bin/kkbush」の内容で置き換える(T1036.005)。これにより、元の内容が復元される。
- Docker Remote APIサーバへの不正アクセスを防止するため、強力なアクセス制御や認証の仕組みを導入する。
- Docker Remote APIサーバ上で不審な活動が行われていないかどうか、定期的に監視する。不正が疑われる場合は、速やかに調査し、必要な処置を行う。
- コンテナセキュリティのベストプラクティスを実践する。例えば、特権モード(Privileged)の利用を控えることや、コンテナイメージのデプロイ前に安全性や内容を検証することが挙げられる。
- Docker Remote APIサーバの管理担当者向けに、セキュリティ・ベストプラクティスや攻撃手段に関する教育、トレーニングを実施する。
- Dockerや関連ソフトウェアのセキュリティ・アップデートや修正パッチについて、常に最新情報を入手し、既知の脆弱性に対処する。
- Docker Remote APIサーバの管理に関する手順やセキュリティポリシーを定期的に見直し、適宜更新し、最新の推奨事項やセキュリティ・ベストプラクティスに沿えるようにする。
まとめ
Docker Remote APIサーバを突いた攻撃の影響は重大であり、企業や組織、セキュリティ対策チームでは、その危険性を十分に受け止めて対応にあたることが推奨されます。インシデントを回避するためには、攻撃者が用いる戦略や手順を理解することが重要です。今回の場合、Docker Remote APIサーバのセキュリティパッチを適用してセキュアな状態を維持し、さらに、不正なアクセスや不審な挙動を定期的に監視することが、リスクの低減に繋がります。セキュリティ監査を定期的に実施することも、本稿で挙げたような攻撃を阻止し、全体的なセキュリティ体制を強化する上で役立ちます。
MITRE ATT&CK® Techniques
MITRE ATT&CK Tactics and Techniquesはこちらで確認してください。
侵入の痕跡(IoC:Indicators of Compromise)
侵入の痕跡(IoC)はこちらで確認してください。
参考記事:
Attackers Target Exposed Docker Remote API Servers With perfctl Malware
By: Sunil Bharti, Ranga Duraisamy
翻訳:清水 浩平(Core Technology Marketing, Trend Micro™ Research)