2023年5月10日

マルウェア「BPFDoor」が進化 - スニッフィングバックドアの機能を強化

BPFdoorとは?

BPFdoorは、既に侵害されたネットワークや環境において、持続的かつ長期的な足場を維持することを目的としたLinux固有のロープロファイルのパッシブバックドアで、主に侵害後の長期間にわたって、攻撃者が感染したシステムに再侵入できるようにするために機能しています。このマルウェアの名前は、Berkley Packet Filter を使用することから付けられました。このマルウェアは、受信トラフィックに対するファイアウォールの制限を回避し、指令を受け取り、検出を回避する非常にユニークな方法です。

このマルウェアは、中国の脅威アクターであるRed Menshen(aka Red Dev 18)に関連しているとされており、2021年以降、中東やアジア全域の通信プロバイダーや、政府、教育、物流分野の事業者を標的とすることが確認されています。

最初に発見されたのは約1年前で、BPFdoorはその効果的でエレガントなデザインと、検知されず長期的な持続性を維持するために不可欠な要素であるステルス性を高く重視していることが注目されました。

最近、Deep Instinctの脅威ラボは、これまで文書化されておらず、まったく検出されていないBPFdoorの新しい亜種を入手・分析しました。

よりステルス性を高めた新型

この新バージョンは、従来のバージョンと比較して、さらにステルス性を高めるために、以下のようないくつかの重要な違いがあります:

 “新しくステルスな” 2023年型“旧” 2022年型

暗号

スタティックライブラリ暗号化

RC4暗号化

コミュニケーション

リバースシェル

バインドシェルと iptables

コマンド

ハードコードされたコマンドはなく、すべてのコマンドはリバースシェルを介して送信

ハードコードされたコマンド

ファイル名

ハードコードされていない

ハードコードされている

以前の亜種と比較して最も大きな違いの1つは、ハードコードされたインジケーターの多くが削除されたことにあり、新しいバージョンの検出をより困難にしています。2023年2月にVirusTotalで初めて登録されて以来、この新しい亜種は検出されないままであり、この記事を書いている時点でも検出されていません。

BPFdoor のテクニカル分析

BPFdoorサンプルは、実行されると、”/var/run/initd.lock”にあるランタイムファイルの作成とロック取得を試み、そのファイルを仮のミューテックスとして使用して失敗すると終了します。

図1 - BPFdoorの”mutex”チェック

図1 - BPFdoorの”mutex”チェック

成功すると、BPFdoorは自身をフォークして子プロセスとして実行し続け、このコンテキストでstdin、stdout、stderrストリームを閉じ、以下のオペレーティングシステムのシグナルを無視するように自身をセットします:

シグナル番号シグナル名シグナル概要

1

SIGHUP

SIGHUP("signal hang-up")とは、制御端末のセッションが終了したときにプロセスに送られる信号のことですSIGINT(「シグナル・インタラプト」)とは、ユーザーがプログラムを中断したときに送られる信号(Ctrl + C)

2

SIGINT

SIGINT(「シグナル・インタラプト」)とは、ユーザーがプログラムを中断したときに送られる信号(Ctrl + C)

3

SIGQUIT

SIGQUITは、プロセスを終了させるために送信される信号

13

SIGPIPE

SIGPIPEは、パイプが破損したときに送られる信号

17

SIGCHLD

SIGCHLDは、子プロセスが終了するときに送られるシグナル

21

SIGTTIN

SIGTTINは、同じターミナルセッションから読み込もうとするプロセスに送る信号で、ブロックされる

23

SIGTTOU

SIGTTOUは、同じ端末セッションに書き込もうとするプロセスに送られる信号で、ブロックされる

これらのシグナルを無視することで、BPFdoorのプロセスに対する改ざんを防ぐことができます。

以上のように設定したBPFdoorは、次に以下のようにメモリバッファを確保し、ソケットを作成します:

Figure 2 - Socket arguments
図2 - ソケットの引数

Figure 3 - Socket creation
図3 - ソケットの作成

setsockoptを使用して、以下のソケットオプションの指定に進みます:

Figure 4 - Setsockopt options
図4 - setsockoptのオプション

Figure 5 - Call to setsockopt
図5 - setsockoptの呼び出し

そして、recvfromを使用して、ループ(さらに後述します)でそこから読み取ります:

Figure 6 - Recvfrom arguments
図6 - Recvfromの引数

Figure 7 - Recvfrom call

図7 - Recvfromコール

上記のフローで興味深い点は、recvfromの呼び出しで "addr" パラメータがゼロになっていることです。ソケットは接続されておらず、bindやlistenの呼び出しも行われていません。一体、ここで何が行われているのでしょうか?

ソケットを作成するために使用される正確な引数を解釈すると、この呼び出しは次のような構造になっていることがわかります:

Figure 8 - Socket call

図8 - ソケットの呼び出し

これは、特定のプロトコルに縛られることなく、イーサネット層以上からマシンに送信されるすべてのパケットを読むことができる特別なパケットスニッフィングソケットとしてソケットを作成します。

BPFdoorでは、このようなパケットスニッフィングソケットを利用して、addrパラメータがなくても、以下のループを使って特定の「マジック」バイト列を検索し、recvfromでデータを読み込んでいます:

Figure 9 - Looped search for

図9 -「マジック」バイト列のループ検索(ハイライト表示)

「マジック」バイト列: \x44\x30\xCD\x9F\x5E\x14\x27\x66

