ナビゲーションをスキップする
BlackBerry ブログ

Symbiote:ほぼ検出が不可能な新しい Linux への脅威

Symbiote :ほとんど検知が不可能な新しい Linux への脅威

原文のブログはこちらからご覧いただけます。

本リサーチは、Intezer のセキュリティ研究者 Joakim Kennedy 氏と BlackBerry の Research and Intelligence Team 間の共同の取り組みです。こちらの Intezer のブログにも掲載されています。

生物学では、symbiote (共生生物)とは他の生命体と共生する生命体です。共生生物は、両方の生命体に相互にメリットをもたらすことがありますが、一方がメリットを得て、他方が害を受ける場合は寄生的になることがあります。数か月前に、私たちは、この寄生的な性質の挙動を示し、Linux® オペレーティングシステムに影響を及ぼす新しい未知のマルウェアを発見しました。当社は、このマルウェアにふさわしい Symbiote (シンビオート) という名前を付けました。

Symbiote と一般的な Linux マルウェアの相違点は、Symbiote が感染したマシンに損害を与えるために、他の実行中のプロセスに感染する必要があることです。Symbiote は、マシンに感染するために実行される単独の実行可能ファイルではなく、LD_PRELOAD (T1574.006)を使用してすべての実行中のプロセスにロードされ、マシンに寄生的に感染する共用オブジェクト(SO)ライブラリです。すべての実行中のプロセスに感染したら、Symbiote は、脅威アクターにルートキット機能(認証情報を収集する機能やリモートアクセス機能)を提供します。
 

Symbiote の誕生

Symbiote が初めて検知されたのは 2021 年 11 月であり、ラテンアメリカの金融セクターを標的とするために作成されたものと考えられています。このマルウェアは、マシンに感染すると、自身および脅威アクターによって使用されるその他のマルウェアを隠蔽し、感染の検知を非常に困難にします。すべてのファイル、プロセス、ネットワーク上の痕跡がマルウェアによって隠蔽されるため、感染したマシンでライブフォレンジックを実行しても、何も検知されないことがあります。ルートキット機能に加えて、このマルウェアは、脅威アクターがハードコーディングされたパスワードを使用してマシン上の任意のユーザーとしてログインし、最高権限でコマンドを実行するためのバックドアを提供します。

Symbiote は極めて回避能力が高いため、「検知されない」可能性が高くなります。当社のリサーチでは、Symbiote が高度な標的型攻撃で使われているのか、または広範な攻撃で使用されているかを判断するための十分な証拠が見つかりませんでした。

Symbiote の興味深い技術的側面の 1 つは、その BPF (Berkeley Packet Filter)のフッキング機能です。Symbiote は、BPF を使用した最初の Linux マルウェアではありません。たとえば、Equation Group作成したと見なされている高度なバックドアは、通信を変換するために BPF を使用していました。一方、Symbiote は、感染したマシンで悪意のあるネットワークトラフィックを隠蔽するために BPF を利用しています。

管理者が感染したマシンでパケットキャプチャツールを起動すると、キャプチャするパケットを定義する BPF バイトコードがカーネルに注入されます。このプロセスで、パケットキャプチャソフトウェアに検知させたくないネットワークトラフィックを除外できるように、Symbiote は初めにそのバイトコードを追加します。

 

回避手法

Symbiote は、非常に検知されにくいマルウェアです。このマルウェアは、LD_PRELOAD ディレクティブを使用してリンカーによってロードされるように設計されています。このため、他の共用オブジェクトの前にこのオブジェクトをロードさせることができます。このマルウェアは最初にロードされるため、アプリケーションに対してロードされる他のライブラリファイルからの「インポートをハイジャックする」ことができます。

Symbiote は、これを利用して、libc 関数と libpcap 関数をフックすることにより、マシン上で自己の存在を隠蔽します。以下の画像に、このマルウェアの回避手法の概要を示します。

 

図 1 :Symbiote の回避手法

 

ホストアクティビティ

Symbiote マルウェアは、マシン上で自己の存在を隠蔽することに加えて、Symbiote と共に展開されることが多いマルウェアに関連する他のファイルも隠蔽します。バイナリ内には、RC4 で暗号化されたファイルリストがあります。フックされた関数が呼び出されると、このマルウェアは最初に libc を動的にロードし、元の関数を呼び出します。このロジックは、すべてのフックされた関数で使用されます。以下の図 2 に例を示します。

図 2 :libc から readdir を解決するロジック

 

