PGMiner: PostgreSQLを介して配信される新しい暗号通貨マイニングボットネット

Cryptojacking is conceptually illustrated here. The category includes PGMiner, a new cryptocurrency mining botnet delivered via PostgreSQL.

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

概要

クリプトジャッキング(簡単に言えば悪意のある暗号通貨マイニング)は、マルウェアの作成者がその活動から金銭的利益を得るためによく使用する方法です。マルウェアによる攻撃者は、基本的に標準的なマイニングプロトコルと手法を使用していますが、標的のマシンをよりスマートにハッキングする方法を探求し、見つけ出す傾向があります。最近、パロアルトネットワークスの脅威インテリジェントチームUnit 42が、新手のLinuxベースの暗号通貨マイニングボットネットを発見しました。これは、異議申し立て中のPostgreSQLのリモートコード実行(RCE)の脆弱性を悪用し、データベースサーバーを侵害してクリプトジャッキングします。弊社は、この暗号通貨マイニングボットネットに、その配信チャネルとマイニング動作に因んで「PGMiner」と名付けました。PGMinerは、根本的にはMoneroマイニングのためのマイニングプールへの接続を試みます。このマイニングプールは既にアクティブでないため、このマルウェアファミリの実際の利益に関する情報を復元できませんでした。

PostgreSQLはPostgresとも呼ばれ、本番環境向けに最もよく使用されているオープン ソース リレーショナル データベース管理システム(RDBMS)の1つです。DB-Enginesによれば、PostgreSQLは、2020年11月時点ですべてのデータベース管理システム(DBMS)のうち第4位にランキングされ、2013年以降、その人気は安定的に高まっています。特に、PostgreSQLはDB-Enginesによって2017年と2018年にデータベース オブ ザイヤーに選出されています。

PostgreSQLの悪用されている機能は、2013年9月9日にバージョン9.3で導入された「copy from program(プログラムからコピーする)」機能です。この機能には、2018年にCVE-2019-9193が割り当てられ、「vulnerability(脆弱性あり)」と指摘されました。ただし、PostgreSQLのコミュニティはこの割り当てに異議を申し立て、このCVEには「disputed(異議申し立て中)」のラベルが付きました。

弊社は、PGMinerが、PostgreSQLを介して配信された最初の暗号通貨マイニングボットネットであると確信しています。マルウェアの攻撃者が、確定されたCVEだけでなく、異議申し立て中のCVEも武器化し始めたことは注目に値します。

パロアルトネットワークスの次世代ファイアウォールをご使用のお客様は、WildFireおよび脅威防御セキュリティサブスクリプションによってPGMinerから保護されています。

本ブログの執筆時点では、ベンダーのいずれもVirusTotal上でPGMinerを検出していません。クラウドベースのマルウェア分析プラットフォームであるWildFireは、自己削除およびプロセスのなりすましを観測するダイナミック分析によってそれを検出しました。配信チャネル以外に、PGMinerの暗号通貨マイニングのコードベースは、SystemdMinerファミリおよびその亜種12 3が持つ特徴のいくつかを再構築しますが、以下の顕著な変更があります。

  • ファイルなし実行を達成するためにコードを開始した直後にPostgreSQLテーブルを削除します。
  • システム情報を収集し、それをコマンド アンド コントロール(C2)サーバーに送信し、標的を識別します。
  • 標的のマシンでコマンドを使用できない場合、従来および新手の手法を用いてcurlバイナリをダウンロードします。
  • tracepathプロセスになりすまし、その存在を隠します。
  • 金銭的利益を増やすために競合プログラムの強制終了を試みます。

攻撃プロセスの概要

PGMinerの実行フローの概要を図1に示します。前述のように、悪意のあるペイロードがPostgreSQLを介して配信され、それがSOCKS5プロキシを介してバックエンドC2サーバーと通信します。その後、システムのアーキテクチャに基づいて暗号通貨マイニングペイロードがダウンロードされます。