これが見つかると、ループが切れて、BPFdoorは次のフェーズに進むことができます。

しかし、これではBPFdoorが通過しなければならないトラフィックがかなり多くなってしまう。

setsockoptの使い方をもう少し詳しく調べてみましょう。その引数を解析すると、次のようなコードにたどり着きます:

Figure 10 - Setsockopt attaches BPF
図10 - SetsockoptがBPFをアタッチ

これが、BPFdoorの名前の由来です。上記のコードは、ソケットに Berkley Packet Filter をアタッチしています。これは、libpcapのような情報セキュリティの定番を支える仕組みと全く同じで、BPFdoorがソケットから送られてくる「興味のない」タイプのデータをフィルタリングすることを可能にします。

Berkley Packet Filterは以下の例のように定義することができ、IPv4上のTCPを許可します:

Figure 11 - BPF example

図 11 - BPF の例

ソケットオプションSO_ATTACH_FILTERを設定し、フィルターを以下のsock_filter_codeに向けることです:

Figure 12 - BPF sock_filter_code

図12 - BPF sock_filter_code

BPFdoor は、ポート 22(ssh)、80(http)、443(https)を経由する UDP、TCP、SCTP トラフィックのみを読み込むように、カーネルを誘導してそのソケットをセットアップします。

BPFdoorはこのような低レイヤーに位置するため、ファイアウォールのルールには従わず、受信トラフィックに関するファイアウォールの制限をバイパスして、マシンのユーザーモードに浮上することのないパケットをリスニングすることができます。

BPFdoorは、フィルタリングされたトラフィックの中に「マジック」バイトを含むパケットを見つけると、それをオペレータからのメッセージとして扱い、2つのフィールドを解析して再び自身をフォークします。

親プロセスはソケットを通過するフィルタリングされたトラフィックを監視し続け、子プロセスは以前に解析されたフィールドをコマンド&コントロールのIP-ポートの組み合わせとして扱い、それにコンタクトしようとします。

Figure 13 - Connect to Command & Control

図13 - Command & Controlへの接続

BPFdoorのこの亜種には、オープンソースの暗号化ライブラリである libtomcryptのプリコンパイルバージョンが含まれていることが、サンプルの含まれる文字列で確認できます:

Figure 14 - Contained strings

図14 - 含まれる文字列

このライブラリは、Red Hat Linuxが動作するシステム上でGCCを使用して2022年10月初旬にコンパイルされたことがわかります。このことは、この亜種がVirusTotalに初めて登場するよりもかなり早い時期に運用されていたことを示唆しています。

私たち自身のバージョンのライブラリを同様の方法でコンパイルし、bindiffを使用してBPFdoorと比較することで、静的にリンクされたエクスポートを確認することができました:

Figure 15 - Libtomcrypt bindiff snippet
図15 - Libtomcrypt bindiff snippet

比較した結果、BPFdoor は libtomcrypt の機能を使って、コマンド&コントロールと安全で暗号化された「リバースシェル」セッションをセットアップしていると判断しました。これは、以前のメカニズムに取って代わるものです。

このセッションが確立された後、BPFdoorは以下のようなループ動作を開始します:

結論

BPFdoorは、この最新のアップデートにより、非常にステルス性が高く、検出が困難なマルウェアとしての評判を維持しています。

暗号化ライブラリのコンパイル時期(2022年10月)とVirusTotalへの最初の投稿(2023年2月)のどちらを、このサンプルが最初に使用された時期を示すものとして考えるかは別として、現時点でも主要セキュリティ製品からまったく検出されないままであることは、本当に驚くべきことです。

Figure 16 & 17 - 0 VirusTotal detections, 7 different scans.

図16・17 - VirusTotalの検出数0、7種類のスキャン

IOCs

afa8a32ec29a31f152ba20a30eb483520fe50f2dce6c9aa9135d88f7c9c511d7 – BPFDoor ELF SHA256
/var/run/initd.lock – BPFDoor "mutex”

MITRE ATT&CK:

タクティクステクニック概要オブザーバブル

コマンド&コントロール
防衛回避
持続性

T1205 - トラフィック・シグナリング

攻撃者は、反応を引き起こすために「マジック」値を使用

マジックバイト列

コマンド&コントロール
防衛回避
持続性

T1205.002 - トラフィックシグナリング: ソケットフィルター

攻撃者は、ネットワークソケットにフィルタを装着

バークレーパケットフィルターの使用方法

コマンド&コントロール

T1573 - 暗号化されたチャンネル

攻撃者は暗号化された Command & Control通信を使用

libtomcryptの使用方法

エグゼキューション

T1106 – Native API

攻撃者は、OSのネイティブAPIを呼び出して動作を実行

ポペンの使用法

同様の亜種の解析:
https://www.elastic.co/security-labs/a-peek-behind-the-bpfdoor

Deep Instinctは、世界初で唯一の専用に構築されたディープラーニングのサイバーセキュリティフレームワークを使用して、ランサムウェアやその他のマルウェアを阻止する予防第一のアプローチをとります。ランサムウェア、ゼロデイ脅威、および未知のマルウェアを、ランサムウェアが暗号化できる最速の速度よりも750倍速い20ミリ秒未満で防止します。Deep Instinctは99%以上のゼロデイ精度を持ち、<0.1%の誤検出率を約束します。Deep Instinct Prevention Platformは、ハイブリッド環境における脅威に対する完全で多層的な保護を提供する、あらゆるセキュリティスタックに不可欠な追加機能です。