呼び出し側のアプリケーションが /proc の下のファイルまたはフォルダにアクセスしようとすると、このマルウェアはそのリスト上にあるプロセス名からの出力を消去します。以下のリスト内のプロセス名は、当社が発見したサンプルから抽出しました。

  • certbotx64
  • certbotx86
  • javautils
  • javaserverx64
  • javaclientex64
  • javanodex86

呼び出し側のアプリケーションが /proc の下のファイルまたはフォルダにアクセスしようとしていない場合は、その代わりにファイルリスト上にある結果が消去されます。当社が調査したすべてのサンプルから抽出されたファイルを以下のリストに示します。一部のファイル名は、Symbiote によって使用されるファイル名と一致し、他のファイル名は、感染したマシンで脅威アクターによって使用されるツールであると疑われるファイル名と一致します。このリストには以下のファイルが含まれます。

  • apache2start
  • apache2stop
  • profiles.php
  • 404erro.php
  • javaserverx64
  • javaclientex64
  • javanodex86
  • liblinux.so
  • java.h
  • open.h
  • mpt86.h
  • sqlsearch.php
  • indexq.php
  • mt64.so
  • certbot.h
  • cert.h
  • certbotx64
  • certbotx86
  • javautils
  • search.so

LD_PRELOAD を使用して Symbiote をプロセスにロードすると、ldd などのツール(各プログラムによって要求される共用ライブラリを出力するユーティリティ)によって、ロードされたオブジェクトとしてこのマルウェアがリストされます。これに対抗するために、このマルウェアは execve をフックし、環境変数 LD_TRACE_LOADED_OBJECTS を 1 に設定してこの関数の呼び出しを監視します。その理由については、ldd のマニュアルページを参照してください。

通常、ldd は、LD_TRACE_LOADED_OBJECTS 環境変数を 1 に設定して標準ダイナミックリンカー(ld.so(8) を参照)を呼び出します。この結果、このダイナミックリンカーは、プログラムの動的な依存関係を検査し、この依存関係を満たすオブジェクトを(ld.so(8) に記述されるルールに従って)見つけ、ロードします。各依存関係に対して、ldd は、一致するオブジェクトの場所とロードされる(16 進数の)アドレスを表示します。(linux-vdso と ld-linux の共用依存関係は特殊です。vdso(7) と ld.so(8) を参照してください。)

マルウェアはこれを検知すると、ldd と同様にローダーを実行しますが、結果から独自のエントリを消去します。

 

ネットワークアクティビティ

Symbiote には、感染したマシンでネットワークアクティビティを隠蔽する機能もあります。Symbiote は、これを達成するために 3 種類の方式を使用します。第 1 の方式では、fopen fopen64 をフックします。呼び出し側のアプリケーションが /proc/net/tcp を開こうとすると、このマルウェアは一時ファイルを作成し、そのファイルに最初の行をコピーします。その後、各行に特定のポートがあるかどうかをスキャンします。このマルウェアは、スキャンしている行で探しているポートを見つけると、次の行にスキップします。見つからない場合、その行は一時ファイルに書き込まれます。元のファイルをすべて処理すると、このマルウェアはそのファイルを閉じ、一時ファイルのファイル記述子を呼び出し元に返します。

実質的に、これによって消去が行われた結果(このマルウェアが隠蔽したいネットワーク接続のすべてのエントリが除外された結果)が呼び出し側のプロセスに与えられます。

ネットワークアクティビティを隠蔽するために Symbiote が使用する第 2 の方式は、注入されたパケットフィルタリングバイトコードをハイジャックすることです。Linux カーネルでは、ユーザーランドプロセスから提供されるルールに基づくパケットフィルタリングを実現するために、eBPF (extended Berkeley Packet Filter)が使用されます。フィルタリングルールは、カーネルが仮想マシン(VM)で実行する eBPF バイトコードとして提供されます。これにより、カーネルとユーザーランド間のコンテキストの切り替えが最小限になり、カーネルによってフィルタリングが直接実行されるため、パフォーマンスが大幅に改善されます。

感染したマシン上のアプリケーションが eBPF を使用してパケットフィルタリングを実行しようとすると、Symbiote はフィルタリングプロセスをハイジャックします。最初に、これは libc 関数の setsockopt をフックします。ソケットでパケットフィルタリングを実行するために使用されるオプション SO_ATTACH_FILTER を付けてこの関数を呼び出すと、呼び出し側のアプリケーションによって提供される eBPF コードの前に独自のバイトコードが追加されます。

