BPF(eBPFではない)Doorを使ったファイアウォールの破壊をFalcoで検出する方法

By 清水 孝郎 - JUNE 9, 2022

SHARE:

本文の内容は、2022年6月9日にNicholas Langが投稿したブログ(https://sysdig.com/blog/bpfdoor-falco-detection/)を元に日本語に翻訳・再構成した内容となっております。

BPF(eBPFではない)は、一般的に防御者/システム管理者の視点から見ると、ネットワークパケットに簡単にアクセスでき、(ローカル)ファイアウォールに到達する前に、カスタムフィルターに基づいて書かれたプログラムによってアクションを起こす能力を提供するものです。この同じ力は、PWCのレポートと懸案のカンファレンス講演によると、Red Menshenという脅威アクターによって活用されており、攻撃者は少なくとも2018年から現在に至るまでBPFDoorのテクニックを使って侵害されたデバイスへのステルスリモートアクセスを獲得してきました。

How to detect BPFDoor with FalcoFalcoでBPFDoorを検出する方法

防御者は、BPFフィルターを設定するためにはルートアクセスが必要であることに注意する必要がありますが、Local Privilege Escalation exploitがますます利用可能になっている世界では、これはかつてのような侵入障壁ではありません。

この記事では、BPFとは何か何をするのか、そしてRed Menshenが強力なシステムイントロスペクションツールを極めてステルス性の高いバックドアに変えるために、どのように使用したのかを要約して説明します。

BPFのブレイクダウン

バークレーパケットフィルター(およびその頭文字でない子孫のeBPF)は、ここ数ヶ月で多くの報道を受けるようになりましたが、これは最近の技術ではありません。オリジナルのUSENIXの論文では、「BPFは、データリンク層に対してrawインタフェースを提供し、リンク層のrawパケットの送受信を可能にします。」と説明されています。

BPFはパケットのフィルタリングをサポートし、 ユーザースペースプロセスが受信したいパケットを指定するフィルタープログラムを提供することを可能にします。たとえば、tcpdump プロセスは、TCP 接続を開始するパケットだけを受け取りたいと思うかもしれません。BPFは、プロセスが供給するフィルターを通過したパケットのみを返します。

Red Menshenのブレークダウン

Red Menshenは、中国に拠点を置く組織的な脅威集団で、月曜日から金曜日のUTC1:00から10:00の間に規則的な作業時間を観測しています。Red Menshenは、PwCによって出回っている所を発見された主なBPFDoorペイロードの背後にいるアクターとして特定されましたが、Pangu Labが最初にこの技術を特定し、2013年の分析中に米国のEquation Groupに起因するものだとしました。PwCは、アジア全域の電気通信、政府、教育セクターの被害者を特定することができました。そして、前述の被害者に関連するネットワークテレメトリーを分析し、台湾で数百台の感染した疑いのあるルーターを発見し、脅威要因のインフラへのアクセスやWebブラウジングのためのプロキシとして使用されていることを確認しました。

BPFDoor BPFバイトコードの説明

リンク先は、BPFDoorが使用するBPFのディスアセンブルされ、コメントされたバイトコードです。Sandfly Securityに感謝します。
以下は、BPFDoor が使用する (BP) フィルターの擬似コードです。”return false” はパケットがマッチしないことを意味し、”return true” はパケットがマッチすることを意味します。

if (EtherType == IPv4) {
    if (Packet is an additional piece of a fragmented packet)
    {
        return false;
    }
    else
    {
        if (Protocol == UDP && data[0:2] == 0x7255)
        {
            return true;
        }
        else if (Protocol == ICMP && data[0:2] == 0x7255 && ICMP Type == Echo Request)
        {
            return true;
        }
        else if (Protocol == TCP && data[0:2] == 0x5293)
        {
            return true;
        }
        else {return false;} //ipv4 packet, not our magic tcp/icmp/udp
    }
}
// Not ipv4 packet
else {return false;}

上記の疑似コードを一言で言うと、もし私たちが「魔法の」パケット(packet data[0:2] == 0x7255(UDP/ICMP) または 0x5293(TCP) を受け取った場合、それをバックドアプログラムに渡してさらに解析してもらいます。

パスワード認証の後、バックドアは有効な「マジックパケット」を受け取ったと仮定して、3つのアクションのうち1つを実行します。

BPFDoor pseudocodeBPFDoor 擬似コード

  • ケース 1 は getshell で、iptables を使って、トラフィックを TCP バインドシェルにリダイレクトする一時的なファイアウォール規則を作成し、その後、接続を受けるとこれらの規則を削除します。これは、Linux iptables の状態追跡により、規則自体が削除されても、既存の接続に対してその規則の効果が維持されるからです。
  • ケース0はシェルで、バックドアは伝統的なリバースシェルを試み、マジックパケットのソースにコールバックします。
  • 最後のケース2、monは、単なるpingまたは生存確認で、バックドアがマジックパケットの送信者に、我々が稼働していることを報告します。

FalcoによるBPFDoorの検出

NC connection via BPFDoor
ファイアウォール前の、ホスト間のネットワーク接続性
BPFDoor network connection
ターゲットシステム上で動作しているBPFDoorインプラント(SOCK_RAWはBPFのあるソケットです)
BPFDoor detection with scanner
bpfdoor-scannerが実行中のbpfdoorインスタンスを検出する。


ほとんどのランタイムエージェントは、BPFを適用するのに必要なのと同じ特権レベル(root)で動作するため、BPFDoorのランタイム検出は困難です。

しかし、CNCFのインキュベートプロジェクトであるFalcoを使えば、検出は可能です。Falcoは、クラウドネイティブ環境において、ランタイムで異常な実行を検出するオープンソースツールです。

このルールは、BPFDoor(またはリストにある例外を除いた他のプログラム)が正常にsetsockoptシステムコールを使用してBPFをアタッチしたときにトリガーされます。

- rule: Possible Backdoor using BPF
  desc: A process was seen using BPF on a network socket, this could indicate packet sniffing for use in a backdoor such as BPFDoor. Network diagnostic tools may also trigger this rule.
  condition: "evt.type=setsockopt and evt.dir=< and evt.rawres=0 and evt.arg[3]=SO_ATTACH_FILTER"
  exceptions:
  - name: proc_names
    fields: proc.name
    comps: in
    values: ["tcpdump"]
  output: Possible BPFDoor Attempt Detected (proc.cmdline=%proc.cmdline port=%fd.sport domain=%fd.sip.name image=%container.image.repository)
  priority: WARNING
  tags: [network]

まとめ

予防の観点から、ホストバイナリーから特定の Linux システム機能 (cap_new_raw, cap_net_bind_service) を削除することは、非 root ユーザーとして実行された場合に BPFDoor が適切に機能するのを防ぐことができます。しかし、ルートユーザーとして実行されることを想定しているため、これらの緩和は効果がありません。

どのユーザも raw ソケット上のパケットをキャプチャーできないようにするために、AppArmor プロファイルを使用することができます。



その後、もしFalcoについてもっと知りたいのであれば: