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

概要:高度なeBPFベースのLinuxルートキット「LinkPro」

セキュリティ研究機関Synacktiv CSIRTは、eBPF(extended Berkeley Packet Filter)技術を悪用して永続的なバックドアアクセスを確立し、従来の監視ツールからほぼ不可視の状態を維持する洗練されたLinuxルートキット「LinkPro」を発見しました。このマルウェアは、クラウドインフラストラクチャ全体でGNU/Linuxシステムを侵害するために、高度なステルス機能と柔軟な運用モードを兼ね備えています。

感染経路と初期アクセス

LinkProの感染経路は、インターネットに公開されていた脆弱なJenkinsサーバー(CVE-2024-23897を悪用)から始まりました。攻撃者はこの初期アクセスポイントを利用し、複数のAmazon EKS(Elastic Kubernetes Service)クラスターに「kvlnt/vv」という悪意あるDockerイメージを展開しました。このコンテナ化されたペイロードは、以下の3つの重要なコンポーネントを含むKali Linuxベースのイメージで構成されていました。

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

マルウェアのコンポーネントと展開

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

eBPFベースの高度なステルス機構

LinkProは、2つの異なるeBPFモジュールを利用した二重層の隠蔽戦略によって際立っています。LinkProは、共有ライブラリ、カーネルモジュール、そして2つのeBPFモジュール(「Hide」モジュールと「Knock」モジュール)の計4つのELFモジュールを組み込んでいます。

「Hide」モジュールによる隠蔽

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

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

eBPFが利用できない場合の代替ステルス機構

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

特に、libld.soのフックは、/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/