【BPF 攻防系列 - 1】開戰!!!

在近幾年來,eBPF 在 Linux 社區和之外得到了越來越多的關注。

eBPF 在攻擊場景中的使用也逐漸引起大家的關注。因此,我決定從紅隊的角度進入深入探討,以讓大家對此有個整體的認識,以下系列文章則是對於這個歷程的分享。

offensive-bpf

與我此前的 機器學習攻防系列 [1] 的形式類似,本站將會提供一系列圍繞 BPF 在攻擊環境中使用的樣例,這也包括如何檢測 BPF 被濫用的內容。

點擊  ebpf[2] 標籤可以看到所有相關的內容。

至此,讓我們開始吧。

  1. 什麼是 BPF (Berkeley Packet Filtering)

經典 BPF(cBPF) 允許用戶空間程序(例如 tcpdump)設置過濾器抓取符合條件的網絡數據包。真正執行的過濾在在內核中進行,這種方式極大地提高了性能,因爲僅需要將過濾後的數據報文複製到用戶空間。

eBPF 則是在 cBPF 的技術上將其擴展爲了一種用戶跟蹤和 hook 的通用技術。

eBPF 可安全高效地擴展內核的功能,而無需修改內核源代碼或加載內核模塊。(ebpf.io)

當前,當我們談論 BPF 時,通常指的是 eBPF(而不是 cBPF ),所以爲了方便,後續將只使用 BPF 這個術語。

BPF 允許用戶編寫程序,在內核的沙盒中運行。

  1. BPF 使用場景

BPF 程序可在內核或用戶空間的任何地方觸發執行,當前甚至可以直接卸載到網卡上運行。

ebpio-overview

注:原始圖片來自 https://ebpf.io,有修改

在安全中的攻擊性場景下,能夠將 BPF 程序卸載到網卡上執行是一件非常 有意義的事情。這意味着 BPF 在網卡上運行,只將過濾後的數據包傳遞到內核執行。

BPF 技術核心使用場景是跟蹤、可觀察性、性能分析和安全等方面。

許多最新的檢測、監控軟件和性能跟蹤工具都是基於 BPF 技術,在雲原生環境中,BPF 被大量採用(例如 Cilium[3])。

2.1 BPF 程序,map 和事件

BPF 基礎能力就一組核心技術組成。

prog.map.events

這些組成包括:

BPF 程序允許我們在內核空間中運行編寫的程序。這種方式與靈活的輕量級內核模塊類似,但與內核模塊相比,BPF 運行的機制具有更高的可靠性保證。

專用驗證器(Verifier)確保 BPF 程序運行是穩定的,不會使操作系統崩潰。

2.2 BPF 程序加載

特權用戶通過使用 bpf() 系統調用將 BPF 程序加載到內核。對於大多數 BPF 程序類型(參見 附錄 [4])運行都需要需要 rootCAP_BPF 能力。程序的加載過程大致如下:

上述的這些能力爲開發人員(和攻擊者)提供了極大的靈活性和能力。

非持久性:  BPF 程序並不是持久化的,在機器在重啓必須再次啓動。

  1. 攻防 BPF - 另外的使用場景!

obpf

從非安全角度來看,BPF 程序具有超能力,這非常有趣。據我目前所知,它們可以:

BPF 攻擊程序可能會作爲 rootkit 安裝在機器上,並且 BPF 也可被用來突破容器限制。這非常令人興奮,還有一些很好的場景來執行紅隊行動,以幫助其加強意識和提升檢測能力。

  1. 入門

使用 BPF 技術有三個等級:

當然,你也可以直接使用提供的工具編寫 BPF 字節碼,這可能是第四等級。

我的目標是更詳細地探索其中的每一等級(部分我已經探索過),並展示相關的成功和學習心得。

  1. 學習資源

在結束這篇開始的文章時,我想介紹一下我用來入門最有用的資源。對於一般的 BPF 信息、示例代碼和代碼片段,我發現 Liz RiceBrendan Gregg 的教程非常有用 -- 這些教程可以快速幫助你理解 BPF 能做什麼,以及其是如何被用來做有意義的事情。

在進階方面,內容還不多,但這 3 個教程的質量很高:

上述這些教程都提供了很好的見解,而且內容豐富。

  1. 資源

  1. 附錄 [14]

BPF 程序有諸多不同的程序類型,如 TRACEPOINT、KPROBE、XDP、PERF_EVENT。

部分特定類型的程序可以由低權限的用戶運行。

部分可有權限用戶運行的程序類型 [15]:

要查看是否啓用 / 禁用了非特權 BPF,可通過執行以下命令查看:

cat /proc/sys/kernel/unprivileged_bpf_disabled

也可如下命令進行禁用 :

sudo sysctl kernel.unprivileged_bpf_disabled=1

原文鏈接:offensive-bpf[16]

作者:wunderwuzzi

發佈時間:2021 年 9 月 30 號

參考資料

[1]

機器學習攻防系列 : https://embracethered.com/blog/posts/2020/machine-learning-attack-series-overview/

[2]

ebpf: https://embracethered.com/blog/tags/ebpf

[3]

Cilium: https://docs.cilium.io/en/v1.8/intro/

[4]

附錄 : #appendix

[5]

eBPF 編程初學者指南 : https://www.youtube.com/watch?v=uBqRv8bDro

[6]

Netflix 的 BPF 性能分析 : https://www.youtube.com/watch?v=16slh29iN1g

[7]

DEFCON 29 - eBPF, I thought we were friends: https://www.youtube.com/watch?v=5zixNDolLrg

[8]

DEFCON 29 - Warping Reality: https://www.youtube.com/watch?v=g6SKWT7sROQ

[9]

DEFCON 27 - Evil eBPF: https://www.youtube.com/watch?v=yrrxFZfyEsw

[10]

BPF syscall: https://www.kernel.org/doc/html/latest/userspace-api/ebpf/syscall.html

[11]

BPF 內核文檔 : https://www.kernel.org/doc/html/latest/bpf/index.html

[12]

Cilium: https://docs.cilium.io/en/v1.8/intro/

[13]

epbf.io: https://ebpf.io/

[14]

附錄 : #appendix

[15]

部分可有權限用戶運行的程序類型 : https://elixir.bootlin.com/linux/latest/source/kernel/bpf/syscall.c#L2134

[16]

offensive-bpf: https://embracethered.com/blog/posts/2021/offensive-bpf/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3iqq9QtV1ekdr0ZWf_BLTA