サイバー脅威
Quasar Linux (QLNX) – サプライチェーンに潜む静かな足場:ルートキット、PAMバックドア、認証情報収集機能を備えた多機能Linux RATの内部
TrendAI™ Researchでは、低検出率でこれまで報告例がないLinux向けRAT「Quasar Linux(QLNX)」を分析調査しました。本記事では、QLNXに実装されたルートキット、PAM認証悪用バックドア、認証情報窃取機能などの調査結果をもとに、この脅威がどのようにステルス性の高い不正アクセスや永続化を確立し、ソフトウェアサプライチェーン攻撃へとつながり得るかを解説します。
目次
- 概要
- はじめに
- RAT「QLNX」の脅威動向に関する全体像
- RAT「QLNX」の攻撃対象領域や影響範囲
- RAT「Quasar Linux(QLNX)」に関する識別情報
- 本調査結果の要約
- QLNXの内部アーキテクチャ
- プロセス名の偽装
- ネットワーク通信
- 不正活動の永続化
- PAM認証処理を悪用するバックドア
- ルートキットの分析
- 不正遠隔操作ツール「QLNX」による認証情報の窃取
- 注目すべきファイル
- まとめ
- TrendAI Vision One™によるプロアクティブセキュリティ
- TrendAI Vision One™によるネットワークセキュリティ
- TrendAI Vision One™ スレットインテリジェンス
- スレットハンティングクエリ
- 侵入の痕跡
- 参考記事
- 不正遠隔操作ツール(RAT)「Quasar Linux(QLNX)」は、リモートアクセス機能に加え、高度なセキュリティ検知回避、永続化手法、キー入力操作情報や認証情報の窃取など、様々な機能を持つLinux向けマルウェアインプラントです。QLNXには、PAM(特権アクセス管理)認証処理を悪用したバックドア機能やLD_PRELOAD環境変数を用いたルートキット機能のC言語ソースコードがバイナリ内の文字列リテラルとして埋め込まれており、感染ホスト上で
gccを用いて共有ライブラリ(ルートキット)やPAN認証悪用モジュール(バックドア)を動的にコンパイルした後、感染システム全体での通信傍受を行うために/etc/ld.so.preloadを介して展開されます。 - 窃取対象となるのは、ソフトウェアサプライチェーンに関わる開発者環境やDevOpsの認証情報などです。QLNXに実装された認証情報窃取機能により、
.npmrc(NPMトークン)、.pypirc(PyPI認証情報)、.git-credentials、.aws/credentials、.kube/config、.docker/config.json、.vault-token、Terraform認証情報、GitHub CLIトークン、環境変数(.env)ファイルなどから機密情報(シークレット)が抽出されます。これらのIT資産が侵害された場合、攻撃者がNPMやPyPIレジストリに悪意あるパッケージを設置したり、クラウド基盤に不正アクセスしたり、CI / CD(継続的インテグレーション / 継続的デリバリー)パイプラインを経由して別のシステムに侵入したりする可能性があります。 - QLNXにはインラインフック機能を持つバックドア機能が埋め込まれており、PAM認証処理中に平文の認証情報を傍受します。さらにハードコードされたマスターパスワード「
O$$f$QtYJK」が組み込まれているほか、窃取した認証情報をXOR方式で暗号化した上で、/var/log/.ICE-unixに格納するよう設計されています。 - 加えて攻撃者は、インプラント同士を耐障害性の高いネットワークへと変容させるピアツーピア(P2P)型メッシュネットワーク機能をQLNXに実装することで、感染システムから完全に駆除されることを著しく困難にしています。
- TrendAI Vision One™は、本記事で取り上げた侵入の痕跡(IoC)を検出し、実行を阻止します。また、TrendAI Vision One™をご利用のお客様は、後述する「スレットハンティングクエリ」、「Threat Insights」、「Threat Intelligence Reports」にアクセスすることで、QLNXに関する豊富なコンテキスト情報や最新情報を入手し、プロアクティブなセキュリティ対策の実現に役立てていただけます。
はじめに
これまでTrendAI™ Researchは、未知のマルウェアファミリの出現を前提に、AIを活用して検出精度を向上させる手法を実証してきました。特にオープンソースのリポジトリ上で共有・再利用された不正コードを含むマルウェアが登場した際に、その有効性が確認されています。実際に以前の公開記事では、AIを駆動した自動脅威ハンティングにより、当時未検出だったバックドア型マルウェア「GhostPenguin」を発見し、その調査結果を報告しました。
本ブログ記事では、同様の手法によって得られた新たな発見事例を紹介します。最近の調査でTrendAI™ Researchは、低検出率の不審なLinuxインプラントを検知し、詳細な分析調査を実施しました。結果、同インプラントに採用されたルートキット機能によって痕跡が隠蔽され、低検出率かつこれまで報告例のないLinux向け不正遠隔操作ツール(RAT)「Quasar Linux(QLNX)」であることを突き止めました。
RAT「QLNX」の脅威動向に関する全体像
オープンソースパッケージのエコシステム(PyPIやnpmなど)を悪用したソフトウェアサプライチェーン攻撃は現在、攻撃者にとって極めて実効性の高い攻撃経路の1つとなっています。攻撃者はフィッシング攻撃で詐取した認証情報や設定不備のあるCI/CDパイプラインから窃取したトークンなどを悪用してメンテナのアカウントを乗っ取った後、正規かつ広く信頼されているパッケージに悪意あるコードを埋め込むことで、そのパッケージ利用者全体に瞬時に影響を及ぼす可能性があります。実際、2026年3月下旬に発生したnpm上のaxiosパッケージ侵害事案でも同様の手口が確認されています(詳細はこちら)。
こうしたオープンソースエコシステムは、企業組織の開発チームや個人の開発者(貢献者)によって支えられている一方で、攻撃者は開発者のワークステーションを頻繁に狙っています。これらの分散したエンドポイントでは、導入されているセキュリティ対策に大きなばらつきがあり、すべてがエンタープライズ水準の防御策(EDR(Endpoint Detection and Response)やXDR(Extended Detection and Response)、高度なネットワーク監視機能など)によって統一的に保護されているわけではありません。こうしたセキュリティ格差が潜在的な監視の死角を生み出し、一部の開発者環境を格好の標的とするだけでなく、侵害後の不正活動(情報探索など)が長期にわたって検知されずに継続されるおそれがあります。
RAT「QLNX」の攻撃対象領域や影響範囲
攻撃者は、こうした脆弱な開発環境を突くためにQLNXを設計したと考えられます。QLNXの用いる認証情報窃取用モジュールは、各種開発ツール、パッケージレジストリ、クラウド環境へのアクセス権を維持するためのファイルやトークンを標的とします(AWSの認証情報や設定ファイル、Kubernetesのサービスアカウントトークンやkubeconfigファイル、Docker Hubの認証情報、Gitの構成ファイルやアクセストークン、NPMの認証トークン、PyPIのAPIキーなどを含む)。
攻撃者がパッケージメンテナ環境にQLNXを展開した場合、メンテナの運用するCI / CDパイプラインへと不正アクセスできるようになります。単一の環境を侵害するだけで攻撃者は、正規パッケージやビルド成果物にトロイの木馬やバックドアを仕込んで配信したり、本番環境が稼働するクラウド環境に侵入したりできる可能性があります。
表1は、QLNXの機能群を8つの運用カテゴリに分類して整理したものです。
本調査結果の要約
Linuxプラットフォーム上で動作するQLNXは、様々な機能を備えています(メモリ上でのファイルレス実行、プロセス名の偽装、感染システムのプロファイリングを通じたコンテナ化環境の検知、eBPFを用いたプロセス、ファイル、ネットワークポートの隠蔽、システムログの消去など)。
さらに広範なデータ窃取機能を有しており、ld.so.preloadを介して注入されたPAM認証悪用モジュールを通じて、システム情報、クリップボードの内容、シェル履歴、SSH鍵、Firefoxブラウザのプロファイル、認証情報などを窃取します。
QLNXは、攻撃者のC&Cサーバと通信し、窃取した情報をTLS上の独自プロトコルやHTTPS、HTTP経由で送信するほか、コマンドを受信します。受信したコマンドに応じて、シェルコマンド実行、ファイル管理、プロセスへのコード注入(/proc/pid/memやptrace経由)、スクリーンショット撮影、キー入力操作情報の記録、SOCKSプロキシやTCPトンネルの確立、P2Pメッシュネットワーク管理、BOF(Beacon Object Files)の実行などが可能になります。
加えて、ユーザスコープやシステムスコープの双方で永続化を確立するための手法を複数備えています(systemdサービスの作成、crontabの再起動エントリの追加、init.dスクリプトのインストール、XDG自動起動型デスクトップファイルの展開、ユーザの.bashrcファイルの改ざん、/etc/ld.so.preloadを介した共有オブジェクトの注入を含む)。これらの選択肢により攻撃者は、標的環境に応じて永続化を調整できるようにしていると考えられます。
QLNXの内部アーキテクチャ
実行されると元バイナリ(QLNX)は、自身のコピーをメモリ上の匿名ファイルに作成し、そのコピーから再実行します。その後、ディスク上の元バイナリを削除し、ディスク上に痕跡を残さないよう設計されています。この処理のためにQLNXはまず、readlink("/proc/self/exe")を走査し、部分文字列にmemfd:または(deleted)が含まれているかを確認することで、すでにメモリから実行されているかどうかを判定します。
この確認処理を行う前に、再実行防止策として機能する環境変数「_MFD_RE」を読み取ります。この環境変数が設定されている場合、対象の値をクリアし、すぐに関数を終了させて無限ループの発生を回避します。
メモリ上での実行条件が満たされていない場合、元バイナリ(QLNX)は/proc/self/exeを読み取りモードで開き、memfd_create(システムコール番号319)を用いてRAM上に匿名のファイル記述子を作成します。その後、元バイナリを8KB単位で読み込み、メモリファイル記述子に書き込みます。元バイナリのコピーが作成されると、fcntlを介してメモリファイル記述子からclose-on-execフラグを解除した後、unlinkを用いて元バイナリをディスク上から削除します。さらに再実行防止策として環境変数「_MFD_RE」を「1」に設定します。
次にQLNXは、execveat(システムコール番号322)を用いてメモリファイル記述子を直接渡すことで、メモリから自身を直接再実行しようと試みます。再実行に失敗した場合(古いカーネルなどでexecveatが非対応など)は、/proc/self/fd/<memfd>パス経由でexecvにフォールバックし、実行処理を継続します。
続いてQLNXは、システムの状態を読み取って利用可能なリソースを探索し、感染ホストのプロファイリングを実施します。結果は、一連のグローバルフラグに格納され、後続セッションでどの機能を有効化させるかを制御する際に用いられます。
QLNXは、各種プロセス監視ツール間で表示の一貫性を確保するため、プロセスメタデータの3つの異なる箇所に対して同一の名前を適用します。
-
argv[0]の上書き — メモリ上の元の引数文字列全体をゼロクリアした上で、選択した名前に置き換えます(これにより、psや/proc/pid/cmdlineに表示される内容が変更されます)。 -
prctl(PR_SET_NAME)— カーネルから参照可能なスレッド名を指定された名前に設定します(これにより、プロセス監視ツール(topやhtopなど)に表示されるスレッド名に反映されます)。 -
/proc/self/comm— カーネルのTASK_COMM_LEN制限に準拠させるため、先頭と末尾の角括弧「[」および「]」を除去し、15バイトに切り詰めた状態の名前がこのファイルに直接書き込みます。
プロセス名の偽装に加えてQLNXは、元の実行コンテキストを隠蔽するため、シェルによって設定された特定の環境変数を削除します。具体的には、unsetenvを用いて「_」やOLDPWD環境変数をクリアします。これらの環境変数は、シェルがプロセスを起動した際に自動的に設定されるもので、「_」には実行されたバイナリのフルパスが、OLDPWDには直前の作業ディレクトリが保存されます。これらの値はプロセス環境ブロックに格納されており、/proc/pid/environにアクセス可能なユーザであれば誰でも読み取ることができるため、残存していた場合、フォレンジック調査における重要な痕跡となり得ます。
攻撃者は、インスタンスの多重起動を防ぐ目的で、QLNXにファイルロックを用いた単一インスタンス制御(ミューテックス)を実装しています。QLNXは、文字列「quasar_linux」のDJB2ハッシュ値(結果:0x752e2ca1)を算出した後、X11ソケットロックに偽装させたロックファイルパス「/tmp/.X752e2ca1-lock」を生成します(攻撃者は、このパスを正規のエックスサーバロックファイル群の中に紛れ込ませるために設定したと考えられます)。ファイルはopen(path, O_CREAT|O_RDWR, 0600)を用いて作成された後、flock(fd, LOCK_EX|LOCK_NB)によって排他的かつノンブロッキングなロックの取得が試行されます。ロックを取得できない場合(別インスタンスがすでに実行中の場合)、プロセスは直ちに終了します。ロックを取得できた場合、ファイル記述子はプロセス存続期間中意図的に開いた状態で保持されるため、プロセス終了までカーネルがロック状態を維持します。
実行時制御機構が確立された後、QLNXは多数のコマンドハンドラをグローバルハンドラテーブルに登録し、コマンドディスパッチ機構を初期化します(図2)。各エントリには、固有の数値で定義されたコマンド識別子と対応する不正活動が紐づけられています。これにより、QLNXがC&Cサーバから受信したコマンドを適切な機能へ動的に振り分けられるよう設計されています。
typedef struct {
__int16 command_id;
char _pad[6];
void *handler;
} command_handler_entry_t;
侵害されたシステム上で足場を構築してインストールを終えた後QLNXは、主要な運用フェーズへと移行し、C&Cサーバとの通信を確立・維持するための永続的なループ処理に入ります(コマンドディスパッチループ)。
QLNX本体(インプラント)は、TLS上で動作するTCPベースの独自プロトコルに加え、HTTPSやHTTPなど、複数の通信経路に対応しています。今回分析した検体は、TCPベースの独自プロトコルを用いるよう設定されていました。C&Cサーバへの接続が確立されると、初期ビーコンパケット(コマンドID 1)を構築して送信します。
このビーコンには、マルウェアのバージョン(1.4.1)、OSバージョン、権限レベル(管理者またはユーザ)、IP情報提供サービス「ip-api.com」から取得した地理的位置情報、一意のマシンフィンガープリント(MACアドレスのSHA256ハッシュまたは/etc/machine-id)、現在ログイン中のユーザ名、ホスト名、アクティブなIPv4インターフェースなどのシリアライズされたバイトバッファが含まれていました(図3、6)。
接続に失敗した場合(またはC&Cサーバが応答しない場合)、QLNXはネットワークビーコンに対する検知回避を目的として、ランダム化された再接続待機処理を実行するよう構成されていました。具体的には、/dev/urandomを用いて3,000~15,000ミリ秒の基本待機時間を算出した後、さらに30%のジッターを適用することで、再接続の間隔を予測困難にしています。
図3のトラフィックは、QLNXが送信した初期ビーコンを復号したものです(詳細は、後述の「ネットワーク通信」セクションをご参照ください)。
C&Cサーバがビーコン受信を確認すると、QLNXはブロッキング型の受信ループに移行します。このネットワークプロトコルでは、4バイトのリトルエンディアン形式のペイロード長と、それに続く2バイトのコマンド識別子で構成される計6バイトのヘッダが採用されています。データを受信するとQLNXはこのヘッダを読み取り、ペイロード用のメモリを確保した上で、内部のディスパッチ機構に振り分けます。このディスパッチ機構は、登録されたコマンドハンドラテーブルを参照し、受信したコマンドに対応する機能を実行します。
QLNXには計58種類のコマンドが登録されており、ファイルシステム操作、ネットワークトンネリング、認証情報の窃取、ルートキット管理など、侵害後の機能を幅広く備えています。登録されたコマンドや対応するコマンドハンドラの一覧を表5に示します。
表5. RAT「QLNX」に登録されたコマンドと対応するコマンドハンドラの一覧
こちらをご参照ください。
ネットワーク通信
QLNXは、3つのトランスポートバックエンド(生のTCP、HTTPS、HTTP)に対応しており、すべての方式で共通のバイナリコマンドプロトコルを用います。攻撃者は、TCPやHTTPSの通信経路にTLSを適用することで、通信中のコマンドやデータを暗号化し、秘匿性を確保しています。
RAT「QLNX」で確認されたマジック識別子
3つのトランスポートモードはいずれも、ASCII表記で「QLNX」を示す4バイトのマジック値「51 4C 4E 58」を送信することでセッションを開始します。このマジック値はプロトコル識別子やセッション開始フラグとして機能し、その役割はトランスポートに応じて異なります。
通信経路1 — 生のTLS(デフォルト)
通信経路1では、TLS上で直接動作する独自のバイナリプロトコルが採用されています(HTTP層は一切関与しません)。QLNX本体(インプラント)はC&Cサーバに接続する際、証明書の検証を無効化した状態でTLSハンドシェイクを実行した後、長さプレフィックス付きのバイナリフレームを交換します。
セッションは、コマンドループに入る前に4段階のハンドシェイク手順に従って通信が確立されます(図4)。
ハンドシェイク手順が終わると、セッションは完全に双方向通信状態に移行します。これによりQLNXは、コマンドや応答の双方向トラフィックを処理可能になります。
図5では、QLNXとC&Cサーバ間の通信例を示します。
チェックインパケットは、感染ホストの情報をC&Cサーバに登録し、セッションコンテキストを確立するために用いられます(図6)。
HTTP/HTTPS
今回分析した検体は、デフォルトでTLS暗号化通信を用いますが、代替方式としてHTTPやHTTPSにも対応しています。本調査では、QLNXの用いたC&Cサーバを類似的に再構築してHTTP通信のやり取りを再現することができました。
調査の結果、通信のパケット構造は、3つのプロトコル(TLS、HTTP、HTTPS)で共通でした。QLNXは、C&Cサーバへのデータ送信にPOSTリクエストを、コマンド取得(ポーリング)にGETリクエストを用いるほか、すべての通信データをネットワーク上に送信する前にBase64でエンコードします。セッション追跡は、C&Cサーバの生成するセッションID(16進数形式)に依存しています。このセッションIDはGETリクエストのsid= URLパラメータやPOSTリクエストのCookieヘッダの双方に含まれていました。さらに専用スレッドが5秒毎にC&Cサーバにポーリングを行い、新たなコマンドが存在するかどうかを確認します。
QLNXは、C&Cサーバに接続する前にIP情報提供サービス「ip-api.com」にクエリを送信して感染ホストの地理的位置情報を特定します(国名や国コードは登録パケットに含まれていました)。その後QLNXは、Base64でエンコードされたマジックヘッダ「QLNX」を含むPOSTリクエストを/api/v1/updateに送信して、通信を開始します(このハンドシェイクリクエストにはCookieヘッダが含まれていませんでした)。これに対してC&Cサーバは、以降のセッション期間中に感染ホストを追跡するためのセッションIDを返します。
通信が確立されるとQLNXは、感染システムの詳細なプロファイルを含む登録パケットを送信し、C&Cサーバに登録します。登録パケットは13項目のヘッダフィールドで構成され、マシンフィンガープリントを含んでいます(図6)。このマシンフィンガープリントは、/etc/machine-id(または、/var/lib/dbus/machine-id)、MACアドレス、CPU情報、ホスト名などのデータを基に生成されたSHAハッシュのことです(図6)。これにより攻撃者(C&Cサーバ)は、セッション間でIPアドレスが変化した場合でも、感染システムを一貫して特定できる安定した識別子を取得できるようにしています。
登録後QLNXは、ポーリングスレッドを起動し、C&CサーバへのGETリクエスト送信を開始します。次のポーリングサイクルでC&Cサーバは、登録が受理されたかどうかを示すACKパケットで応答します。C&Cサーバによって登録が承認されると、インプラントは2部構成の確認応答(Confirmation)を返します。これはゲート信号として機能する分割パケットであり、C&Cサーバに対して「準備完了。コマンド送信を開始してください」と通知する役割があります。C&Cサーバ側は、この確認応答を受信するまでコマンド発行を保留するよう設計されています。
サーバ認証とコマンドループ
確認応答の送信後QLNXは、メインのコマンドループへと移行し、5秒毎にGETリクエストを送信します。C&Cサーバにコマンドが存在する場合、GET応答のボディにBase64でエンコードされたパケットを含めて応答します。コマンドが存在しない場合は、空の応答が返され、インプラントは次のポーリングサイクルを待機します。
コマンドを受信した場合インプラントは、コマンドをデコード・構文解析します。次いで、コマンドハンドラテーブル内でコマンドタイプを検索し、対応する関数に振り分けます。その後ローカル環境でコマンドハンドラを実行し、実行結果を含む応答パケットを作成してC&Cサーバに送信します。このループは、通信が切断されるか、C&Cサーバからシャットダウンコマンドが送信されるまで実行されます。
永続化手法は、攻撃者(オペレータ)によって完全に制御されます。攻撃者はC&Cサーバ経由でスキャンコマンドを発行し、感染ホストのinitシステム、権限レベル、デスクトップ環境、利用可能なツールを特定します。その後、環境に応じて永続化手法を選択してインストールします。単一の感染ホスト上で永続化手法を複数組み合わせることで、多層的な生存性を確保していると考えられます。永続化に関わる痕跡(サービスファイル、crontabの再起動エントリ、シェルコマンド、initスクリプト、デスクトップエントリなど)にはすべて、コメントとして「QLNX_MANAGED」という文字列が埋め込まれていました。QLNXは、列挙処理中にこの文字列を検出することで自身のエントリと正規のシステムサービスを識別するよう設計されています。
LD_PRELOADを用いて事前に共有ライブラリを読み込ませて永続化を確立
LD_PRELOAD環境変数を用いて共有ライブラリを事前に読み込ませる手法は、QLNXに採用された高度な永続化手法の一つと言えます。設定ファイルやスクリプトを作成する代わりにQLNXは、感染ホスト上で共有ライブラリをコンパイルし、動的リンクされたすべてのプロセスに共有ライブラリを読み込ませます。
この永続化手法は、再起動時やログイン時に発動される別の手法とは異なり、任意のプログラムが実行されるたびに適用されます。仮にQLNXのプロセスが終了されたとしても、次に何らかのコマンドが実行された時点で、事前に読み込まれる共有ライブラリが新たなインスタンスを生成します(これは、QLNXの生存確認に用いられるpsコマンドが実行された場合であっても同様です)。QLNXを完全に停止させるには、まず/etc/ld.so.preloadのエントリを削除してから、QLNXのプロセスを強制終了させる必要があります。この事前読み込み設定を削除せずにプロセスのみを終了したとしても、すぐにQLNXが再実行されてしまいます。
動的リンクされたすべてのプログラムは、実行時にLD_PRELOAD環境変数の仕組みを発動します。このため、ls、cat、ssh、sudo、bashなどの動的リンクされたプログラムが実行された場合にQLNXが再実行されてしまいます。
PAM認証処理を悪用するバックドア
QLNXには、PAM認証を悪用するバックドアが2種類実装されています。これらのバックドアはそれぞれ異なる運用目的を果たす一方で、感染ホスト上で直接コンパイルされる点やLD_PRELOAD環境変数を用いて読み込まれる点で共通していました。また、事前にコンパイルされたバイナリとしてではなく、組み込みC言語ソースコードとして配信されます。攻撃者は、ローカル環境上で直接コンパイルすることで、感染ホストのアーキテクチャ、glibcバージョン、PAMヘッダに応じた共有ライブラリが生成されるようにしています。これにより、異なるLinuxディストリビューション間で事前にコンパイルされたバイナリを展開する際に発生しがちな互換性の問題を回避させていると考えられます。
PAM認証処理をフックするバックドア
1つ目の「PAM認証処理をフックするバックドア」は、様々な機能を備えた認証傍受ライブラリとして動作し、あらゆる認証イベントから平文の認証情報の窃取、マスターパスワード(O$$f$QtYJK)を用いた認証突破、送信側SSHセッションデータのサイレントログ記録(情報探索や監視)を実施します。これらはすべて、単一の共有ライブラリから提供されます。このバックドアは、ソースコードを一時ファイル「/tmp/.pam_src_XXXXXX」に書き出してgccでコンパイルすることで共有ライブラリ(pam_security.so)を生成します。その後、/etc/ld.so.preloadを介してインストールされた後、感染システム上で起動するすべての動的リンクされたプロセスに読み込まれるよう設計されています。さらにフォレンジック調査におけるタイムライン分析を回避するため、正規のpam_unix.soに合わせて自身のタイムスタンプを改ざんします。
このモジュールは、以下の3つの機能に対応しています。
- インストール:バックドアをコンパイル・インストールした上で、
/etc/ld.so.preload内に登録します。 - アンインストール:共有ライブラリ(
.so)を削除し、/etc/ld.so.preloadから対応するエントリを除去します。 - 認証情報の窃取:ログファイルから取得した認証情報を読み取り、XOR方式で復号してC&Cサーバに送信します。
モジュールがインストールされるとQLNXは、PAM認証処理を傍受して平文の認証情報を窃取します。次に窃取した認証情報をXOR方式で暗号化した後、SSH認証関連データを「/var/log/.ICE-unix」内に、SSH、SCP、SU、sudo認証関連データを「/var/log/.Test-unix」内に保存します。これらの情報は、攻撃者が認証情報窃取コマンド(0x90など)を発行した際にC&Cサーバに送信される可能性があります。
PAM認証処理を悪用して認証情報を窃取するキーロガー
QLNXは、C言語ソースコードとして埋め込まれた、より簡易的なPAM認証情報窃取機能にも対応しています。QLNXは、ソースコードを一時ファイル「/tmp/.pcs_XXXXXX」に書き出してgccでコンパイルした後、共有ライブラリ「/usr/lib/.libpam_cache.so」を生成します。その後、/etc/ld.so.preloadを介してインストールされ、感染システム上で起動するすべての動的リンクされたプロセスに読み込まれるよう設計されています。認証を突破する度に、サービス名、ユーザ名、認証トークンを抽出し、それらを平文で/tmp/.pam_cacheに保存します。
ルートキットの分析
LD_PRELOAD環境変数を用いてユーザ空間で動作するルートキット
QLNXには、Linuxの動的リンカ(LD_PRELOAD環境変数)の仕組みを悪用し、ユーザ空間で動作するルートキットを展開するためのコマンドハンドラが実装されています。カーネルレベルで動作するeBPFルートキットコントローラ(BPFマップを用いてカーネル空間で機能するコンポーネント)とは異なり、このルートキット(コンポーネント)は、共有ライブラリレベルで標準Cライブラリ関数をフックするため、完全にユーザ空間で動作します。このルートキットは、事前にビルドされたバイナリとして配信されるものではありません。代わりに攻撃者は、すべてのC言語ソースコードを埋め込み文字列リテラルとしてQLNXに含めており、感染ホスト側のgccを用いて感染ホスト上で直接コンパイルするよう設計しています。
インストールを試行する前にコマンドハンドラは、2つの前提条件を確認します。1つ目は、/etc/ld.so.preloadへの書き込みに必要なroot権限を有していること、2つ目は、感染システム上にgccが存在していることです。いずれかの条件を満たさない場合、処理は中止され、詳細なエラーメッセージとともにコマンドが拒否されます。
コマンドハンドラは、C&Cサーバから3つの機能を受け取ります。
インストール手順
インストールコマンドを受信するとコマンドハンドラは、以下の手順を実行します。
-
mkstemp("/tmp/.hide_src_XXXXXX")を用いて一時ファイルを作成し、拡張子を「.c」に変更します。 -
fprintfを用いて、ルートキットのC言語ソースコードをすべてファイルに書き込みます(この際、ソースコード内には、QLX本体(インプラント)のバイナリパス、現在のプロセスID、隠蔽対象となるファイルの名前などがパラメータとして埋め込まれます)。 - 子プロセスをフォークし、
execlp("gcc", "gcc", "-shared", "-fPIC", "-Wl,-soname,libsecurity_utils.so.1", "-o", "/usr/lib/libsecurity_utils.so.1", <source>, "-ldl")を呼び出して共有ライブラリをコンパイルします。 - コンパイル後すぐにソースファイルを削除します。
-
/etc/ld.so.preloadに共有ライブラリ(libsecurity_utils.so.1)のエントリが既に存在するかどうかを確認します。存在しない場合は、対象のエントリを追加します。 -
utimensatを用いて、/usr/lib/libc.so.6のタイムスタンプ(atimeおよびmtime)を新たに作成された共有ライブラリ(.so)にコピーします(感染システムの標準ライブラリとルートキットのタイムスタンプを一致させることで、フォレンジック調査時に気付かれにくくしていると考えられます)。
ルートキットのフック
生成された共有ライブラリは、dlsym(RTLD_NEXT, ...)を用いて8のlibc関数を傍受し、元の関数アドレスを解決します。これらの関数のいずれかが呼び出された際に引数に含まれるパスや名前がルートキットの隠蔽対象リストと一致した場合、ENOENT(file not found)を返すか、対象のエントリをスキップします。結果として、ユーザ空間ツールマルウェアのプロセスやファイルが不可視化されます。
隠蔽対象となる名前とパスは、コンパイル時に生成されるソースコードにハードコードされています(対象には、QLNX本体(インプラント)のバイナリ、ルートキット(libsecurity_utils.so.1)、PAM認証処理を悪用するバックドア(pam_security.so、モジュール)、PAM認証情報ログファイル(/var/log/配下の.ICE-unix and .Test-unix)が含まれます)。さらにこのルートキットは、各数値のディレクトリエントリに対して/proc/PID/commを読み取り、その文字列を隠蔽対象のプロセス名と照合することで、インプラントのプロセスIDも隠蔽する設計となっていました。
このルートキットは、/etc/ld.so.preloadを介して事前に読み込まれます。このため、ls、find、stat、psをはじめ、システム管理者やフォレンジック調査員が用いる可能性のある標準ツールや感染システム上で動作する動的リンクされたプロセスすべてに注入されます。
eBPFルートキットコントローラ
QLNXには、eBPFベースのルートキットをユーザ空間を制御するための組み込みコマンドハンドラが含まれています。注意すべき点として、このコンポーネント自体には、カーネル側のeBPFプログラムは含まれていません。その役割は、感染システムで隠蔽対象となる項目の一覧を保持するために設計されたカーネル内のデータ構造であるBPFマップの作成や管理に限定されています。C&Cサーバからコマンドを受信するとQLNX本体(インプラント)は、LinuxカーネルのBPFサブシステムを用いて、ps、ls、netstatなどのユーザ空間で動作する標準ツールから特定のプロセス、ファイル、ネットワークポートを隠蔽します。
隠蔽リクエストを処理する前に、ハンドラは3つの前提条件を確認します。
- root権限での実行確認:QLNX本体(インプラント)がroot権限で実行されているかを確認します。root権限で実行されていない場合、コマンドはすぐに拒否されます。
- カーネルバージョンの確認:カーネルのリリース文字列を構文解析し、カーネルバージョン4.18以上を要求します(この機能で用いられるBPFマップタイプに対応する最低限必要となるバージョン)。
- BPFサポートの有効性の検証:
bpf()システムコールを用いてBPFマップの作成を試行します。この呼び出しが失敗した場合(例:カーネル設定でBPFサポートが無効になっている場合など)、コマンド実行は中止されます。
すべての確認事項を通過するとハンドラは、受信したC&Cパケットから2つのフィールド(アクションID(整数)や文字列引数)を読み取ります。アクションIDによって実行する操作が決定します。
各アクションの実行後、コマンドハンドラは達成フラグやステータスメッセージを含む応答パケットをC&Cサーバに送信します。
- 1つ目のサブモジュールは、SSH秘密鍵(
id_rsa、id_ed25519、id_ecdsa、id_dsa)、known_hosts、authorized_keysを窃取します。 - 2つ目は、Chrome、Chromium、FirefoxからログインデータベースやCookieを抽出します。
- 3つ目は、開発者環境やクラウド設定ファイルのハードコードされたテーブルを順に処理します(AWSの認証情報や設定ファイル、Kubernetesのkubeconfig、Dockerの
config.json、Gitの認証情報やgitconfig、NPMの.npmrc、PyPIの.pypirc、.config/gh/hosts.ymlのGitHub CLIトークン、HashiCorp Vaultトークン、Terraformの認証情報、ユーザのホームディレクトリ内のあらゆる環境変数(.env)ファイルを含む)。 - 4つ目は、root権限で実行された際に
/etc/shadowを読み取り、シェル履歴やその他のトークンファイルも窃取します。さらにxclipやxselを介して現在のX11環境のクリップボードの内容も窃取します。
窃取されたデータには、カテゴリ、アプリケーション名、ファイルパス、生データなどのタグが付与された後、C&Cサーバに送信されます。
その後攻撃者は、一般的な開発者ワークステーション上から窃取した認証情報を悪用してクラウド環境全体を侵害したり、GitやGitHub CLIトークンを介して非公開のソースコードリポジトリに不正アクセスしたり、NPMやPyPIの認証トークンを悪用してパッケージ公開パイプラインを乗っ取ったり、ユーザのSSHキーチェーンに登録されたすべてのサーバ内で内部活動(情報探索など)を実行したりする可能性があります。こうした窃取範囲の広さは、単一の開発者環境が不正遠隔操作ツール「QLNX」に感染することで、ソフトウェアサプライチェーン攻撃やクラウド基盤への大規模なセキュリティ侵害を引き起こす侵入経路になり得ることを意味します。
攻撃者は、QLNX本体(インプラント)をステルス性の長期維持や認証情報の窃取に特化させた形で設計されています。QLNXが特に危険視される理由は、個々の機能そのものでなく、各機能が連携して一貫した攻撃ワークフローを形成している点にあります。このワークフローは、初期侵入に始まり、ディスク上の痕跡の除去、冗長化された複数の永続化手法の展開、ユーザ空間やカーネルレベルでの隠蔽、そして攻撃者の最終目的である機密情報(認証情報など)の窃取という一連の流れにあります。
QLNXの背後にいる攻撃者は、現代のソフトウェア開発やクラウド基盤の核心となる認証ファイルを体系的に狙っています
(具体的には、.npmrc(NPMレジストリトークン)、.pypirc(PyPIアップロードキー)、.git-credentials、.aws/credentials、.kube/config、.docker/config.jsonなどです)。
これらの情報が窃取された場合、ソフトウェアサプライチェーン攻撃の起点として悪用される可能性があります。単一の開発者ワークステーションを侵害されるだけで、攻撃者がNPMやPyPI上にトロイの木馬化されたパッケージを公開したり、コンテナイメージにバックドアを仕込んだり、開発者の個人端末からクラウド上の本番環境へと攻撃範囲を拡大させたりする機会を与えることになり得ます。
この脅威は、理論上のリスクにとどまりません。2026年3月下旬に発生した人気Pythonパッケージ「LiteLLM」のソフトウェアサプライチェーンが侵害された事件は、まさにこの攻撃パターンを体現しています。攻撃者は、何らかの方法で入手した認証情報を悪用して正規アカウントに不正アクセスした後、1日340万回ダウンロードされるPythonパッケージにトロイの木馬を仕込んで配信させていました。QLNXで確認された機能群は、こうした攻撃チェーンの各段階に直接対応しています。
攻撃者は、ルートキット、PAM認証を悪用して平文パスワードを密かに傍受するバックドア、インプラント間で相互中継可能なP2Pメッシュネットワークなどを組み合わせることで、セキュリティ検知や駆除を困難にさせています。
TrendAI Vision One™をご利用のお客様環境は、本記事で取り上げた脅威(IoC)から保護されています。さらに後述する「スレットハンティングクエリ」、「Threat Insights」、「Threat Intelligence Reports」にアクセスすることで、QLNXに関する豊富なコンテキスト情報や最新情報を入手し、プロアクティブなセキュリティ対策の実現につなげることができます。
TrendAI Vision One™によるプロアクティブセキュリティ
「TrendAI Vision One™」は、Cyber Risk Exposure Management(CREM)やセキュリティオペレーションを一元化し、オンプレミス、ハイブリッド、マルチクラウド環境にまたがる堅牢な多層防御を提供する、唯一のAI駆動型統合セキュリティ基盤です。
TrendAI Vision One™によるネットワークセキュリティ
47135: HTTP: Backdoor.Linux.QLNX.A Runtime Detection(HTTP上でのBackdoor.Linux.QLNX.Aの実行時検出)
47136: TCP: Backdoor.Linux.QLNX.A Runtime Detection(TCP上でのBackdoor.Linux.QLNX.Aの実行時検出)
TrendAI Vision One™ スレットインテリジェンス
TrendAI Vision One™をご利用のお客様は、高度化する脅威に先手を打つために、TrendAI Vision One™内で提供される各種インテリジェンスレポート(Intelligence Reports)とスレットインサイト(Threat Insights)をご活用いただけます。
TrendAI Vision One™ Threat Insights
新たな脅威:Quasar Linux (QLNX): Quasar Linux (QLNX) — A Silent Foothold in the Supply Chain: Inside a Full-Featured Linux RAT With Rootkit, PAM Backdoor, Credential Harvesting and More
TrendAI Vision One™のアプリ「Intelligence Report」(IoC Sweeping)
スレットハンティングクエリ
TrendAI Vision One™の検索機能「Search」アプリ
TrendAI Vision One™をご利用のお客様は、お客様環境内のデータを検索アプリに用いることで、本ブログ記事で取り上げた悪意ある指標を調査いただけます。
Linux向けQLNXに対する脅威ハンティングクエリ:
# Implant Binary Execution
eventSubId:(2 OR 5) AND processFilePath:"quasar-implant"
# Mutex Lock File
objectFilePath:"/tmp/.X752e2ca1-lock"
# LD_PRELOAD Rootkit Module
objectFilePath:"/usr/lib/libsecurity_utils.so.1"
# Hidden SSH password log / Hidden PAM password log
objectFilePath:("/var/log/.Test-unix" OR "/var/log/.ICE-unix")
# PAM Hook Source Dropper
eventSubId:(101 OR 103) AND objectFilePath:/\/tmp\/\.pcs_[A-Za-z0-9]{6}/
# PAM Hook Compilation Activity
processFilePath:/.*\/gcc/ AND processCmd:"-shared" AND processCmd:"-fPIC"
AND processCmd:"/usr/lib/.libpam_cache.so" AND processCmd:"-lpam"
TrendAI Vision One™をご利用中で、「Threat Intelligence Hub」が有効となっている場合、より多くの脅威ハンティングクエリをご確認いただけます。
侵入の痕跡(IoC: Indicators Of Compromise)
不正遠隔操作ツール(RAT)「QLNX」本体(インプラント)および主要モジュールは、こちらをご参照ください。
参考記事
Quasar Linux (QLNX) — A Silent Foothold in the Supply Chain: Inside a Full-Featured Linux RAT With Rootkit, PAM Backdoor, Credential Harvesting Capabilities
By: Aliakbar Zahravi, Ahmed Mohamed Ibrahim
翻訳:益見 和宏(Platform Marketing, TrendAI Research™)