【BPF 攻防系列 - 1】開戰!!!
在近幾年來,eBPF 在 Linux 社區和之外得到了越來越多的關注。
eBPF 在攻擊場景中的使用也逐漸引起大家的關注。因此,我決定從紅隊的角度進入深入探討,以讓大家對此有個整體的認識,以下系列文章則是對於這個歷程的分享。
offensive-bpf
與我此前的 機器學習攻防系列 [1] 的形式類似,本站將會提供一系列圍繞 BPF 在攻擊環境中使用的樣例,這也包括如何檢測 BPF 被濫用的內容。
點擊 ebpf[2] 標籤可以看到所有相關的內容。
至此,讓我們開始吧。
- 什麼是 BPF (Berkeley Packet Filtering)
經典 BPF(cBPF) 允許用戶空間程序(例如 tcpdump
)設置過濾器抓取符合條件的網絡數據包。真正執行的過濾在在內核中進行,這種方式極大地提高了性能,因爲僅需要將過濾後的數據報文複製到用戶空間。
eBPF
則是在 cBPF 的技術上將其擴展爲了一種用戶跟蹤和 hook 的通用技術。
eBPF 可安全高效地擴展內核的功能,而無需修改內核源代碼或加載內核模塊。(ebpf.io)
當前,當我們談論 BPF 時,通常指的是 eBPF(而不是 cBPF ),所以爲了方便,後續將只使用 BPF 這個術語。
BPF 允許用戶編寫程序,在內核的沙盒中運行。
- BPF 使用場景
BPF 程序可在內核或用戶空間的任何地方觸發執行,當前甚至可以直接卸載到網卡上運行。
ebpio-overview
注:原始圖片來自 https://ebpf.io,有修改
在安全中的攻擊性場景下,能夠將 BPF 程序卸載到網卡上執行是一件非常 有意義的事情。這意味着 BPF 在網卡上運行,只將過濾後的數據包傳遞到內核執行。
BPF 技術核心使用場景是跟蹤、可觀察性、性能分析和安全等方面。
許多最新的檢測、監控軟件和性能跟蹤工具都是基於 BPF 技術,在雲原生環境中,BPF 被大量採用(例如 Cilium[3])。
2.1 BPF 程序,map 和事件
BPF 基礎能力就一組核心技術組成。
prog.map.events
這些組成包括:
-
BPF 程序:通常用 C 語言編寫,並可翻譯成 BPF 字節碼,並 JIT 成機器本地指令。【備註:原文有誤,已修訂】
-
map:用於內核和用戶空間通信的雙向數據結構。
-
事件(Event):BPF 基於事件觸發運行,(例如,內核函數的進入 / 退出)。
BPF 程序允許我們在內核空間中運行編寫的程序。這種方式與靈活的輕量級內核模塊類似,但與內核模塊相比,BPF 運行的機制具有更高的可靠性保證。
專用驗證器(Verifier)確保 BPF 程序運行是穩定的,不會使操作系統崩潰。
2.2 BPF 程序加載
特權用戶通過使用 bpf()
系統調用將 BPF 程序加載到內核。對於大多數 BPF 程序類型(參見 附錄 [4])運行都需要需要 root
或 CAP_BPF
能力。程序的加載過程大致如下:
-
加載:用戶空間程序在
bpf()
系統調用中使用BPF_PROG_LOAD
參數加載程序(如需要,還可以創建 map)。 -
配置:用戶空間程序將 BPF 程序與事件 / 探測關聯。例如,通過
ioctl()
調用(例如PERF_EVENT_IOC_SET_BPF
)。 -
執行:當對應觸發事件時,BPF 程序都將在指定的上下文中運行!
上述的這些能力爲開發人員(和攻擊者)提供了極大的靈活性和能力。
非持久性: BPF 程序並不是持久化的,在機器在重啓必須再次啓動。
- 攻防 BPF - 另外的使用場景!
obpf
從非安全角度來看,BPF 程序具有超能力,這非常有趣。據我目前所知,它們可以:
-
hook 系統調用和用戶空間函數調用
-
操作用戶空間數據結構
-
覆蓋系統調用返回值
-
調用
system()
生成新進程(bpftrace
內置特性) -
某些 BPF 程序可以卸載到硬件設備(如網卡)
-
能夠針對 BPF 代碼的產生鏈式攻擊
-
與安全和檢測工具混合(例如,通過 hook
bpf
調用本身)
BPF 攻擊程序可能會作爲 rootkit 安裝在機器上,並且 BPF 也可被用來突破容器限制。這非常令人興奮,還有一些很好的場景來執行紅隊行動,以幫助其加強意識和提升檢測能力。
- 入門
使用 BPF 技術有三個等級:
-
第一等級:利用現有的 BPF 程序,例如,有
sslsniff-bpcc
。 -
第二等級:編寫少量代碼的程序並使用
bpftrace
運行它們。 -
第三等級:使用
libbpf
和其他較低級別的框架編寫更復雜的程序。通過clang
等工具編譯成 BPF 字節碼。
當然,你也可以直接使用提供的工具編寫 BPF 字節碼,這可能是第四等級。
我的目標是更詳細地探索其中的每一等級(部分我已經探索過),並展示相關的成功和學習心得。
- 學習資源
在結束這篇開始的文章時,我想介紹一下我用來入門最有用的資源。對於一般的 BPF 信息、示例代碼和代碼片段,我發現 Liz Rice 和 Brendan Gregg 的教程非常有用 -- 這些教程可以快速幫助你理解 BPF 能做什麼,以及其是如何被用來做有意義的事情。
-
eBPF 編程初學者指南 [5],Liz Rice GOTO 2021
-
Netflix 的 BPF 性能分析 [6],Bredan Gregg,2019 年
在進階方面,內容還不多,但這 3 個教程的質量很高:
-
DEFCON 29 - eBPF, I thought we were friends[7],Guillaume Foundier 等人。
-
DEFCON 29 - Warping Reality[8],@pathtofile
-
DEFCON 27 - Evil eBPF[9] Jeff Dileo,NCC Group 2019
上述這些教程都提供了很好的見解,而且內容豐富。
- 資源
-
BPF syscall[10]
-
BPF 內核文檔 [11]
-
Cilium[12]
-
epbf.io[13]
- 附錄 [14]
BPF 程序有諸多不同的程序類型,如 TRACEPOINT、KPROBE、XDP、PERF_EVENT。
部分特定類型的程序可以由低權限的用戶運行。
部分可有權限用戶運行的程序類型 [15]:
-
BPF_PROG_TYPE_SOCKET_FILTER
-
BPF_PROG_TYPE_CGROUP_SKB
要查看是否啓用 / 禁用了非特權 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