コードスニペット 1 は、Symbiote サンプルの 1 つによって注入された注釈付きバイトコードを示しています。このバイトコードは、以下の条件と一致した場合にパケットを「ドロップ」します。

  • IPv6 (TCP または SCTP)とソースポート(43253、43753、63424、26424 のいずれか)
  • IPv6 (TCP または SCTP)と宛先ポート 43253
  • IPv4 (TCP または SCTP)とソースポート(43253、43753、63424、26424 のいずれか)
  • IPv4 (TCP または SCTP)と宛先ポート(43253、43753、63424、26424 のいずれか)

このバイトコードはポートのみに基づいてパケットをドロップしますが、IPv4 アドレスに基づくトラフィックのフィルタリングも観測されました。すべてのケースで、フィルタリングはマシンへのインバウンドトラフィックとマシンからのアウトバウンドトラフィックの両方で動作し、両方向のトラフィックが隠蔽されます。条件が満たされない場合は、呼び出し側のアプリケーションによって提供されるバイトコードの先頭にジャンプします。

コードスニペット 1 に示すように、サンプルの 1 つから抽出されたバイトコードは、32 の命令で構成されます。このコードの後ろにもっと多くのバイトコードが存在すると想定されるため、このコードを単独でカーネルに注入することはできません。このバイトコードでは、呼び出し側のプロセスによって提供されるバイトコードの先頭までスキップする数回のジャンプが実行されます。呼び出し元のバイトコードがなければ、注入されたバイトコードは、カーネルによって許可される範囲の外にジャンプします。このようなバイトコードは、手書きで作成するか、コンパイラによって生成されたバイトコードを修正して作成する必要があります。いずれの選択肢も、このマルウェアがスキルのある開発者によって作成されたことを示唆しています。

コードスニペット 1 :Symbiote サンプルの 1 つから抽出された注釈付きバイトコード

 

ネットワークトラフィックを隠蔽するために Symbiote が使用する第 3 の方式は、libpcap 関数をフックすることです。この方式は、リスト内にあるドメイン名への UDP トラフィックを除外するために、このマルウェアによって使用されます。このタスクを達成するために、pcap_loop 関数と pcap_stats 関数がフックされます。受信した各パケットに対して、Symbiote は、UDP ペイロードで、除外したいドメインの部分文字列をチェックします。一致する部分文字列が見つかった場合、このマルウェアはパケットを無視し、カウンターの値を 1 つ増やします。pcap_stats は、このカウンターを使用して、処理されたパケットの実際の数からカウンターの値を指し引くことにより、処理されたパケットの数を「修正」します。パケットペイロードに、リスト内にあるいずれの文字列も含まれない場合は、元のコールバック関数が呼び出されます。バイトコード方式は TCP パケットを除外するために使用されるのに対して、この方式は UDP パケットを除外するために使用されます。上記の 3 つの方式すべてを使用して、このマルウェアはすべてのトラフィックを確実に隠蔽します。

 

Symbiote の目的

このマルウェアの目的は、マシン上で悪意のあるアクティビティを隠蔽することに加えて、認証情報を収集し、脅威アクターにリモートアクセスを提供することです。認証情報の収集は、libc read 関数をフックすることによって実行されます。ssh プロセスまたは scp プロセスがこの関数を呼び出している場合、この関数は認証情報を収集します。認証情報は埋め込まれた鍵を使用して RC4 で暗号化されてから、ファイルに書き込まれます。たとえば、このマルウェアの 1 つのバージョンは、収集した認証情報をファイル /usr/include/certbot.h に書き込みます。

認証情報はローカルに保存されるだけでなく、持ち出されます。このデータは、脅威アクターによって制御されるドメイン名への DNS アドレス(A)レコード要求を通じて、持ち出すために 16 進エンコードされ、チャンク化されます。レコード要求は、以下の形式です。

コードスニペット 2 :データを持ち出すために Symbiote によって使用される DNS 要求の構造

 

このマルウェアは、マシンに /etc/resolv.conf で設定されたネームサーバーがあるかどうかをチェックします。このネームサーバーがない場合は、Google の DNS (8.8.8.8)が使用されます。ドメイン名に対する要求の送信と共に、Symbiote は UDP ブロードキャストとしても要求を送信します。

感染したマシンに対するリモートアクセスは、Linux の少数の PAM (Pluggable Authentication Module)関数をフックすることによって達成されます。あるサービスが PAM を使用してユーザーを認証しようとすると、このマルウェアはハードコーディングされたパスワードに照らして提供されたパスワードをチェックします。提供されたパスワードが一致した場合、フックされた関数は正常な応答を返します。PAM がフックされているため、脅威アクターは、PAM を使用するすべてのサービスでマシンに対して認証されます。これには、セキュアシェル(SSH)などのリモートサービスが含まれます。