この図は、異議申し立て中のPGMinerがPostgreSQLのRCEの脆弱性を悪用するプロセスを示しています。最初の侵害の後、悪意のあるペイロードがPostgreSQLを介して配信され、それがSOCKS5プロキシを介してバックエンドC2サーバーと通信します。その後、システムのアーキテクチャに基づいて暗号通貨マイニングペイロードがダウンロードされます。
図1.異議申し立て中のPostgreSQLのRCEの脆弱性を悪用するPGMinerの構造

弊社の分析で、PGMinerが特定のモジュールを再帰的にダウンロードすることで自身を定期的に複製していることがわかりました。このプロセスをわかりやすくするために、ペイロードの関係を図2に示します。各ボックスは、感染の連鎖で特定されたサンプルにリンクしています。そのレコードには、ファイル名、短縮されたSHA256値、およびファイルタイプ情報が含まれます。ファイル名にアーキテクチャ情報が含まれている場合、弊社は必ず考えられる他のすべてのアーキテクチャを繰り返し、ダウンロードに成功した場合はグラフにそのサンプルを追加します。各ステージの短縮されたC2は濃い緑色で表しています。また、水色のボックス内のサンプルは、前のリサーチワークで広く調査されました(SystemdMinerおよびその亜種12 3)。ここでは、ピンク色のボックス内のサンプルに焦点を当て、それ以外については概要を述べます。

この図は、PGMinerペイロードの関係を示しています。各ボックスは、感染の連鎖で特定されたサンプルにリンクしています。そのレコードには、ファイル名、短縮されたSHA256値、およびファイルタイプ情報が含まれます。ファイル名にアーキテクチャ情報が含まれている場合、弊社は必ず考えられる他のすべてのアーキテクチャを繰り返し、ダウンロードに成功した場合はグラフにそのサンプルを追加します。各ステージの短縮されたC2は濃い緑色で表しています。また、水色のボックス内のサンプルは、前のリサーチワークで広く調査されました(SystemdMinerおよびその亜種1、2、3)。ここでは、ピンク色のボックス内のサンプルに焦点を当て、それ以外については概要を述べます。
図2.PGMinerペイロードの関係

PostgreSQLのエクスプロイトを介した最初の侵害

弊社が調査を開始するきっかけになった根本のサンプルは、55698654f0fbcf5a6d52f3f44bc0f2257e06835e76fb7142d449a2d1641d7e4bです。これは静的にリンクされ除去されたAARCH64 ELFファイルです。本ブログの執筆時点では、図3に示すように、VirusTotal上でベンダーのいずれもこのマルウェアを検出できていません。

これは、このブログの執筆時点で、VirusTotal上でベンダーのいずれもPGMinerを検出していない状況を示しています。
図3.VirusTotal上でベンダーのいずれもPGMinerを検出していない

前述のサンプルは、エクスプロイトツールとして機能し、サーバーのオペレーティングシステム(OS)上でRCEを許可するPostgreSQLの(論争の的になっている)機能を悪用しようと試みます。図4に示すように、そのバイナリをリバースエンジニアリングすることで、そのサンプルがlibpq postgresqlクライアントライブラリを静的にリンクしていることがわかりました。これは、ターゲット データベース サーバーとの通信に使用されています。攻撃者は、プライベート/ローカルネットワーク(172.16.0.0、192.168.0.0および10.0.0.0サブネット)内のホストのPostgreSQLqlにより使用されているポート5432 (0x1538)をスキャンします。このマルウェアは、PostgreSQLサーバー上でのRCEの実行を試みて、パブリックネットワーク範囲をランダムに選択します(例: 190.0.0.0、66.0.0.0)。攻撃者は、データベースの既定のユーザーである「postgres」を使用して、1122331q2w3e4rなどのよく使用されるパスワードの組み込みリストを用いて反復するブルート フォース攻撃を実行し、データベースの認証を破ります。

