LinkPro:eBPFベースのルートキットがGNU/Linux上の悪意ある活動を隠蔽

概要

Synacktiv CSIRTのセキュリティ研究者たちは、LinkProと名付けられた高度なLinuxルートキットを発見しました。このルートキットは、eBPF(extended Berkeley Packet Filter)技術を悪用して、従来の監視ツールからはほぼ見えない形で永続的なバックドアアクセスを確立します。感染経路は、インターネットに公開されていた脆弱なJenkinsサーバー(CVE-2024-23897)の悪用から始まりました。

感染経路とマルウェアの構成

攻撃者は初期アクセスポイントを利用して、複数のAmazon EKS(Elastic Kubernetes Service)クラスターに「kvlnt/vv」という悪意のあるDockerイメージを展開しました。このコンテナ化されたペイロードは、Kali Linuxベースイメージで構成されており、以下の3つの重要なコンポーネントを含んでいました。

  • bashスタートアップスクリプト
  • プロキシ機能を提供するVPNサーバープログラム「vnt」
  • Rustベースのダウンローダーマルウェア「vGet」

「vGet」ダウンローダーは、Amazon S3バケットから暗号化されたペイロードを取得し、ディスクに痕跡を残さないようにvShell 4.9.3バックドアを直接メモリに展開しました。このバックドアは、以前に脅威アクターUNC5174によって使用されたことが確認されており、コマンド&コントロールサーバー(56.155.98.37)とWebSocketを介して通信していました。この洗練された攻撃は最終的に、作戦の「切り札」であるLinkProの展開へと繋がりました。

高度なeBPFベースの隠蔽メカニズム

LinkProは、2つの異なるeBPFモジュールを利用した二層の隠蔽戦略によって際立っています。

Hideモジュール

最初のモジュールである「Hide」は、TracepointおよびKretprobeタイプのeBPFプログラムを実装し、重要なシステムコールを傍受します。getdentsおよびgetdents64システムコールにフックすることで、LinkProはディレクトリリストをフィルタリングし、「.tmp~data」や「.system」といったキーワードを含むファイルへの参照を削除します。また、このルートキットは、eBPFマップに保存されたプロセスID(最大10個のPIDを同時に隠蔽可能)を持つ/proc/以下の特定のプロセスディレクトリも隠蔽します。

eBPFプログラムの隠蔽

Hideモジュールは、bpftoolのような検出ツールから自身のeBPFプログラムを隠蔽するための高度な技術も採用しています。sys_bpfシステムコールを傍受し、返されたプログラムIDが内部マップに保存されているものと一致するかどうかを確認することで、LinkProはカーネルにエラーコードを返すよう指示し、自身のeBPFコンポーネントを管理ユーティリティから見えなくします。ただし、この技術は、LinuxカーネルがCONFIG_BPF_KPROBE_OVERRIDE構成オプションでコンパイルされている必要があり、これはAmazon LinuxやUbuntu 24.04の最近のバージョンで利用可能です。

代替の隠蔽メカニズム:libld.so

eBPFベースの隠蔽がカーネル機能の不足により失敗した場合、LinkProは/etc/ld.so.preload設定ファイルを変更することで代替の隠蔽メカニズムを展開します。ルートキットは、悪意のある共有ライブラリlibld.soを抽出し、/etc/libld.soにインストールします。このライブラリは、動的リンクを必要とするすべてのプログラムによってロードされます。

このlibld.soは、fopengetdentsreaddirkillを含むいくつかのlibc関数にフックをかけ、LinkProのネットワークトレースやファイルシステムアーティファクトを隠蔽します。特に、/proc/net/tcp/proc/net/tcp6/proc/net/udp/proc/net/udp6ファイルをターゲットとし、LinkProのデフォルトリスニングポートであるポート2233を含む行をフィルタリングします。この技術は、/proc/netファイルに依存するnetstatのようなツールには効果的ですが、netlinkプロトコルを使用するssコマンドによってバイパスされる可能性があります。

マジックパケットによる起動とポートリダイレクト

2番目のeBPFモジュールである「Knock」は、マジックパケットによる起動を通じてLinkProのパッシブバックドアモードを可能にします。このモジュールは、XDP(eXpress Data Path)タイプのxdp_ingressとTC(Traffic Control)タイプのtc_egressという2つのeBPFプログラムで構成されています。

xdp_ingressプログラムは、特定のウィンドウサイズ値54321を持つTCP SYNパケットの着信ネットワークトラフィックを監視します。このマジックパケットを検出すると、プログラムはソースIPアドレスをknock_mapに1時間の有効期限付きで登録し、その特定のIPに対してLinkProを「オープン」状態に移行させます。アクティブ化されると、xdp_ingressは登録されたIPからの後続のTCPパケットを傍受し、元の宛先ポートに関係なく、宛先ポートをLinkProの内部リスニングポート2233に変更します。その後、tc_egressプログラムは、送信される応答パケットを修正して元の宛先ポートをソースポートとして復元し、透過的な通信チャネルを作成します。この洗練されたポートリダイレクトにより、オペレーターはフロントエンドのファイアウォールによって許可された任意のポートを介してコマンドを送信できるため、フォレンジック分析やファイアウォールログと実際のネットワークアクティビティの関連付けが著しく困難になります。

Systemdサービスへの偽装と永続化

LinkProは、正当なsystemd-resolvedサービス(ネットワーク名前解決を担当)を装うことで永続性を確立します。ルートキットは、自身の実行ファイルを/usr/lib/.system/.tmp~data.resolveldにコピーし、/etc/systemd/system/systemd-resolveld.serviceに適切な設定を持つsystemdユニットファイルを作成して、システム起動時の自動実行を保証します。さらに検出を回避するため、LinkProはタイムスタンピングを実行し、自身のファイルの作成日と変更日を/etc/passwdのものと一致させます。

運用モードと機能

このバックドアは、リバース(パッシブ)モードとフォワード(アクティブ)モードの2つの運用モードをサポートしています。リバースモードでは、LinkProは上記のマジックパケット起動メカニズムを使用してC2サーバーからのコマンドを待ち受けます。フォワードモードでは、バックドアはC2サーバーとの通信を積極的に開始し、HTTP、WebSocket、UDP、TCP、DNSトンネリングの5つの異なるプロトコルをサポートします。分析されたサンプルは、IPアドレス18.199.101.111とHTTPプロトコルを介してポート2233で通信していました。

確立されると、LinkProはオペレーターに広範なリモートアクセス機能を提供します。これには、インタラクティブなbashターミナルセッション、任意のシェルコマンド実行、包括的なファイル管理操作、チャンク転送エンコーディングによるファイルアップロード/ダウンロード機能が含まれます。これらの機能により、脅威アクターは永続的なアクセスを維持し、機密データを抜き取り、被害者のネットワーク環境全体で他のシステムに侵入することが可能になります。


元記事: https://gbhackers.com/linkpro-an-ebpf-based-rootkit/