入力されたパスワードがハードコーディングされたパスワードと一致しない場合、このマルウェアはキーロギング機能の一部としてそのパスワードを保存し、持ち出します。また、このマルウェアは、そのコマンドアンドコントロール(C2)ドメインに DNS TXT レコード要求を送信します。TXT レコードの形式は、%MACHINEID%.%C2_DOMAIN% です。応答を取得すると、このマルウェアは、コンテンツを base64 デコードし、コンテンツが正しい ed25519 秘密鍵で署名されているかどうかをチェックし、RC4 でコンテンツを復号して、生成された bash プロセスでシェルスクリプトを実行します。この機能は、通常のプロセスが機能しない場合に、マシンへのアクセスを取り戻すための緊急アクセス(Break Glass)方式として使用できます。

脅威アクターが感染したマシンに対して認証されると、Symbiote は、脅威アクターが root 権限を取得するための手段を提供します。共用オブジェクトは、最初にロードされたときに、環境変数 HTTP_SETTHIS をチェックします。この変数にコンテンツが設定されている場合、このマルウェアは有効なユーザーとグループの ID を root ユーザーに変更し、この変数をクリアーしてから、システムコマンドを使用してコンテンツを実行します。

このプロセスでは、共用オブジェクト(SO)に setuid permission フラグが設定されている必要があります。システムコマンドが終了すると、Symbiote はプロセスも終了して、元のプロセスの実行を阻止します。以下の図 3 には、実行されるコードを示します。このコードを使用すると、シェル内で任意のユーザーとして HTTP_SETTHIS=”/bin/bash -p” /bin/true を実行することにより、root シェルを生成できます。

 

図 3 :root 権限でコマンドを実行するために使用されるロジック

 

ネットワークインフラストラクチャ

Symbiote マルウェアによって使用されるドメイン名は、ブラジルの数行の大手銀行を偽装しています。このことは、銀行とその顧客が潜在的な標的であることを示唆しています。マルウェアによって利用されたドメイン名を用いて、当社は、certbotx64 という名前で VirusTotal にアップロードされた関連サンプルを発見することができました。このファイル名は、当初取得した Symbiote サンプルの 1 つで隠蔽するファイルとしてリストされていた名前の 1 つと一致します。このファイルは、dnscat2 と呼ばれるオープンソースの DNS トンネリングツールとして特定されました。

このサンプルのバイナリには、C2 サーバーとして git[.]bancodobrasil[.]dev ドメインを使用する設定がありました。2 月と 3 月中に、このドメイン名は、Njalla の仮想専用サーバー(VPS)サービスに関連付けられている IP アドレスに解決されました。パッシブ DNS レコードによって、数か月前に、同じ IP アドレスが ns1[.]cintepol[.]link ns2[.]cintepol[.]link に解決されたことが示されました。Cintepol とは、ブラジル連邦警察が提供している情報ポータルです。このポータルでは、警察官が捜査の一環として連邦警察により提供されるさまざまなデータベースにアクセスできます。この偽装しているドメイン名に使用されたネームサーバーは、2021 年 12 月半ばから 2022 年 1 月末までアクティブでした。

また、2022 年 2 月以降、ドメイン caixa[.]wf 用のネームサーバーは、別の Njalla VPS IP を指していました。以下の図 4 には、各イベントのタイムラインを示します。ネットワークインフラストラクチャに加えて、ファイルが VirusTotal に送信された時点のタイムスタンプが含まれています。この 3 つの Symbiote サンプルは、ブラジルから同じ送信者によってアップロードされました。各ファイルは、インフラストラクチャがオンラインになる前に VirusTotal に送信されたようです。

インフラストラクチャがオンラインになる前に各ファイルが VirusTotal に送信されたと仮定すると、サンプルの一部にはローカル IP アドレスを隠蔽するためのルールが含まれていたため、サンプルは使用前にアンチウイルス(AV)による検知をテストするために VirusTotal に送信された可能性があります。また、開発中と思われるバージョンがブラジルから 11 月末に送信されたことは、Symbiote の背後にいる脅威アクターまたはグループが検知テストのために VirusTotal を使用していたことも示唆しています。

図 4 :ファイルが VirusTotal に送信された時期とネットワークインフラストラクチャがアクティブになった時期を示すタイムライン

 