こちらに示すように、そのバイナリをリバースエンジニアリングすることで、そのサンプルがlibpq postgresqlクライアントライブラリを静的にリンクしていることがわかりました。
図4.PGMinerでのPostgreSQLのエクスプロイト コード フロー

マルウェアは、データベースへの侵入に成功すると、PostgreSQLの「copy from program(プログラムからコピーする)」機能を使用して、暗号通貨マイニングスクリプトをダウンロードして起動します。「copy from program(プログラムからコピーする)」機能は、PostgreSQL 9.3での導入以降、論争の的になっていました。この機能は、ローカルまたはリモートのスーパーユーザーに、サーバー上でのシェルスクリプトの直接実行を許可し、さまざまなセキュリティ上の懸念を招いています。この機能には、2019年にCVE-2019-9193が割り当てられ、「vulnerability(脆弱性あり)」と指摘されました。ただし、PostgreSQLのコミュニティはこの割り当てに異議を申し立て、このCVEには「disputed(異議申し立て中)」のラベルが付きました。この機能を「vulnerability(脆弱性あり)」と定義することへの主な反論は、スーパーユーザー権限がリモートまたは信頼されていないユーザーに付与されず、かつアクセス制御と認証システムが適切に機能している限り、この機能自体がリスクを招くことはないというものです。一方、セキュリティの研究者たちは、攻撃者がパスワードのブルートフォース攻撃またはSQLインジェクション攻撃によってスーパーユーザー権限を取得できた場合、この機能によって、実際にPostgreSQLが、リモートエクスプロイトやPostgreSQLソフトウェアを超えてサーバーのOS上での直接コード実行のための踏み台となることに懸念を示しています。

これは、PGMinerからの実際のエクスプロイトコンテンツを示しています。これは、次のようなステップに分解できます。「abroxu」テーブルが存在する場合はそれをクリアします。テキスト列を持つ「abroxu」テーブルを作成します。悪意のあるペイロードを「abroxu」テーブルに保存します。PostgreSQLサーバー上でそのペイロードを実行します。作成したテーブルをクリアします。
図5 PostgreSQLへのPGMinerのエクスプロイトコンテンツ

このCVEはまだ異議申し立て中ですが、マルウェアの攻撃者は、攻撃ペイロードをファイルなしにすることで検出レーダーによる捕捉を回避するためにこれを使用し始めています。PGMinerからの実際のエクスプロイトコンテンツを図5に示します。これは次のようなステップに分解できます。

ステップ SQLコマンド
「abroxu」テーブルが存在する場合はそれをクリアする。 DROP TABLE IF EXISTS abroxu;
テキスト列を持つ「abroxu」テーブルを作成する。 CREATE TABLE abroxu(cmd_output text);
悪意のあるペイロードを「abroxu」テーブルに保存する。 COPY abroxu FROM PROGRAM “shell command”;
PostgreSQLサーバー上でペイロードを実行する。 SELECT * FROM cmd_exec;
作成したテーブルをクリアする。 DROP TABLE IF EXISTS abroxu;

「abroxu」テーブルに保存された悪意のあるスクリプトペイロードは、既知のSystemdMinerマルウェアファミリおよびその亜種が持つ特徴のいくつかを再構築しています。ここでは、PGMinerがSystemdMinerから進化している主な方法と、見過ごされている機能についてのみ取り上げます。また、わかりやすくするために以下の図に示すスクリプトに注釈を追加しました。

curlのダウンロード

curlコマンドを標的のマシン上で使用できない場合、悪意のあるスクリプトは、curlバイナリをダウンロードしてそれを実行パスに追加するために以下のような複数の手法(図6を参照)を試みます。

  • apt-getyumなど公式のパッケージ管理ユーティリティから直接インストール。
  • GitHubから静的curlバイナリをダウンロード。
  • 通常の方法が機能しない場合は/dev/tcpを使用してダウンロード。
