BPF程序類型
BPF沒有明確的分類,可以將其分為兩類:
跟蹤
提供系統行為及系統硬件的直接信息。也可以訪問特定程序的內存區域,從運行進程中提取執行跟蹤信息,還可以訪問進程分配的特定資源,文件描述符、cpu、內存。
網絡
檢測和控制系統的網絡流量。可以對網絡接口數據包進行過濾,甚至可以完全拒絕數據包。
BPF程序可以附加到網絡驅動程序接收數據包的網絡事件中,也可以附加到數據包傳遞給用戶空間的網絡事件。
man bpf 獲得更多知識:
各種類型添加到內核的時間順序來進行介紹:
參考://github.com/DavadDi/bpf_study/blob/5d30702c6c1eb884326d933c401c162163d85936/bpf-prog-type.md#bpf-程序類型支持-helper-函數列表
- 套接字過濾器程序
BPF_PROG_TYPE_SOCKET_FILTER類型用于訪問所有套接字處理的數據包,只能用于觀測,不能修改數據包的內容或者更改目的地。
BPF_PROG_TYPE_SOCKET_FILTER:
BPF_FUNC_skb_load_bytes()
BPF_FUNC_skb_load_bytes_relative()
BPF_FUNC_get_socket_cookie()
BPF_FUNC_get_socket_uid()
BPF_FUNC_perf_event_output()
Base functions
- kprobe程序
kprobe是動態附加到內核調用點的函數。bpf虛擬機總是確kprobe能夠安全的運行,但是內核kprobe被認為是不穩定的入口點,需要確定程序是否與內核相兼容。
BPF_PROG_TYPE_KPROBE:
BPF_FUNC_perf_event_output()
BPF_FUNC_get_stackid()
BPF_FUNC_get_stack()
BPF_FUNC_perf_event_read_value()
BPF_FUNC_override_return()
Tracing functions
如果需要檢查exec系統調用的返回值,需要BPF程序設置sec頭部,SEC("kretprobe/sys_exec")
- 跟蹤點程序
跟蹤點程序會俯角到內核提供的跟蹤點處理程序上。是內核代碼的靜態標記,允許注入跟蹤和調試相關的任意代碼。可以編寫一個BPF程序來檢查其他BPF程序的行為。
BPF_PROG_TYPE_TRACEPOINT:
BPF_FUNC_perf_event_output()
BPF_FUNC_get_stackid()
BPF_FUNC_get_stack()
Tracing functions
- XDP程序
當網絡包到達內核時,xdp程序會在早起被執行, 此時,內核還沒有對數據包本身進行太多的處理,所以數據包的信息展示有限,但是具有更高級別的控制。
BPF_PROG_TYPE_XDP:
BPF_FUNC_perf_event_output()
BPF_FUNC_get_smp_processor_id()
BPF_FUNC_csum_diff()
BPF_FUNC_xdp_adjust_head()
BPF_FUNC_xdp_adjust_meta()
BPF_FUNC_redirect()
BPF_FUNC_redirect_map()
BPF_FUNC_xdp_adjust_tail()
BPF_FUNC_fib_lookup()
Base functions
- perf 事件程序
將bpf代碼附加到perf事件上,使用perf事件程序監控很多系統信息。
BPF_PROG_TYPE_PERF_EVENT:
BPF_FUNC_perf_event_output()
BPF_FUNC_get_stackid()
BPF_FUNC_get_stack()
BPF_FUNC_perf_prog_read_value()
Tracing functions
- cgroup套接字程序
該程序允許cgroup在其包含的進程中控制網絡流量。在傳入cgroup控制之前,通過cgroup套接字程序,可以決定如何處理這些數據包。cilium使用cgroup套接字程序將策略應用進程組上,而不是在隔離的容器上。
BPF_PROG_TYPE_CGROUP_SKB:
BPF_FUNC_skb_load_bytes()
BPF_FUNC_skb_load_bytes_relative()
BPF_FUNC_get_socket_cookie()
BPF_FUNC_get_socket_uid()
Base functions
- cgroup 打開套接字程序
允許cgroup內的任何進程打開網絡套接字時執行代碼。可以對打開套接字程序組提供安全性和訪問控制,而不必單獨限制每個進程的功能。
BPF_PROG_TYPE_CGROUP_SOCK :
BPF_FUNC_get_current_uid_gid()
Base functions
- 套接字選項程序
允許運行時修改套接字鏈接選項,可以訪網絡IP地址和鏈接端口之類的數據,并且還可以修改鏈接選項,設置超時,以及更改給定數據包往返延遲時間。
BPF_PROG_TYPE_SOCK_OPS :
BPF_FUNC_setsockopt()
BPF_FUNC_getsockopt()
BPF_FUNC_sock_ops_cb_flags_set()
BPF_FUNC_sock_map_update()
BPF_FUNC_sock_hash_update()
BPF_FUNC_get_socket_cookie()
Base functions
- 套接字映射程序
套接字映射可以保留對一些套接字的引用。使用這些引用和特性的幫助函數將套接字的數據包重定向到其他的套接字。以下兩個項目是使用此功能,實現負載均衡等。
//github.com/cilium/cilium.git
//github.com/facebookincubator/katran.git
BPF_PROG_TYPE_SK_SKB :
BPF_FUNC_skb_store_bytes()
BPF_FUNC_skb_load_bytes()
BPF_FUNC_skb_pull_data()
BPF_FUNC_skb_change_tail()
BPF_FUNC_skb_change_head()
BPF_FUNC_get_socket_cookie()
BPF_FUNC_get_socket_uid()
BPF_FUNC_sk_redirect_map()
BPF_FUNC_sk_redirect_hash()
BPF_FUNC_sk_lookup_tcp()
BPF_FUNC_sk_lookup_udp()
BPF_FUNC_sk_release()
Base functions
- cgroup 設備程序
決定是否能夠給定設備上執行cgroup中的操作。cgroups(v1)的第一個實現允許為特定設備設置權限。但是第二個迭代中缺少了這個功能。
BPF_PROG_TYPE_CGROUP_DEVICE :
BPF_FUNC_map_lookup_elem()
BPF_FUNC_map_update_elem()
BPF_FUNC_map_delete_elem()
BPF_FUNC_get_current_uid_gid()
BPF_FUNC_trace_printk()
- 套接字消息傳遞程序
控制是否將消息發送到套接字。
BPF_PROG_TYPE_SK_MSG :
BPF_FUNC_msg_redirect_map()
BPF_FUNC_msg_redirect_hash()
BPF_FUNC_msg_apply_bytes()
BPF_FUNC_msg_cork_bytes()
BPF_FUNC_msg_pull_data()
BPF_FUNC_msg_push_data()
BPF_FUNC_msg_pop_data()
Base functions
- 原始跟蹤點程序
程序能夠提供內核執行任務的更多信息,但是會有少許性能開銷。
BPF_PROG_TYPE_RAW_TRACEPOINT :
BPF_FUNC_perf_event_output()
BPF_FUNC_get_stackid()
BPF_FUNC_get_stack()
BPF_FUNC_skb_output()
Tracing functions
- cgroup套接字地址程序
允許cgroup控制的用戶控件程序的IP地址和端口號。當系統使用多個IP時,可以確保一組特定的用戶控件程序使用相同的IP地址和端口。
BPF_PROG_TYPE_CGROUP_SOCK_ADDR :
BPF_FUNC_get_current_uid_gid()
BPF_FUNC_bind()
BPF_FUNC_get_socket_cookie()
Base functions
- 套接字重用端口程序
允許相同的主機上多個進程綁定相同的端口。在高并發情況下,我們可以使用多個線程處理負載。
BPF_PROG_TYPE_SK_REUSEPORT :
BPF_FUNC_sk_select_reuseport()
BPF_FUNC_skb_load_bytes()
BPF_FUNC_load_bytes_relative()
Base functions
- 流量解析程序
跟蹤網絡數據包經過不同的層,從網絡數據包到達系統再到數據包發送給用戶空間程序。將程序裸機掛鉤到流量解析器的路徑上,提供了內置解析器沒有的安全保證。
BPF_PROG_TYPE_FLOW_DISSECTOR :
BPF_FUNC_skb_load_bytes()
Base functions
- 其他
BPF_PROG_TYPE_LWT_SEG6LOCAL :
BPF_FUNC_lwt_seg6_store_bytes()
BPF_FUNC_lwt_seg6_action()
BPF_FUNC_lwt_seg6_adjust_srh()
LWT functions
BPF_PROG_TYPE_LIRC_MODE2 :
BPF_FUNC_rc_repeat()
BPF_FUNC_rc_keydown()
BPF_FUNC_rc_pointer_rel()
BPF_FUNC_map_lookup_elem()
BPF_FUNC_map_update_elem()
BPF_FUNC_map_delete_elem()
BPF_FUNC_ktime_get_ns()
BPF_FUNC_tail_call()
BPF_FUNC_get_prandom_u32()
BPF_FUNC_trace_printk()
BPF_PROG_TYPE_LWT_IN :
BPF_FUNC_lwt_push_encap()
LWT functions
Base functions
BPF_PROG_TYPE_LWT_OUT :
LWT functions
Base functions
BPF_PROG_TYPE_LWT_XMIT :
BPF_FUNC_skb_get_tunnel_key()
BPF_FUNC_skb_set_tunnel_key()
BPF_FUNC_skb_get_tunnel_opt()
BPF_FUNC_skb_set_tunnel_opt()
BPF_FUNC_redirect()
BPF_FUNC_clone_redirect()
BPF_FUNC_skb_change_tail()
BPF_FUNC_skb_change_head()
BPF_FUNC_skb_store_bytes()
BPF_FUNC_csum_update()
BPF_FUNC_l3_csum_replace()
BPF_FUNC_l4_csum_replace()
BPF_FUNC_set_hash_invalid()
LWT functions
BPF_PROG_TYPE_SCHED_CLS 、 BPF_PROG_TYPE_SCHED_ACT :
BPF_FUNC_skb_store_bytes()
BPF_FUNC_skb_load_bytes()
BPF_FUNC_skb_load_bytes_relative()
BPF_FUNC_skb_pull_data()
BPF_FUNC_csum_diff()
BPF_FUNC_csum_update()
BPF_FUNC_l3_csum_replace()
BPF_FUNC_l4_csum_replace()
BPF_FUNC_clone_redirect()
BPF_FUNC_get_cgroup_classid()
BPF_FUNC_skb_vlan_push()
BPF_FUNC_skb_vlan_pop()
BPF_FUNC_skb_change_proto()
BPF_FUNC_skb_change_type()
BPF_FUNC_skb_adjust_room()
BPF_FUNC_skb_change_tail()
BPF_FUNC_skb_get_tunnel_key()
BPF_FUNC_skb_set_tunnel_key()
BPF_FUNC_skb_get_tunnel_opt()
BPF_FUNC_skb_set_tunnel_opt()
BPF_FUNC_redirect()
BPF_FUNC_get_route_realm()
BPF_FUNC_get_hash_recalc()
BPF_FUNC_set_hash_invalid()
BPF_FUNC_set_hash()
BPF_FUNC_perf_event_output()
BPF_FUNC_get_smp_processor_id()
BPF_FUNC_skb_under_cgroup()
BPF_FUNC_get_socket_cookie()
BPF_FUNC_get_socket_uid()
BPF_FUNC_fib_lookup()
BPF_FUNC_skb_get_xfrm_state()
BPF_FUNC_skb_cgroup_id()
Base functions
BPF能夠允許任何人在linux內核中執行任意代碼,那么安全性怎么保證呢?
CVE-2017-16995 //cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-16995