他のマルウェアとの類似性

Symbiote は、認証情報の窃盗と感染した Linux サーバーへのリモートアクセス提供の両方のために設計されたと思われます。Symbiote は、この目的のために開発された最初の Linux マルウェアではありません。2014 年に、ESET は、Ebury の詳細解析を公開しました。これは、認証情報の窃盗も実行する OpenSSH バックドアです。両方のマルウェアファミリで使用された手法には、類似性がいくつかあります。いずれもフックされた関数を使用して認証情報を収集し、DNS 要求として収集したデータを持ち出していました。しかし、2 つのマルウェアファミリによって使用されたバックドアへの認証方式は異なります。当社が Intezer Analyze でサンプルを最初に解析したときには、固有なコードのみが検知されました(図 5)。Symbiote と Ebury/Windigo またはその他の既知のマルウェア間でいかなるコードも共有されていないため、当社は、Symbiote が新しい未知の Linux マルウェアであると自信を持って結論づけることができます。

図 5 :Symbiote として分類される遺伝子のみを示している Symbiote サンプルの Intezer 解析

 

結論

Symbiote は、極めて回避能力が高いマルウェアです。その主な目的は、認証情報を収集し、感染したマシンへのバックドアアクセスを容易にすることです。マルウェアはユーザーランドレベルのルートキットとして動作するため、感染の検知は困難な場合があります。ネットワークテレメトリを使用すれば、異常な DNS 要求を検知できます。また、アンチウイルスやエンドポイント検知/対処(EDR)などのセキュリティツールを静的に連携させて、ユーザーランドルートキットに「感染」しないようにする必要があります。

 

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

ハッシュ

ハッシュ

121157e0fcb728eb8a23b55457e89d45d76a a3b7d01d3d49105890a00662c924

「kerneldev.so.bkp」。初期開発ビルドであると思われます。

f55af21f69a183fb8550ac60f392b05df14aa01 d7ffe9f28bc48a118dc110b4c

「mt64_.so」。DNS を通じた不足している認証情報の持ち出し

ec67bbdf55d3679fca72d3c814186ff4646dd7 79a862999c82c6faa8e6615180

「search.so」。DNS の認証情報の持ち出しを含む最初のサンプル

a0cd554c35dee3fed3d1607dc18debd1296fa aee29b5bd77ff83ab6956a6f9d6

「liblinux.so」

45eacba032367db7f3b031e5d9df10b30d016 64f24da6847322f6af1fd8e7f01

「certbotx64」。dnscat2

 

隠蔽されるポート

  • 45345
  • 34535
  • 64543
  • 24645
  • 47623
  • 62537
  • 43253
  • 43753
  • 63424
  • 26424

隠蔽されるドメイン

  • assets[.]fans
  • caixa[.]cx
  • dpf[.]fm
  • bancodobrasil[.]dev
  • cctdcapllx0520
  • cctdcapllx0520[.]df[.]caixa
  • webfirewall[.]caixa[.]wf
  • caixa[.]wf

隠蔽されるプロセス名

  • javaserverx64
  • javaclientex64
  • javanodex86
  • apache2start
  • apache2stop
  • [watchdog/0]
  • certbotx64
  • certbotx86
  • javautils

隠蔽されるファイル名

  • apache2start
  • apache2stop
  • profiles.php
  • 404erro.php
  • javaserverx64
  • javaclientex64
  • javanodex86
  • liblinux.so
  • java.h
  • open.h
  • mpt86.h
  • sqlsearch.php
  • indexq.php
  • mt64.so
  • certbot.h
  • cert.h
  • certbotx64
  • certbotx86
  • javautils
  • search.so

認証情報が持ち出されるドメイン

  • *.x3206.caixa.cx
  • *.dev21.bancodobrasil.dev
     
 
Joakim Kennedy 博士

Joakim Kennedy 博士について

Joakim Kennedy 博士は、日々、マルウェアを解析し、脅威アクターを追跡しているIntezer セキュリティ研究者です。過去数年間にわたって、Joakim 氏は、Go で記述されたマルウェアを調査してきました。解析を容易にするために、Joakim 氏は、Go バイナリの解析用のオープンソースツールキットである Go Reverse Engineering Toolkit (github.com/goretk)を作成しました。

The BlackBerry Research and Intelligence Team

About The BlackBerry Research and Intelligence Team

BlackBerry の Research and Intelligence Team は、新たに生じている脅威と持続的な脅威を検証し、セキュリティ担当者とその所属企業のために、インテリジェンス解析を提供しています。