標的のマシンでcurlコマンドを使用できない場合、悪意のあるスクリプトは、curlバイナリをダウンロードしてそれを実行パスに追加するために複数の手法を試みます。その手法には、apt-getやyumなどの公式のパッケージ管理ユーティリティから直接インストールする方法、GitHubから静的curlバイナリをダウンロードする方法、通常の方法が機能しない場合に/dev/tcpを使用してダウンロードする方法があります。
図6.PGMinerによる、curlバイナリをダウンロードするための複数の試み

最初の2つの手法はよく知られており、3番目の手法は極めて独特です。さらに興味深いのは、ターゲットIPアドレスが94[.]237[.]85[.]89であることです。これは、ドメインnewt[.]keetup[.]comに接続しています。その親ドメインkeepup[.]comは正当なビジネスWebサイトに思われますが、この特定のサブドメインはポート80を443にリダイレクトしています。これは、newtという名前のcouchdbをホストするために使用されています。ポート8080はパブリック向けに開いていませんが、図7に示すように、Cross-Origin Resource Sharing (CORS)を許可するように設定されていたと弊社は考えています。

ポート8080はパブリック向けに開いていませんが、Cross-Origin Resource Sharing (CORS)を許可するように設定されていたと弊社は考えています。
図7. newt[.]keetup[.]comはcurlバイナリをダウンロードするためのcouchdbをホストしている

SOCKS5/TORリレーサーバー名の解決

C2ホスト名は、nssnkct6udyyx6zlv4l6jhqr5jdf643shyerk246fs27ksrdehl2z3qd[.]onionに更新されました。また、PGMinerは、このSystemdMinerの亜種で説明しているように、SOCKS5プロキシ手法を活用してC2と通信します。ただし、図8に示すように、DNSサーバー リストは拡張されました。

ここに示すPGMinerのコードは、どのようにC2ホスト名が更新され、DNSサーバーリストが拡張されたのかを示しています。
図8.PGMinerで観測された、更新されたC2と拡張されたDNSサーバーリスト

C2からのペイロードの取得とPGMinerの起動

PGMinerは、SOCKS5プロキシサーバーIPアドレスを解決した後、フォルダのリストからフォルダを順に試して、新しいファイルの作成を許可する最初のフォルダを見つけその属性を更新します。これにより、ダウンロードされた悪意のあるペイロードを、標的のマシン上で実行できるようになります。この機能は、前のSystemdMinerの亜種に関するリサーチで観測されましたが、このリサーチの著者はその目的の説明を提供しませんでした。

このマルウェアファミリは、クライアント追跡機能で進化しています。これは、IPアドレス、ユーザー名、アーキテクチャ、ホスト名、すべてのinet IP範囲のmd5、およびcrontabコンテンツのbase64エンコーディングを連結し、クライアントの一意の識別子を形成し、それをC2サーバーに送信します。このコードスニペットを図9に示します。

ここで取り上げるコードスニペットは、マルウェアファミリが、クライアント追跡機能でどのように進化しているかを示しています。これは、IPアドレス、ユーザー名、アーキテクチャ、ホスト名、すべてのinet IP範囲のmd5、およびcrontabコンテンツのbase64エンコーディングを連結し、クライアントの一意の識別子を形成し、それをC2サーバーに送信します。
図9.PGMinerがC2からペイロードを取得して実行する

マルチアーキテクチャペイロード

前述のC2サーバーに提供されるさまざまなアーキテクチャによって、弊社は以下のペイロードのリストを復元できました。その他のアーキテクチャのダウンロードは失敗しました。

  • a935d364622ebefbee659caaa9d0af5828952ab9501591c935cf1f919e2a38ff pg.aarch64: Shell Script
  • a935d364622ebefbee659caaa9d0af5828952ab9501591c935cf1f919e2a38ff pg.armv7l: Shell Script
  • 6d296648fdbc693e604f6375eaf7e28b87a73b8405dc8cd3147663b5e8b96ff0 pg.x86_64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, no section header

興味深いことに、x86_64のペイロードはELF実行可能ファイルであり、aarch64およびarmv7lの場合、ペイロードは同じシェルスクリプトです。

x86_64 ELFペイロード

x86_64 ELFペイロードは、前のSystemdMinerの亜種の動作の大部分を共有しており、さらに追加の機能で進化しています。

  • 環境の準備:
    • 前述のようにcurlバイナリをダウンロードし、インストールします。
    • crontabをインストールします。
    • Aegisなどのクラウドセキュリティ監視ツールと、YunjingなどのQcloud監視ユーティリティを削除します。
  • 仮想マシンのチェック: PGMinerは、VBoxGuestAdditionsの存在をチェックし、仮想環境でそれが分析されているかどうかを推測します。
  • 競合の削除:
    • 他の既知のマイナースクリプト、プロセス、crontabレコードを削除します。
    • マイナー クリーンアップ プロセスを強制終了します。
    • ddgなどCPUに負荷のかかる他のすべてのプロセス、システムの更新などを強制終了します。
    • 既知のマイニングIPアドレスに接続しているプロセスを強制終了します。

armv7l/aarch64シェル スクリプト ペイロード

弊社は、x86_64 ELFペイロードで、PGMinerの暗号通貨マイニングモジュールであるC2 jk5zra7b3yq32timb27n4qj5udk4w2l5kqn5ulhnugdscelttfhtoyd[.]onionからCPUファイルを復元できました。ただし、その他のcmdおよびボットモジュールはC2から使用できません。ここで、armv7l/aarch64シェルスクリプトは、異なるC2であるreambusweduybcp[.]onionに接続しています。また、cmdファイルのダウンロードも試みます。今回、それは成功します。これは、このマルウェアファミリのC2サーバーが定期的に更新されていることを示しています。さまざまなモジュールが、さまざまなC2にわたって分散されています。

cmdモジュールは、最初にtracepathプロセスの強制終了を試みます。その後、同じC2アドレスから追加のペイロードをダウンロードします。ダウンロードされたマルウェアはtracepathプロセスになりすまし、その存在を隠します。弊社は、aarch64ペイロードを分析した後、PostgreSQLサーバー上で実行するために最初に使用された同じシェルスクリプトを復元し、これによって分析は完了しました。

軽減策と推奨事項

パロアルトネットワークスの次世代ファイアウォールをご使用のお客様は、WildFireおよび脅威防御セキュリティサブスクリプションによってPGMinerから保護されています。同時に、PostgreSQLのユーザーに、信頼されていないユーザーからpg_execute_server_program権限を削除し、エクスプロイトを不可能にすることをお勧めします。さらに、ユーザーに、信頼できるソースからソフトウェアをダウンロードし、強力で安全なパスワードを管理し、パッチを適時適用することも引き続きお勧めします。

PostgreSQLサーバーに対するPGMinerの影響を取り除くために、ユーザーは、このマルウェアがなりすましているtracepathプロセスを見つけてそれを強制終了し、/tmp/.X11-unix/でそのマルウェアによって追跡されていたプロセスIDを持つプロセスを強制終了できます。

結論

このリサーチでは、異議申し立て中のPostgreSQLのRCEの脆弱性を介して配信される新しい暗号通貨マイニングボットネットであるPGMinerについて説明しました。PGMinerは、異議申し立て中の脆弱性を悪用しているため、最近になって弊社がパロアルトネットワークスで発見するまでPGMinerは気づかれないままでした。

PostgreSQLはPDMSで広く採用されているため、PGMinerは破壊的な力を発揮する可能性があります。このマルウェアは、さらに改良が加えられて、すべてのメジャーなオペレーティングシステムを標的とする可能性があります。たとえば、PostgreSQLはmacOS、Windows、Linuxなどすべてのメジャーなプラットフォームに対して使用できます。理論上、マルウェアの攻撃者は、Windowsなど新しいプラットフォームを標的とすることで別のバージョンのPGMinerを実装し、PostgreSQLを利用してそれを配信できます。

弊社の分析中に、リクエストへの標的の識別情報の埋め込み、信頼できるプロセス名へのなりすまし、複数の手法によるcurlバイナリのダウンロード、すべての競合プログラムの強制終了など新しい手法を観測しました。また、マルウェアがどのように標的を追跡し、実行し、自身を隠蔽し、利益を挙げようとしているのかについても分析しました。マルウェアが再帰的に自身をダウンロードしていることや、C2アドレスを頻繁に変更していることなどの他の特徴も、PGMinerが依然として急速に進化していることを示しています。

クリプトジャッキングに関する追加情報

セキュリティ侵害インジケーター (IOC)

ファイル名、SHA256、ファイルタイプからなるサンプルおよびペイロードの識別情報

  • root.bin, 55698654f0fbcf5a6d52f3f44bc0f2257e06835e76fb7142d449a2d1641d7e4b, ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped
  • pg.x86_64, 6d296648fdbc693e604f6375eaf7e28b87a73b8405dc8cd3147663b5e8b96ff0, ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, no section header
  • int.x86_64, 6984a04d7e435499ff267cfaf913d51e8644f6c08db8069c56f9247f1e18ba71, ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, no section header
  • cpu, fef1a83ba6aba160116a8251462dd842f68464a5f767b2e3194820d62fef23b1, ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, no section header
  • pg.aarch64 / pg.armv7l, a935d364622ebefbee659caaa9d0af5828952ab9501591c935cf1f919e2a38ff, Shell Script
  • cmd, 864ece624b7069b929385f9cf741355a371e844aa3726d340f91549562e2c604, Shell Script
  • dream.aarch64, d8c46be19ff3ea5b2c12f050f226a199aaa5f76cc1731c868e29eea6c68b6801, ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, no section header
  • dream.armv7l, 8d44fbbefa0c59a65e21b0d1598ff7c51487ea1cede544d1c3f56d5db0ea7807, ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, no section header
  • dream.mips, 41ef5c6b0cdd068f117902e59233991082a4ecb4877a1fb16016e756412f06ea, ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, no section header

55698654f0fbcf5a6d52f3f44bc0f2257e06835e76fb7142d449a2d1641d7e4b:に関連するその他のサンプル

  • 1b1d6d5f01b26e4ccf6fff8f2626f9318084dc1123ac67ed7d02f955b72a1432
  • 0fc1332d2b20ea43d3c3fea50a48bb1991522bc6c79d518ba9b68a763ef2ad58
  • 8a13c3fe815f15a5600fda30d132dfbd4bb54d9c766da164060dd1d66b12e9e4
  • 6d95b593f0b5e3cc1985635ad2b943acb083833fea8123e7ac3f88f68e04edd6
  • 101ccbad7732fb185d51b91d31a67ff058cac3bc31ec36cec05094065a97d6fd
  • d4cf8cfb4dc9cc3101b8c850369a71af70f11e67df7e41e9af98624ebe54ff4a
  • 47d56fcbf5d90b9c513d8d38a2c00e4bad6ea4e1d17b05dd37feb4d63b2856e1
  • e3c5abe56964ddb3b4f0b3c434a9af145efca558307c65d30e8acc5aed45bedc
  • 524cce2cf615809bc08ca80facf95f2be7c5071c4cb3eac38c20a1f0ed39ce1f

C2:

  • nssnkct6udyyx6zlv4l6jhqr5jdf643shyerk246fs27ksrdehl2z3qd[.]onion
  • ojk5zra7b3yq32timb27n4qj5udk4w2l5kqn5ulhnugdscelttfhtoyd[.]onion
  • dreambusweduybcp[.]onion