Berkeley Packet Filters (BPF) แแบแแถแแ
แแ
แแแแทแแแแถแแบแแแแแธแแปแ
แแแแแถแแแ
แแพแแแแแแแปแแแแแถแแแแแแปแแแแแแแถแแแ
แแ
แแแแทแแแแถแแถแแถแแถแขแแแแแแแแขแแแแแแแแแแถแ
แแแพแแแแแถแแแแ แพแแ แแแแแทแแธแแแแแผแแแถแแแแแแแแแแแแถแแแถแแแแแแแธแแธแแถแแแแแพแแแแถแแ แแทแแแถแแขแแทแแแแแแ BPF แ David Miller แขแแแแแแแถแแแแแแแแแแแแแแแแถแแแธแแปแ
แ แ
แแถแแแทแแถแแแแถแแแแแแถแแแแ
Linux Plumbers 2018
แแ
แแแแทแแแถแแแถแแแทแแแแแถแแถแแแแแแแแแแ BPF แแพHabre แแ แแผแ
แแแแแ แพแแแ
แแแแปแแขแแแแแแแถแแแแแแแแแถแแ แแแแปแแแนแแแแแถแแถแแแทแแถแแขแแแธแแแแแแแแทแแแแ
แแ
แแแแทแแแแถ แแทแแแแแถแขแแแธแงแแแแแแแแแถแแแแแแแแ แแทแแแถแแขแแทแแแแแแ แ แพแแแแแแถแแแแธแแแแแแแแแถแแขแแปแแแแ แแทแแแถแแขแแปแแแแแแถแแแแแพแแแแถแแ BPF แ แขแแแแแแแแแแผแแแแแ
แแแแปแแแแแแธแแแแถแแแแธแแแแแแแแท แแทแแแแแถแแแแแแแแแแ BPF แแปแแถแ แ แพแแแแแแแ แถแแแธแขแถแแแแแแถแแแแแแแแแถแแแแแแแแทแแแแแทแแถแแแแแแแถแแแแแแ tcpdump
, seccomp
, strace
, แแทแแ
แแแพแแแแแ
แแถแแขแแทแแแแแแ BPF แแแแผแแแถแแแแแแแแแแแแแแแ แแแแแแแแแถแแแธแแปแ
แแแแแแทแแธแแแแแถแแแแแถแแแแแแถแแแแแแแ BPF แแบแแถแแแแแแ
แแนแแแแแแถแ แแผแ
แแแแแ แพแแแแแแถแแแถแแขแแปแแแแถแแ
แแแแแแแแธแแฝแแแแแปแแแแแแแแแทแแถแแแแแแแ BPF (c)
แแ
แแ
แแแแทแแแแถ BPF แแแแพแแแบแแถแแแแแแแแแถแแแแแแแข แแทแแแแแแธแแแแแ
แแ
แแแแทแแแแถแ
แถแแแแแแแถแแแแแแแแผแ
แแแแถ แแแแฅแกแผแแแแแ แ
แแถ BPF แแปแแถแ แแพแแแแธแแแแแถแแแถแแแถแแแ
แแแกแแ แงแแแแแแแแแพแแแแถแแแแแแธแแฝแแแแแผแแแถแแแแแแพแแกแพแแแแแแแขแแแแพ BPF แแปแแถแ tcpdump
, แแแแแแถแ seccomp
แแแแผแ
แแถแแแผแแปแแแแแแทแแแผแแแแแถแแ xt_bpf
แแแแแถแแ iptables
แแทแแขแแแแ
แถแแแแแแถแแ cls_bpf
. แแ
แแแแปแแแธแแปแ
แแแแพแ แแแแแแทแแธ BPF แแปแแถแแแแแผแแแถแแแแแแแแแแแแแแแแแแแแแแแทแแ
แแถแแแแแแแแแแธ แแแแแธแแถแแแถแแแถแแแแแ แแถแแแแแแแแแแแแขแแแแแแแพ API แแ
แแแแถแแแ
แแนแแแแแแแ แ แพแแแถแแแแแพแแแแถแแแแแแธแแแแแถแแ BPF แแปแแถแ แแผแ
แแแแแพแแแนแแแพแแแ
แแแแปแแขแแแแแแแแแแ
แแแแแแผแแแถแแแแแพแแ แแแแแถแแแ แแแปแแแแแ แ แพแแแแแแแแถแแแแแแแแถแแแแธแแแแแแแแทแแแแถแแขแแทแแแแแแ BPF แแปแแถแแแ
แแแแปแแแธแแปแ
แแถแแนแแแถแแแแแ
แแแถแแแขแแแธแแแแ แแทแแแผแแ แแแปแแแแแถแแทแแแแแแ
แแถแแแแแแแแแแพแแแแแแแถ แแแแปแแแถแแแแแแแ
แ
แทแแแแ
แถแแแแแแพแแแถแแฝแแแนแแขแแแแแแขแแแธ BPF แแปแแถแแ
แแ แ แปแแแแแ แแแแแแแแแแแแแแธ XNUMX แแแแแแแแแ แปแแแแแแแแแ แแทแแแแแแแแแธแแแแแธแแแทแแแแแ Lawrence Berkeley แแแแแแธแแแแถแแแถแแ แถแแแขแถแแแแแแแแพแแแแฝแแขแแแธแแแแแแแแแแแแ แแแแแแแถแแฑแแแแถแแแแแนแแแแแผแแแ แแพแแแแแแแนแแแแแแแแพแแแ แ แปแแแแแแแแแแแธ XNUMX แแแแแแแแแแธแ แปแแแแแแแ แแแแทแแแถแแผแแแแแถแแแแแถแแแแแแแแแแแแผแแแถแแขแแปแแแแแแแแผแแแ แแแแปแแแ แแ แแแแทแแแแถ CSPF (CMU/Stanford Packet Filter) แแบแแพแแแแธแแแแแแแแ แแแแแแแแถแแแแแแทแแ แถแแแถแ แแฑแแแแถแแแถแแแแถแแแแแขแถแ แแแแพแแ แแถแ แแแแแบแงแ แแ แแแแปแแ แแแแแแแบแแแ แแแแแแแถแแแแแถแแแถแแ แแแแแแทแแแแแแแแแแแทแแ แถแแแถแ แแแ แแแแปแแแแ แแขแแแแแแแพแแแแถแแแ แแพแแแแธแแแแแแแปแแแแแทแแถแแแแแแแแพแแแถแแแแแแถแแแแถแแแแแพแแแถแแแผแแขแแแแแแแพแแแแถแแแแแแปแแ แแแแแแแบแแแ แแแถแแแธแแแทแแแแทแ Sandbox แแแแผแแแถแแแแแพแแแแถแแแ
แแแแแแถแแแถแแแแแ แแแถแแแธแแแทแแแแทแแแแแแถแแแแแแแแแแแแถแแแแแถแแแแแแผแแแถแแแ
แแถแกแพแแแพแแแแธแแแแพแแแถแแแพแแแถแแแธแแแแแแถแแแผแแแแแถแแแพแแแ แ แพแแแทแแแแแพแแแถแแแแแแแแแแแแแแทแแแแแถแแแผแ
แแแถแแแธแ RISC แแแแธแแถแแแแแแแ แแถแแแแแแ แแถแแแแแแถแแแทแแแแแแแนแแแแแแแแแแแแทแแแแแแแแแธ Berkeley Labs แแ
แแ
แแแแทแแแแถ BPF (Berkeley Packet Filters) แแแแธแแแแผแแแถแแแแแแพแแกแพแ แแแแถแแแแแแแแแแแถแแแธแแแทแแแแทแแแแแแแแผแแแถแแแ
แแถแกแพแแแแแแแขแแแแพแแแแแแแแแแแแพแแแถแ Motorola 6502 แแแแแถแแแแแถแแแแแแแแแแแแแทแแแแแแแธแแผแ
แแถ
แแแแถแแแแแแแแแแแถแแแธแ BPF
แแพแแแนแแแแแถแแแแแแถแแแแแแแแแแถแแแแแแแแแพแแถแแแแแแทแแถแแงแแถแ แแแแ แแแแแแถแแแถแแแแแ แแพแแแแธแ
แถแแแแแแพแ แงแแแถแแถแแแถแแแธแแแถแแแถแแ
แปแแแแแแ 32-bit แ
แแแฝแแแธแแแแแขแถแ
แ
แผแแแแแพแแถแแแแแแถแแแขแแแแแแแพแแแแถแแ แแแแแถแงแแแแแแแแแแผแแแแแปแ A
แแทแแแถแแ
แปแแแแแแแแแแแแแแแ X
, 64 แแแแแขแแแแ
แแ
แถแ (16 แแถแแแ) แแถแแแแแแถแแแแถแแแแแแ แแทแแแถแแขแถแแแถแแแแแแแแแถแแ แแทแแแแแแแแแแแผแ
แแฝแแแแแถแแแแแแแแถแแแแแถแแแแแแพแแถแแแถแแฝแแแแแแปแแถแแแแแแ แแถแแแแแถแแแแแแแแแถแแแแถแแขแแปแแแแแแแแแแแแถแแแแแแแแแแแแแถแแแ
แแแแปแแแแแแแทแแธแแแ แแแปแแแแแแพแแแแธแแถแแถแแถแแแแแ
แแแแแแแแทแแธแแถแแแแแแแแแถ แแถแแแแแขแถแ
แแแแผแแแถแแแแแพแกแพแแแ
แแปแแแแแแปแแแแแ แแแแแบ แแถแแทแแแแแถแแแแผแแแถแแ แถแแแถแแแแทแแฑแแแแแแแพแแแแแแทแแแปแแ
แแแแแแแถแแแแแผแแ แแแแแถแแแแถแแ แถแแแแแแพแแแแถแแแธแแแถแแแผแ แแถแแแแแแแ แขแแแแแแแพแแแแถแแแแแแแพแแแแแแแทแแธแแแแแถแแแแแแถแแแแแแแแ BPF แแทแแแแแแแแพ แแแแ แแแแแแถแแแบแแแ (แแผแ แแถแแถแแ แ แแแแแแแแ) แแแแปแ แแทแแแแแถแแแแแแแแทแแธแแ แแ แแแแ แแ แแแถแแแธแแแแแแพแแแแแนแแแแทแแถแแแแแ แแแแปแแแบแแแ (แงแแถแ แแแ แแแแนแแแแทแแถแแแแแฝแแแบแแถแแถแแแแแแแแแแแแ แแแแแแแแถแแแแแแถแแแแ แแพแแถแแแแแแถแ)แ แแ แแแแแแแแแแนแแแแทแแถแแแแแฝแแแพแแกแพแ แแบแแแแแแแพแแแถแแแแแแแทแแธ (แงแแถแ แแแ แแแแปแแแแแแแทแแธแแแแแแ) แ แพแแขแแแแ แแ แถแแแแถแแแธแแแแแผแแแนแ แแ แแแแ แแแแแแขแแแแ แแ แถแแแบแแแ (แงแแถแ แแแ แแทแแแแแแแแแแแแ แแแแแแแแถแแ แผแ)แ
แแถแแแพแแนแแแแแแแแแแถแแแแแแแถแแแแพแแแพแแแแธแ
แถแแแแแแพแแแพแแงแแถแ แแแแ แแพแแแนแแแแแถแแแแแแแแแแ แแทแแแแแแแแแถแแแแแแแแถแแถแแแถแแ
แถแแแถแ
แแ แแแแแทแแแพแขแแแแ
แแแแทแแแแถแแแแถแแแแผแแแแแแแแแแแแแแถแแแแแแแถแแแธแแแทแแแแทแ แแทแแแแแแแแแแขแแแธแแแแแแแถแแแแแแแถแแถแแแขแแแแแ แขแแแแขแถแ
แขแถแแขแแแแแแแพแ libpcap
แ แแทแแธแแถแแแแแแแแแถแแแแแแแแ แแทแแแแแแพแแแแแแทแแแแแถแแแแแแถแแแแถแแ
แถแแแแแแแแ
แแlibpcap
.
แฅแกแผแแแแแแพแแแแแแแ
แแทแ
แถแแแถแงแแถแ แแแแแแแถแแแแแถแแแขแแแแแแถแแแแแพแแแแถแแ BPF แแปแแถแแแ
แแพแแธแแปแ
แ tcpdump
(libpcap
), seccomp, xt_bpf
, cls_bpf
.
tcpdump
แแถแแขแแทแแแแแแ BPF แแแแผแแแถแแขแแปแแแแแแแแแแถแแฝแแแนแแแถแแขแแทแแแแแแแแแแแแแถแแแปแแแแแแถแแแแถแแแแแแแแแ
แแแแแแแแถแ - แงแแแแแแแแแพแแแแถแแแแแแธ tcpdump
. แ แพแแแแแแถแแแแแแบแแถแงแแถแ แแแแ
แถแแแแแแปแ แแทแแแแแธแแแแถแแแแแปแแแแแถแแแแแพแแแแถแแ BPF แแปแแถแแแแแแถแแแ
แแพแแแแแแแแแแแแแทแแแแแทแแถแแแถแ
แแแพแ แแพแแแนแแ
แถแแแแแแพแแแถแแแทแแแแถแแแแแแพแแขแแแธแแ
แแ
แแแแทแแแแถแแถแแฝแแแถแ
(แแแแปแแแถแแแแแงแแถแ แแแแแถแแแขแแแแ
แแแแปแแขแแแแแแแแแแ
แแพแแธแแปแ
5.6.0-rc6
. แแแแแแแแแแถแแแแแแแแถแแฝแแ
แแแฝแแแแแผแแแถแแแแแแแแฝแแแแแแถแแแแถแแขแถแแแถแแแแแแแแแพแแ )
แงแแถแ แแแแ แแถแแแแแแแแแแแ แแแแแแแแถแ IPv6
แแผแแแแแแแแถแแพแแ
แแแแพแแแแแ
แแ IPv6 แแถแแแขแแแแ
แแพแ
แแแปแ
แแแแแถแแแแฝแแ eth0
. แแพแแแแธแแแแพแแผแ
แแแแแพแแขแถแ
แแแแพแแแถแแแแแแแทแแธ tcpdump
แแถแแฝแแแนแแแแแแแแถแแแแ ip6
:
$ sudo tcpdump -i eth0 ip6
แแผแ
แแแแ tcpdump
แ
แแแแแแแแแแ ip6
แ
แผแแแ
แแแแปแ BPF architecture bytecode แ แพแแแแแพแแถแแ
แแบแแแ (แแผแแแพแแแแแแแถแแแแแขแทแแแ
แแแแปแแแแแแ eth0
. แแแแแทแแแพแแแแแแแแแกแแแแแแแแแทแแแแแแผแแแ n
แแแแแถแแแแแแ แผแแแแ n
แแแแแแแแ
แแแแแแแแถแแแนแแแแแผแแแถแแ
แแแแแแ
แแแ แแขแแแแแแแพแแแแถแแ แ แพแแแพแแแนแแแพแแแถแแ
แแแแปแแแแแแแ tcpdump
.
แแถแแแแแแถแแพแแขแถแ
แแแแพแแแแถแแแถแแแแแฝแแแถแแพแแแแแผแแแแแถแแฝแแแแแผแแแถแแแแแพแแ
แแบแแแ tcpdump
แแแแแถแแแแแฝแแแธ tcpdump
แแแแแทแแแพแแพแแแแแพแแแถแแแถแแถแแฝแแแแแแพแ -d
:
$ sudo tcpdump -i eth0 -d ip6
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 3
(002) ret #262144
(003) ret #0
แแ
แแพแแแแแถแแแแผแแแแแพแแแแแพแแแถแแแถแแแแแแแแถ ldh [12]
แแแแแแแถแแฑแแ "แแแแปแแแ
แแแแปแแ
แปแแแแแแ A
แแถแแแแแแแถแแแถแแแ (16 แแแธแ) แแแแแถแแแธแแถแแแแ
แขแถแแแแแแถแ 12โ แ แพแแแแแฝแแแแแฝแแแแแแบแแถแแพแแพแแแแแปแแแทแแถแแขแแแธแแถแแ
แแ
แถแแแแแแแแแถ? แ
แแแแพแแแบแแ
x
แ
แถแแแแแแพแ (x+1)
th byte แแแแแแ
แแแแแแแถแแแแแแถแแแทแแถแแ แแพแแขแถแแแแแ
แแแแแแแแถแแแธแ
แแแปแ
แแแแแถแแแขแแธแแบแแแทแ eth0
, แ แพแโแแแ
6 6 2
|Destination MAC|Source MAC|Ether Type|...|
แแผแ
แแแแแแแแแถแแแแธแแแแแทแแแแแทแแถแแแแแแแแถ ldh [12]
แแ
แแแแปแแแถแแ
แปแแแแแแ A
แแถแแนแแแถแแแถแแแฝแแ Ether Type
- แแแแแแแแแแแแ
แแแแแแแแถแแแแแแถแแแแแแผแแแ
แแแแปแแแแปแแขแแธแแบแแแทแแแแแ แแ
แแพแแแแแถแแแแธ 1 แแพแแแแแแแแแแแถแแทแแถแแแแถแแ
แปแแแแแแ A
(แแแแแแแแแแ
แแ) แ 0x86dd
, แ แพแโแแแ jt 2
ะธ jf 3
- แแแแแถแแแแขแแแแแแแผแแแ
แแแแแทแแแพแแถแแแแแแแแแแแแแแแ (A == 0x86dd
) แแทแแแทแแแแแแแแ แแผแ
แแแแแแแแปแแแแแธแแแแแแ (IPv6) แแพแแแ
แแฝแแแธ 2 แ แพแแแแแปแแแแแธแแแแแทแแแแแแแ - แแ
แแฝแแแธ 3 แ แแ
แแพแแแแแถแแแแธ 3 แแแแแแทแแธแแแแ
แแแแแแแแแแผแ 0 (แแปแแ
แแแแแแแแ
แแแแแแแแถแ) แแ
แแแแแถแแแแธ 2 แแแแแแทแแธแแแแ
แแแแแแแแแแผแ 262144 (แ
แแแแแแแแปแแแแแ
แแแขแแทแแแแถ 256 แแธแกแผแแ) แ
แงแแถแ แแแแแแแปแแแแแถแแแถแแแแแ แแพแแแพแแแแแ แแ TCP แแถแแ แแแแแแแแ
แแผแแแพแแขแแแธแแแแแแแแแแพแแแ
แแผแ
แแแแ
แแแแแแแแ
แแ TCP แแถแแแขแแแแแแแถแแ
แแแแแทแแแ
666แ แแพแแแนแแแทแ
แถแแแถแแแแธ IPv4 แแแแแแแแแธ IPv6 แแบแแถแแแแแแถแแ แแแแแถแแแแธแแทแแแแถแงแแถแ แแแแแแ แขแแแแขแถแ
แแแแแแแแแแธแแแแแ IPv6 แแแแแแแฝแแฏแแแถแแแ แถแแแแฝแ (ip6 and tcp dst port 666
) แแทแแแแแแแแแแแถแแแแแแธแแผแแ
(tcp dst port 666
) แแผแ
แแแแแแแแแแแแแแพแแ
แถแแแขแถแแแแแแแแพแแแ
แแผแ
แแแแ
$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 10
(002) ldb [23]
(003) jeq #0x6 jt 4 jf 10
(004) ldh [20]
(005) jset #0x1fff jt 10 jf 6
(006) ldxb 4*([14]&0xf)
(007) ldh [x + 16]
(008) jeq #0x29a jt 9 jf 10
(009) ret #262144
(010) ret #0
แแพแแแนแแแฝแ
แ แพแแแถ แแแแแถแแ 0 แแทแ 1 แแแแพแขแแแธแ แแ
แแพแแแแแถแแแแธ 2 แแพแแแถแแแทแแทแแแแแฝแ
แ แพแแแถแแแแแบแแถแแแแ
แแ IPv4 (แแแแแแ Ether = 0x800
) แ แพแแแแแปแแแถแแ
แแแแปแแแแแแธ A
24 แแแแแแแแ
แแแแแแแแถแแ แแแแ
แแแแแแแแพแแแพแแแ
แแผแ
แแถ
14 8 1 1
|ethernet header|ip fields|ttl|protocol|...|
แแแแแถแแแแแแถแแพแแแแแปแแแ
แแแแปแแแแแแธ A
แแถแ Protocol แแแแแแแแถ IP แแแแแถแกแผแแธแแ แแธแแแแแแแพแแ
แแแ
แแแแแแแแแแ
แแ TCP แแแปแแแแแแ แแพแแแแแแแแแแแทแแธแแถแแแถแแฝแ 0x6
(IPPROTO_TCP
แแ
แแพแแแแแถแแแแธ 4 แแทแแแธ 5 แแพแแแแแปแแแถแแแแแถแแแแแแแถแแแแแแถแแแธแแถแแแแ
แขแถแแแแแแถแ 20 แ แพแแแแแพแแถแแแแแแแแถ jset
แแทแแทแแแแแพแแแถแแพแแฝแแแแแปแแ
แแแแแแธแแแแผแแแถแแแแแแ jset
แแแธแแแแแถแแแแ
แแแฝแแแธแแแแผแแแถแแแแแแแ แแแธแแแธแแแแแปแแ
แแแแแแแธแแแถแแแแธแแแแถแแแแพแแแถแแพแแแแ
แแแแแแแแถแแแถแแแแแแแแแแแ
แแแแแแแแถแ IP แแแแแแแผแแแถแแแแแ
แแ แ แพแแแแแแทแแแพแแผแ
แแแแ แแพแแถแแถแแแแแแ
แปแแแแแแแแแแฌแแแ แแแธแแแธแแธแแแแผแแแถแแแแแแปแแแปแ แ แพแแแแแผแแแแแถแแผแแแแ แแพแโแแทแโแ
แแโแแทแแทแแแโแแถแแโแ
แแแฝแโแแแโแฌโแแแแ
แแโแแผแ
โแแ แแผแ
แแแแโแแพแโแแทแแทแแแโแแถแแโแแธโแแแธแแ
แแฝแแแธ 6 แแบแแฝแแฑแแแ
แถแแแขแถแแแแแแแแแแปแแแ
แแแแปแแแแแแธแแแแ แแแแแแ ldxb 4*([14]&0xf)
แแถแแแแแแถแแพแแแแแปแแแ
แแแแปแแแแแแธ X
แแฝแแแแธแแแแแแแแถแแแแทแ
แแแแปแแแแแแแธแแแแแแแถแแแแแแแ
แแแแแแแแถแแแปแแแนแ 4แ แแฝแแแแธแแแแแแแแถแแแแทแ
แแแแปแแแแแแแธแแแแแแแถแแแบแแถแแถแ 4*([14]&0xf)
แแบแแถแแถแแแแแแแแแแแถแแแแแแแแแขแถแแแแแแถแแแทแแแ แแแแขแถแ
แแแแพแแถแแแแแแแปแแแแแแแแแแ แแทแแแแแแถแแแแแแถแแ
แปแแแแแแแแแปแแแแแแ X
, i.e. แแพแแแแแทแแขแถแ
แแทแแถแแแถแแแแแ ldb 4*([14]&0xf)
แแทแ ldxb 5*([14]&0xf)
(แแพแแขแถแ
แแแแแถแแแแถแแแแขแปแ แแแแทแแแแแแแงแแถแ แแแ ldxb 4*([16]&0xf)
) แแถแ
แแแถแแแแถแแแแถแแแแแแแถแแแแขแถแแแแแแถแแแแแแแแผแแแถแแแแแแแแแ
BPF แแแถแแแถแแแแถแแแแพแแแแธแแแฝแแแถแ X
(แแถแแ
แปแแแแแแแแแแแแแแแ) แแแแแแแแแแแแถ IPv4 แ
แแผแ
แแแแแแ
แแพแแแแแถแแแแธ 7 แแพแแแแแถแแถแแแแแปแแแถแแแแแถแแแแแแแถแ (X+16)
. แ
แแ
แถแแแถ 14 แแแแแแผแแแถแแแถแแแแถแแแแแแแแแแแถ Ethernet แแทแ X
แแถแแแแแแแแแแแแแแแถ IPv4 แแพแแแแแแถแแ
แแแแปแ A
แ
แแแแแแแแ
TCP แแแแผแแแถแแแแแปแแ
14 X 2 2
|ethernet header|ip header|source port|destination port|
แแธแแแแปแแแ แแพแแแแแถแแแแธ 8 แแพแแแแแแแแแแ แแแแแแแแ แแถแแฝแแแนแแแแแแแแแแ แแแแถแ แ แพแแแ แแพแแแแแถแแแแธ 9 แฌ 10 แแพแแแแแแแแแแแแแแแแทแแแถแแพแแแแผแแ แแแแแแแแ แแแแแแแแถแแฌแขแแแ
Tcpdumpแ แแแแปแแแแแปแ
แแ
แแแแปแแงแแถแ แแแแแธแแปแ แแพแแแทแแแถแแแแแแถแแแแแแขแทแแขแแแธแแแแแแแแแพแแแแแปแ BPF bytecode แแ
แแแแปแแแบแแแแแแแแถแแแแถแแแแแแแแแ
แแแแแแแแถแแแแแแแ แแทแแถแแแถแแผแแ
, tcpdump
แแแแแผแแแ
แแถแแแแแแแแแแแแถแ
แแแพแ แแทแแแแแแถแแแแแแพแแถแแแถแแฝแแแแแแ tcpdump
libpcap
libpcap
แขแแแแแแแผแแแแแพแแผแ
แแถแแแแแแแ
- แแแแแพแแขแแแแแทแแแแแถแแแแแแ
pcap_t
แแธแแแแแแ แแแปแ แแแแแถแแแ ,pcap_create
- แแแแพแฑแแแ
แแแปแ
แแแแแถแแแแแแแแ
,pcap_activate
- แ
แแแแแแแแแแแ
,pcap_compile
- แแแแถแแแแแแแแ
.pcap_setfilter
แแพแแแแธแแพแแแปแแแถแ pcap_setfilter
แขแแปแแแแแแ
แแแแปแแแธแแปแ
แแพแแแแแพ strace
(แแแแแถแแแแแแแแแแผแแแถแแแแ
แแ)แ
$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768) = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...
แแ
แแพแแแแแถแแแแทแแแแแแแธแแแแแผแแแพแแแแแแพแ eth0
... แแธ ip
แแนแแแถแแแถแแแแแถแ BPF แ
แแแฝแแแฝแ แ แพแแแ
แแพแแแแแถแแแแธแแธ แแพแแแพแแแธแแแแแแแแพแแแแแพแ SO_ATTACH_FILTER
setsockopt
แแพแแแแแปแแแทแแแแแถแแแแแแแแแแแแแ 4. แแแแแบแแถแแแแแแแแแแแพแแ
แแถแแฝแแฑแแแแแแแแแแถแแแแถแแ แแแแปแ BPF แแปแแถแแแถแแแแแปแแแทแแแแแถแแแแแแแแแแแแแแพแแกแพแแแถแแแแแทแแแแแทแแถแแขแถแแผแแทแแ แพแแแ แแแแปแแแแแแแแแธแแ BPF แแถแแแแแปแแแแแแแทแแธแแทแแ แแแถแแ แแแถแแแธแแแแแแพแแแแแนแแแแทแแถแแแแแแแผแแแถแแแแแแแแถแแแแแแแแถแ
แแถแแแทแแแแแแถแแ
แแแแแแแแแแแแถแแแแแแทแ แแแแแแแแแแพแแแ แแผแ แแแแ
$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768) = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0xbeefbeefbeef}, 16) = 0
recvfrom(3, 0x7ffcad394257, 1, MSG_TRUNC, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...
แแผแ
แแแแแถแแแแแแถแแแแถแแแพแแพแแแแแปแแแทแแแแแถแแแแแแแแแแแแแพแแแ
แแแแแแ
แแพแแแแแถแแแแธ 5 แแแปแแแแแแพแแถแแขแแแธแแพแแกแพแแแ
แแพแแแแแถแแแแธ 3 แแทแแแธ 4? แแถแแแแแแถแแแแ libpcap
แแแแแแแถแแฝแแแพแ - แแผแ
แแแแแแถแแแแแแแแแแแแแแแแแแแพแแแทแแแฝแแแแแ
แผแแแแแ
แแแแแแแแถแแแแแแทแแแแแ
แทแแแแแถ แแแแแถแแแ ret #0
(แแแแแถแแแแแแ
แแแแแแแแถแแแถแแแขแแ) แแแแผแแแแแแแ
แแแแแแทแแแแแแแแถแแ แ แพแแแแแถแแถแแแแแแแ
แแแแแแแแถแแแถแแแขแแแแแแขแถแ
แแ
แแแแแธแแแแแแแธแแปแแ
แแแปแแแ แแพแแแแธแแแแแแแแ
แแแแ
แแพแแธแแปแ
แแแแแแแพ BPF แแปแแถแ แขแแแแแแแผแแแถแแแแแแแแแแปแแแแแแแแแถแแ
แแถแแแแแแแแแแผแ
แแถ struct sock_fprog
แแทแแแแแแแพแ แแแแแถแแแแธแแแแแแแแแขแถแ
แแแแผแแแถแแแแแถแแแแ
แแแแแแแแแแแพแแถแแ แ
แแแแแแแแ setsockopt
.
แแฝแแฑแแแ
แถแแแขแถแแแแแแแแแแแแขแถแ
แแแแผแแแถแแแแแถแแแแ
แแนแแแแแแแถแแฝแแแทแแแแแนแแแแแ
แแแ แแ
แแธแแแ
แแแแแแถแแแแแขแทแแแแแแแแขแแแธแแถแแแแแพแแแแถแแ setsockopt
แแแแแถแแแแถแแแแแแถแแแแแแแ แแผแแแพแ struct sock_fprog
แแแแแแแถแแแแแฝแ tcpdump
แแพแแแนแแแทแแถแแแ
แแแแปแแแแแแ
แแปแแถแ BPF แแทแแแแแแแแแธ XNUMX
BPF แแแแผแแแถแแแฝแแแแแ
แผแแแ
แแแแปแแแธแแปแ
แแแแปแแแแแถแ 1997 แ แพแแแ
แแแแถแขแแแแแแแพแแถแแขแแแแแแแแแแถแแผแแแแ แพแ libpcap
แแแแแแแถแแแถแแแแแถแแแแแแผแแแทแแแแแถแแฝแ (แแถแแถแแแทแแแถแแแแถแแแแแถแแแแแแผแแแถแแแแถแแแแธแแปแ
, x86_64
แแแแแผแ
แแแแแแทแแธแ
แแแแแ JIT แแบแแถแแพแแแแแผแแแ
แแแแปแแแแแแแแแแถแแแแแแถแแแแแถแแแแแแผแ: แแแแปแแแแแถแ 2012 xt_bpf
แแแแขแแปแแแแถแแฑแแแขแแแแแแแแแ
แแแถแแแแแแแถแแ iptables
แแแแแถแแแแแฝแแแธ BPF แ แพแแแ
แแแแปแแถแแแแถแ 2013 แแบ cls_bpf
แแแแขแแปแแแแถแแฑแแแขแแแแแแแแแ
แแแถแแแแแแถแแแ
แแถแ
แแแแแแแแแแพ BPF แ
แแพแแแนแแแทแแทแแแแแพแแงแแถแ แแแแแถแแแขแแแแแแฑแแแแถแแแแแขแทแแแแแปแแแแแแถแแแแแแ แแแปแแแแแแถแแแแผแแแถแแนแแแถแแแแแแแแแแแแแแถแแแแพแแแแแปแแแถแแแแแแธแแแแแแแแแ แแทแแ
แแแแแแแแแแแทแแธแแถแแขแแแพแ
แทแแแแแแแแถแแ BPF แ
แถแแแแถแแแแธแแแแแแแถแแแแแแแแแแแแแแแแแถแแแแ libpcap
แแถแแแแแแ (แงแแถแ แแแแแถแแแแแ แแแแแพแแแแแแ libpcap
แขแถแ
แแแแกแแแแแแแแแแแธแ - 0 แฌ 0x40000) แฌแแถแแผแแ
แแผแ
แแถแแแแปแแแแแธ seccomp แแทแแขแถแ
แขแแปแแแแแแถแแแแ
แแถแแแแแแแแแแแแทแแธ BPF แแแแแแแแแแแพแแแแแถแแ
แ แผแแแพแแแแแถแแแแแแแแแแแแแธแแแแแถแแแแแถแ BPF แแถแแถแแแแแแถแแแ
16 8 8 32
| code | jt | jf | k |
แแถแแแแแถแแแธแแฝแแแแถแแแแถแแ 64 แแแธแ แแแแแแแปแแแแ 16 แแแธแแแแแผแแแบแแถแแผแแแถแแแแแถแ แแแแแถแแแแแแถแแแถแแ
แผแแแแแแถแแแแแแถแแแธแแแธแแแธแแ jt
ะธ jf
แแทแ 32 แแแธแแแแแแถแแแขแถแแปแแแแแ K
แแแแแแแแแแแแแแแแแแฝแแแธแแถแแแแแแแแถแแฝแแแ
แแถแแแแแแแแถแ แงแแถแ แแแแแถแแแแแแแแถ ret
แแแแแแแ
แแแแแแแแทแแธแแถแแแแแแผแ 6
แ แพแแแแแแแแแแกแแแแแแผแแแแแธแแแ K
. แแ
แแแแปแ C แแถแแแแแถแ BPF แแแแฝแแแแแผแแแถแแแแแถแแแถแแ
แแถแแแแแแแแ
struct sock_filter {
__u16 code;
__u8 jt;
__u8 jf;
__u32 k;
}
แ แพแแแแแแแทแแธแแถแแแแผแแแบแแแแทแแแ แแแแปแแแแแแแแแแแ แแถแแแแแแแแ
struct sock_fprog {
unsigned short len;
struct sock_filter *filter;
}
แแผแ
แแแ แแพแแขแถแ
แแแแแแแแแแแทแแธแแฝแ
แ แพแ (แงแแถแ แแแ แแพแแแแแถแแแแแแแผแแแแแถแแแธ ip6
แแธ
struct sock_filter code[] = {
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 1, 0x000086dd },
{ 0x06, 0, 0, 0x00040000 },
{ 0x06, 0, 0, 0x00000000 },
};
struct sock_fprog prog = {
.len = ARRAY_SIZE(code),
.filter = code,
};
แแแแแแทแแธ prog
แแพแแขแถแ
แแแแพแแแแถแแแแแแแแแแ
แแแถแแแแแแปแแแถแแ แ
แแผแแแแแ
setsockopt(sk, SOL_SOCKET, SO_ATTACH_FILTER, &prog, sizeof(prog))
แแถแแแแแแแแแแแแทแแธแแแแปแแแแแแแแแถแแผแแแแถแแแธแแแทแแแถแแแแแฝแแแ แแแปแแแแแแแแแแแแแถแ
แถแแแถแ
แ (แงแแถแ แแแ แแแแแถแแแแถแแแแแแ แปแ แแถแแแแแแพแแแถแแแแแพแแแแแแฏแแแถ แแถแแแแแแแขแแแแแแแ
แแพHabre แแแ)แ แแพแแแแธแแถแแแถแแแแแฝแแแ
แแแแปแแฏแแแถแ <linux/filter.h>
แแแถแแแแผแแแแฝแแแแแผแแแถแแแแแแ - แงแแถแ แแแแแผแ
แแแแถแแนแแแถแแแพแขแถแ
แแแแผแแแถแแแแแแแกแพแแแทแแแถ
struct sock_filter code[] = {
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
BPF_STMT(BPF_RET|BPF_K, 0x00040000),
BPF_STMT(BPF_RET|BPF_K, 0),
}
แแแแแแถแแแถแแแแแแแแแแพแแแแแแทแแแถแแแแแฝแแแแ แแแแแถแขแแแธแแแแขแแแแแแแแแแแแแแทแแธแแบแแแแแธแแปแ
แแถแแแแแแแ แ แแแปแแผแ
แแแแแ แพแแแ
แแแแปแแแ tools/bpf
แแถแแถแแแกแพแแแบแแแแแแแแ
แแนแแแแแแแแแแแถแแแแแ แปแ tcpdump
แแแปแแแแแแพแแแธแแแแแแ แแพแแขแถแ
แแแแแถแแแแแแถแแแทแแทแแแแแแแแถแ แงแแถแ แแแ แแแแแบแแถแแแแแแทแแธแแแแแแแแถแแแแแแ
แแแแแแแแถแแแถแแแขแแ แแพแแแแแแ TCP/IPv4แ
$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0
แแถแแแแแถแแแพแ แขแแแแแแกแพแแแแแแพแแแผแแแแแปแแแแแแแ <ะบะพะปะธัะตััะฒะพ ะธะฝััััะบัะธะน>,<code1> <jt1> <jf1> <k1>,...
แแแแแถแแแงแแถแ แแแแแแแแแพแแแถแแฝแ TCP แแถแแนแแแแแถแแแถ
$ tools/bpf/bpf_asm /tmp/tcp-over-ipv4.bpf
6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 6,6 0 0 4294967295,6 0 0 0,
แแแแแถแแแแถแแแถแแแแแฝแแแแแแขแแแแแแแแแแแแแแทแแธ C แแแแแแแแแแแแแแแแแแแแแถแขแถแ แแแแผแแแถแแแแแพแ
$ tools/bpf/bpf_asm -c /tmp/tcp-over-ipv4.bpf
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 0, 1, 0x00000006 },
{ 0x06, 0, 0, 0xffffffff },
{ 0x06, 0, 0, 0000000000 },
แขแแแแแแแแแขแถแ
แแแแผแแแถแแ
แแแแแ
แผแแแ
แแแแปแแแถแแแแแแแแ
แแถแแแแแแแแแแแแแแ struct sock_filter
แแผแ
แแแแแพแแแถแแแแแพแแ
แแพแแแแแแแแแแ
แแแแแแแแแแแแแธแแปแ แแทแ netsniff-ng
แแแแแแแแธแแพแแแแแแแถแ BPF, Linux แแทแ tools/bpf/bpf_asm
แแถแแแแ แแทแ struct sk_buff
แแแแแทแแแแแถแขแแแธแแแแ
แแแแแแแแถแแแแแแถแแแ
แแแแปแแแบแแแแ แแแแแแถแแแถแแแแแ แแแแถแแแแแแแแแแแแแแแแแแแถแแแแแถแแแแแฝแแแแแแ แงแแถแ แแแ ldw cpu
แแนแแแแแปแแแ
แแแแปแแแแแแธ A
แแแแแแแแแแถแแแแแพแแแถแแแปแแแถแแแบแแแ raw_smp_processor_id()
. (แแ
แแแแปแแแแแแแแแธแแ BPF แแแแแแแแแแแแแแแแทแแแแแแถแแแแแแแถแแแถแแแแแแแแแผแแแถแแแแแแธแแแพแแแแธแแแแแแแแแแแทแแธแแถแแฝแแแนแแแแแปแแแแแแแแแทแแธแแแแฝแแแบแแแแแแแแถแแแแถแแ
แผแแแแแพแขแแแแ
แแ
แถแ แแ
แแถแแแแแแแแ แแทแแแถแแแแแแพแแแแแนแแแแทแแถแแแแ) แแแแแบแแถแงแแถแ แแแแแฝแแฑแแแ
แถแแแขแถแแแแแแแแแแแแแแแแแแพแแ
แแแแแแแแแแแ แแแแแแถ packet แ
แผแแแ
แแแแปแแแแ แแขแแแแแแแพแแแแถแแ แแแแแแแพแแแแแแแแแแแ poff
, payload offset:
ld poff
ret a
แแแแแแแแแแแ BPF แแทแแขแถแ
แแแแพแแถแแแแ tcpdump
แแแปแแแแแแแแแบแแถแ แแแปแแแแแแแขแแพแแแแธแแแแถแแแแแแ
แแแงแแแแแแแแแพแแแแถแแ netsniff-ng
netsniff-ng
แแแแแแแแแแแธแแพแแถแแแแแแแแแแแแพ BPF แแแแถแแแแถแแแธแแแแแพแแ
แแถแ
แแแแแถแแแแแแทแแแแแถแ แแทแแแแแแทแแแแแแแแถแ tools/bpf/bpf_asm
แขแแแแแแกแพแ BPF แแถแแ แ
bpfc
. แแแแ
แแแแถแแฏแแแถแแแแแขแทแ แแผแแแพแแแแแแแแผแแแแแแแแถแแแแ
แ
แปแแแแแ
แแแแแขแแแแแแ
แแแธแแแ
แแผแ แแแแ แแพแแแนแแแธแแแแแแแแแแแแแแแทแแธ BPF แแแแถแแแแแปแแแแแถแแแถแแขแแแพแ แทแแแ แ แพแแแแแแแแแแฝแแแฝแ แแถแแแแแ แแพแแแแธแแพแแงแแถแ แแแแแแแธ แแแแแธแแฝแแแบแแ แแ แแแแทแแแแถ seccomp แแแแขแแปแแแแถแแฑแแแแแแพแแแแถแแ BPF filters แแพแแแแธแแแแแแแแแแแแแปแ แแทแแแแแปแแแแขแถแแปแแแแแแแถแแ แ แแแแแแแแแแแแแถแแแแแแถแแ แแแแพแแแถแแแแแแถแแแแแแแฑแแ แแทแแแผแแ แ แแแแแแถแ
แแแแแแแแผแแแ seccomp แแแแผแแแถแแแแแแแแแ
แแบแแแแแแแปแแแแแถแ 2005 แ แพแแแทแแแถแแแแแแถแแแแทแแแถแแแแแถแแแแแแแแแแแถแแแแแแแแแแพแแแแแฝแ - แแพแแแแธแแแแแแแแแปแแแแแถแแ แ
แแแแแแแแแแแแแถแแแแแแถแแแแแแพแแแถแแแผแ
แแถแแแแแแ: read
, write
, exit
ะธ sigreturn
แ แพแแแแแพแแแถแแแแแแแแถแแ
แแแถแแแแแแผแแแถแแแแแแถแแแแแแแแแพ SIGKILL
. แแแแแแถแแแถแแแแแแแแแปแแแแแถแ 2012 seccomp แแถแแแแแแแแแแแแแแถแแแแแปแแแถแแแแแพแแแแแ BPF แแแแขแแปแแแแถแแฑแแแขแแแแแแแแแแแแปแแแแแถแแ แ
แแแแแแแแแแแแแถแแขแแปแแแแถแแ แพแแแแแแถแแแแแแพแแถแแแแแฝแแแทแแทแแแแแพแขแถแแปแแแแแแแแแแแฝแแแแ (แแฝแแฑแแแ
แถแแแขแถแแแแแแ Chrome แแบแแถแขแแแแแแแพแแแแถแแแแแแผแแแแแแแปแแแถแแแแ แ แพแแแแปแแแ Chrome แแ
แแ
แปแแแแแแแแแแปแแแแแแพแแแแแแแถแ KRSI แแแแแแขแแแแพแแแแแแแแธแแ BPF แแทแแขแแปแแแแถแแฑแแแแแแผแแแถแแแแแแแแแแผแแปแแแปแแแแแทแแถแแแธแแปแ
แ) แแแแแแแถแแแแ
แฏแแแถแแแแแแแแขแถแ
แแแแถแแแ
แ
แปแแแแแ
แแแ แแแขแแแแแแ
แ
แแแถแแแถแแถแแขแแแแแแแฝแ
แ แพแแแ
แแพแแแแแแแแแแขแแแธแแถแแแแแพ seccomp แแแแ แแแแถแแถแแแแแถแแแแถแแแ
แแแขแถแแแถแแปแ (แฌแแแแฝแแฑแแ) แขแถแแแแแแแแแแถแแแแแแแ แแ
แแแแปแแขแแแแแ
แแแแแถแแแแพแแแนแแแพแแแธแแแแแแแแแ แแทแแแแแปแแแแแแแแแแแถแแ seccomp
แแ
แแแ C แแทแแแแแพแแแแแถแแแ libseccomp
แ แพแแแพแขแแแธแแถแแปแแแแแแแแแท แแทแแแปแแแทแแแแแทแแแแแแแพแแแธแแฝแแ แ แพแแ
แปแแแแแแ แแผแแแพแแแธแแแแแแแแแแแแแทแแธ seccomp แแแแผแแแถแแแแแพแแแแถแแแแแแแแแแแทแแธ strace
.
แแถแแแแแแ แแทแแแแแปแแแแแแแแแแแถแแ seccomp
แแพแแแนแแแธแแแแแแแแแแแแแแแทแแธ BPF แแฝแ
แ แพแ แแผแ
แแแแแแผแแแแแกแแแแพแแ
แแแปแ
แแแแแถแแแแแแแแแแแแแทแแธ seccomp แแถแแปแแแทแแ แขแแแแขแถแ
แแแแแแแแแแแแ
แแแแแทแแแแแพแแแถแ แ แพแแแแแพแแแถแแแปแแถแแแถแแแขแแแแนแแแแฝแแแถแแแนแแแแแแนแแ แแแแแแแผแแแถแแแแแพแแแแแแแพแแถแแ แ
แแถแแแแแแแแแ seccomp(2)
seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)
แแแแแถแแแแแแแแแ &filter
- แแแแแบแแถแ
แแแขแปแแแ
แแ
แแถแแแแแแแแแแแแแแแถแแแแแแถแแแแพแแแฝแ
แ แพแ struct sock_fprog
, i.e. แแแแแแทแแธ BPF แ
แแพแแแแแแทแแธแแแแแถแแ seccomp แแปแแแธแแแแแแทแแธแแแแแถแแ socket แแแถแแแผแ แแแแแ ? แแแทแแแแแแแ แแ แแแแปแแแแแธแแแแแแ แแพแแแแแผแแแถแแแแแแแแแแแแแแแ แแ แถแแแแแแถแแแแแ แแแแแแแแถแ แ แพแแแแแปแแแแแธ seccomp แแพแแแแแผแแแถแแแแแแแแแแ แแถแแแแแแแแแแผแ แแถ
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};
แแถแแบแแถแแถแ nr
แแบแแถแแแแแแแถแแ แ
แแแแแแแแแแแแแแแผแแ
แถแแแแแแพแ arch
- แแแแถแแแแแแแแแแ
แแ
แปแแแแแแ (แแแแแแแแพแแแแแถแแแแแแ), args
- แขแถแแปแแแแแแแถแแ แ
แแแแแแแแแแ แผแแแแแแแแถแแแฝแ, แแทแ instruction_pointer
แแบโแแถโแแถแโแ
แแแขแปแโแแ
โแแถแโแแแแถแโแ
แแแแแโแขแแแโแแแแพโแแแโแแถแโแแแแพโแแถแโแ แ
โแแแแแแแแแ แแผแ
แแแแ แแถแงแแถแ แแแ แแพแแแแธแแแแปแแแแแแถแแ แ
แแแแแแแแแแแแแแ
แแแแปแแ
แปแแแแแแ A
แแพแแแแแผแแแแแทแแถแ
ldw [0]
แแถแแแแแแแแแทแแแแแแแแแแแแแแแแถแแแแแแแแทแแธ seccomp แงแแถแ แแแ แแแทแแแขแถแ
แ
แผแแแแแพแแถแแแแแแแแถแแแแแแนแ 32 แแแธแแแแปแแแแแ แ แพแแขแแแแแทแแขแถแ
แแแแปแแแถแแแแแถแแแแแแแถแ แฌแแฝแแแแแถแแแ - แแ
แแแแแแแถแแถแแแแแปแแแแแแ ldh [0]
แแถแแ แ
แแแแแแแแ seccomp
แแทโแนโแโแแแแกแแแแแแทแ EINVAL
. แแปแแแถแแแทแแทแแแแแพแแแแแแแแแแแถแแแแแปแ seccomp_check_filter()
mod
(แแแแแแแแแแ
แแแ) แ แพแแฅแกแผแแแแแแทแแแถแแแแแแถแแแแแแแแทแแธ Seccomp BPF แ
แถแแแแถแแแแธแแถแแแแแแแแแแแแแถแ
แแถแแผแแ แแพแแแนแแขแแแธแแแแแแแแแถแแแแแปแแแถแแแแแแ แแทแแขแถแแแแแแแทแแธ seccomp แแฝแ แ แพแแ แแถแแแแแแถ แแแแแแทแแแแถแแแแแแแแแแทแแธแแแแผแแแถแแแแแ แแแถแแแแแธแ แฌแแแแ แแแแถแแ แ แแแแแแแแ แงแแถแ แแแแแแแแแทแแธ
ld [0]
jeq #304, bad
jeq #176, bad
jeq #239, bad
jeq #279, bad
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
bad: ret #0
แแทแแทแแแแแแแแธแแแแ
แแแแถแแ แ
แแถแแแแแแแแแ
แแแฝแแแฝแแแแแแถแแแแ 304, 176, 239, 279 แ แแพแแถแแ แ
แแถแแแแแแแแแแแถแแแแแแแถแขแแแธ? แแพแโแแทแโแขแถแ
โแแทแแถแโแฒแแโแแแแถแแโแแถแโแแ แแแแแโแแพแโแแทแโแแนแโแแถโแแแแแแทแแธโแแฝแโแแถโแแแแผแโแแถแโแแแแแแ แแผแ
แแแแแขแแแแแทแแแแแแ seccomp arch
แแ
แแถแแแแแแแแ struct seccomp_data
) แแถแแฝแแแนแแแถแแแผแแแธแแแแแถแแแแแแแแ แแถแแ
แถแแแแแแพแแแแงแแถแ แแแแแนแแแพแแแ
แแผแ
แ
ld [4]
jne #0xc000003e, bad_arch ; SCMP_ARCH_X86_64
แ แพแแแแแแถแแแแแแแแ แ แแถแแแแแแแแแแแแแแแพแแแนแแแแฝแแแถแแแแแแแแถแแแแถแแแ
แแพแแแแแแ แแทแแแแแปแแแแแแแแแแแถแแ seccomp แแแแแแแพ libseccomp
แแถแแแแแแแแแแแแแ
แแแแปแแแผแแแพแ แฌแแ
แแแแปแแแถแแแฝแแแแแแปแ BPF แขแแปแแแแถแแฑแแแขแแแแแถแแแถแแแแแแแแแแแแแแแแแแพแแแแแแ แแแปแแแแแแ
แแแแแถแแฝแแแแแถแแแ แแแแแแแแแถแแถแแถแแแแแแพแแแแแปแแแถแแแถแแแผแแ
แแแ แแทแ/แฌแขแถแ
แขแถแแแถแแ แแแแแถแแแแแนแแแฝแแแพแแแแแปแแแฟแแแแ
แแถแงแแถแ แแแ แ
แผแแแพแแแแแแแแแแแแทแแธแแแแแแแพแแแถแแฏแแแถแแแแแแธแแแแแถแแแแแพแแแพแแแแแแขแแแแแแแพ แแแแแถแแแแกแพแแแแแแธแแแแ
แแแแถแแ แ
แแแแแแแแแแธแแปแแแธ
#include <seccomp.h>
#include <unistd.h>
#include <err.h>
static int sys_numbers[] = {
__NR_mount,
__NR_umount2,
// ... ะตัะต 40 ัะธััะตะผะฝัั
ะฒัะทะพะฒะพะฒ ...
__NR_vmsplice,
__NR_perf_event_open,
};
int main(int argc, char **argv)
{
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);
for (size_t i = 0; i < sizeof(sys_numbers)/sizeof(sys_numbers[0]); i++)
seccomp_rule_add(ctx, SCMP_ACT_TRAP, sys_numbers[i], 0);
seccomp_load(ctx);
execvp(argv[1], &argv[1]);
err(1, "execlp: %s", argv[1]);
}
แแแแผแแแพแแแแแแแขแถแแ sys_numbers
แแ 40+ แแแแแถแแ แ
แแถแแแแแแแแแแแแแแแแผแแแแแแแแถแแแ แแแแแถแแแแแ
แถแแแแแแพแแแแทแแ ctx
แ แพแแแแแถแแแแแแแถแแแแแผแแขแแแธแแแแแพแแ
แแแขแแปแแแแถแ (SCMP_ACT_ALLOW
) แแถแแ แ
แแถแแแแแแแแแแแถแแแขแแแแถแแแแแถแแแพแ (แแถแแถแแแแแแถแแแแแฝแแแแแปแแแถแแแแแแพแแแแแแธแแแแ
)แ แแแแแถแแแแ แแแแแแฝแแ แแพแแแแแแแแแถแแ แ
แแแแแแแแแแถแแแขแแแ
แแแแธแแแแแธแแแแ
แ แแถแแถแแแแแพแแแแแ
แแนแแแถแแ แ
แแถแแแแแแแแแแแธแแแแแธ แแพแแแแแพแแปแ SCMP_ACT_TRAP
แแแแปแแแแแธแแแ seccomp แแนแแแแแแผแแแแแแถแแ
แแแแพแแแถแ SIGSYS
แแถแแฝแแแนแแแถแแแทแแแแแถแขแแแธแแถแแ แ
แแแแแแแแแแถแแแแแแแถแแ
แแแถแแแ แแธแแแแปแแแพแแแแแปแแแแแแแทแแธแแ
แแแแปแแแบแแแแแแแแแแพ seccomp_load
แแแแแนแแ
แแแแแแแแแแแทแแธ แแทแแแแแถแแแแถแแ
แแแแพแแแถแแแแแแแแพแแถแแ แ
แแถแแแแแแแแแ seccomp(2)
.
แแแแแถแแแแถแแ
แแแแแแแแแแแแแแ แแแแแแทแแธแแแแผแแแแแแแถแแแแถแแฝแแแแแแถแแแ libseccomp
แงแแถแ แแแ:
cc -std=c17 -Wall -Wextra -c -o seccomp_lib.o seccomp_lib.c
cc -o seccomp_lib seccomp_lib.o -lseccomp
แงแแถแ แแแแแแแถแแ แถแแแแแแพแแแแแแแแ
$ ./seccomp_lib echo ok
ok
แงแแถแ แแแแแแแถแแ แ แแถแแแแแแแแแแแแแแแแผแแแถแแแถแแถแแแ
$ sudo ./seccomp_lib mount -t bpf bpf /tmp
Bad system call
แแพแโแแแแพ strace
แแแแแถแแแแแแแแถแแแแแขแทแแ
$ sudo strace -e seccomp ./seccomp_lib mount -t bpf bpf /tmp
seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=50, filter=0x55d8e78428e0}) = 0
--- SIGSYS {si_signo=SIGSYS, si_code=SYS_SECCOMP, si_call_addr=0xboobdeadbeef, si_syscall=__NR_mount, si_arch=AUDIT_ARCH_X86_64} ---
+++ killed by SIGSYS (core dumped) +++
Bad system call
แแพแแพแแขแถแ
แแนแแแแแแแแแแถแแถแแแแแแทแแธแแแแผแแแถแแแทแแแแแแถแแแถแแแแแพแแแแถแแแแถแแ แ
แแผแแแแแแแแแแแแแแแแแแปแแ
แแแถแแ mount(2)
.
แแผแ
แแแแ แแพแแแแแแแแแแแแแแแแแแพแแแแแถแแแ libseccomp
แแแแแแแ
แผแแแแแแผแแแทแแแแแถแแแแถแแฝแแแแแแถแแแ แแ
แแแแปแแงแแถแ แแแแแถแแแพ แแแแแทแแแพแแถแแแถแแ แ
แแผแแแแแแแแแแแแแแแ
แแแพแ แแแแแแแแแแถแแแแแทแแแแแทแขแถแ
แแแแผแแแถแแแถแแแแแแแแแฝแแฑแแแแแแแแแแถแแ แแแแแแแถแแแแแฝแแแทแแทแแแแแแแถแแแแแแถแแแแแธแแแแแแแแแแแปแแแแแแ แแแแแถแแแแถแแแแแแพแแแแแแทแแแแแถแ libseccomp แแแแธแแแแแแถแ SCMP_FLTATR_CTL_OPTIMIZE
. แแถแแแแแแแแปแแแแแแแแแแแแ
แแถ 2 แแนแแแแแแแแแแแแแแแ
แแถแแแแแแทแแธแแแแแแแแแแแแแแแแแแแแธแแ
แแแแแทแแแพแขแแแแ
แแแแพแแแธแแแแแแแแแแแแแแแแแแแแแแแแแแแแแแแแธแแแแแพแแแถแ แแผแแแทแแทแแแแแพแ
$ echo 1 3 6 8 13 | ./generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0
แแถแแทแแขแถแ
แแ
แแฝแ
แแแแแแปแแแถแแแแแแแขแแแธแแแแแฟแแแถแแแแ แ
แถแแแแถแแแแธแแแแแแทแแธ BPF แแทแแขแถแ
แขแแปแแแแแแถแแแแแ
แผแแแแแแถแแ (แงแแถแ แแแ แแพแแแทแแขแถแ
แแแแพแแถแแแ) jmp A
แฌ jmp [label+X]
) แ แพแแแผแ
แแแแแแถแแแแแถแแแแแแผแแแถแแแขแแแแบแแทแแทแแแแแ
seccomp แแทแ strace
แแแปแแแแแแแแแแแแถแแนแแแธแงแแแแแแแแแพแแแแถแแ strace
แแบแแถแงแแแแแแแแแแทแแขแถแ
แแแแแแถแแแแแแถแแแแทแแแแถแแธแฅแแทแแถแแแแแแแแพแแแถแแแ
แแพแแธแแปแ
แ แแแโแแถโแแแถแโแแถโแแโแแถแโแแแปแแแโแแถโแ
แแแพแโแแถแโแฎโแขแแแธ strace
แแถแแขแแปแแแแแแแแแแแพ ptrace(2)
แ แพแแแ
แแแแปแแแแแแแถแแแแ แแพแแแทแแขแถแ
แแแแแถแแแขแแแธแแแแปแแแแแถแแ แ
แแแแแแแแแแแแแพแแแแแผแแแแแแแแแแแพแแแถแแแแแแ แง. แงแแถแ แแแ แแถแแแแแแแแถ
$ time strace du /usr/share/ >/dev/null 2>&1
real 0m3.081s
user 0m0.531s
sys 0m2.073s
ะธ
$ time strace -e open du /usr/share/ >/dev/null 2>&1
real 0m2.404s
user 0m0.193s
sys 0m1.800s
แแแแผแแแถแแแแแพแแแถแแแแแปแแแแแแแแแแแ แแแแผแ แแแแถ แแแแแธแแถแแ แแแแปแแแแแธแแธแแธแ แแพแแ แแแแถแแแถแแแถแแ แ แแถแแแแแแแแแแแแแฝแแแแแแแ
แแแแแพแแแแแธแ --seccomp-bpf
, แแถแแแแแแแแแ
strace
แแแแ 5.3 แขแแปแแแแถแแฑแแแขแแแแแแแแพแแแแแฟแแแแแพแแแถแแแถแ
แแแพแแแ แ แพแแแแแแแแถแ
แถแแแแแแพแแแ
แแแแแแแถแแแแแถแแ แ
แแแแแแแแแแฝแแแบแขแถแ
แแแแแแแแแแ
แแนแแแแแแแแถแแแแถแแ
แถแแแแแแพแแแแแแแถแแฝแ
แแ
แ แพแแ
$ time strace --seccomp-bpf -e open du /usr/share/ >/dev/null 2>&1
real 0m0.148s
user 0m0.017s
sys 0m0.131s
$ time du /usr/share/ >/dev/null 2>&1
real 0m0.140s
user 0m0.024s
sys 0m0.116s
(แแถแแถแแแทแแแถแแ แแ
แแธแแแแแถแแแถแแแแแแแแแแแแแแแทแ
แแแแแฝแ
แแแแแถแแพแแแทแแแถแแแถแแแถแแแถแแ แ
แแแแแแแแแแแแถแแแแแแถแแแแแแแแถแแแแ แแแแแทแแแพแแพแแแแแปแแแถแแแถแ แงแแถแ แแแแ newfsstat
แแแแแถแแแแ strace
แแนแแ แแแแแถแแแแแแถแแแแผแ
แแถแแแแถแ --seccomp-bpf
.)
แแพแแแแแพแแแแแแแแพแแแถแแแแถแแแผแ
แแแแแ
? แแแแแแแถแแแถแ strace
แแแแถแแแแ
แแแแพแแแถแ แ แพแแ
แถแแแแแแพแแแถแแแแแแแพ PTRACE_SYSCALL
. แแ
แแแแแแแแแแพแแแถแแแแแแถแแแแแแแแแแแแถแแแแแ แถ (แแถแแฝแ) แแถแแ แ
แแแแแแแแ แแถแแแแแแแแแแแแแแผแแแถแแแแแแแแ
strace
แแแแแพแแขแถแแปแแแแแแแแแถแแ แ
แแแแแแแแ แแทแแแแแพแแแถแแแถแแถแแฝแ PTRACE_SYSCALL
. แแแแแถแแแแธแแแแแแแ แแแแพแแแถแแแแแ
แแแแถแแ แ
แแแแแแแแ แ แพแแแ
แแแแ
แแแแธแแถ แแถแแแแแแแแแแแแแแผแแแถแแแแแแแแแแแแแ strace
แแแแแพแแแแแแแแแแกแแ แแทแแ
แถแแแแแแพแแแแแพแแแถแแแแแแแแพ PTRACE_SYSCALL
, แโแแ
แแแแแถแแแถแแแถแแแแแแแถแแฝแแแนแ seccomp แแแแพแแแถแแแแแขแถแ
แแแแผแแแถแแแแแพแฑแแแแแแแพแแแแถแแแทแแแแแถแแแแถแแแแแแพแแ
แแแแถแแ แแแแแบแแพแแพแแ
แแแแพแแแแแถแแ แ
แแถแแแแแแแแแ X
แแแแแถแแแแแแพแแขแถแ
แแแแแแแแแแ BPF แแแแแแแแถแแ X
แแแแกแแแแแแแแแฝแแ SECCOMP_RET_TRACE
แแทแแแแแแถแแแแถแแ แ
แแผแแแแแแแแแแแทแแ
แถแแแขแถแแแแแแแ
แแแแแแพแ - SECCOMP_RET_ALLOW
:
ld [0]
jneq #X, ignore
trace: ret #0x7ff00000
ignore: ret #0x7fff0000
แแ
แแแแปแแแแแธแแแ strace
แแแแผแแ
แถแแแแแแพแแแแแพแแแถแแแผแ
PTRACE_CONT
แแแแแแแแแแแพแแแแแผแแแถแแแแแพแแแถแแแแแแถแแแแถแแ แ
แแถแแแแแแแแแแแธแแฝแแ แแแแแทแแแพแแถแแ แ
แแถแแแแแแแแแแแทแแแถแ X
แแแแแถแแแแแแแแพแแแถแแแ
แแแแแแ แแแปแแแแแแแแแทแแแพแแแแ X
แแแแแถแแแแ seccomp แแนแแแแแแแแถแแแแแแแแแแ strace
แแแแแนแแแทแแทแแแแแพแแขแถแแปแแแแแ แแทแแ
แถแแแแแแพแแแแแพแแแถแแแผแ
PTRACE_SYSCALL
(แ
แถแแแแถแแแแธ seccomp แแทแแแถแแแแแแแแถแแแแแปแแแถแแแแแพแแแถแแแแแแแทแแธแแ
แแแแ
แแแแธแแถแแ แ
แแแแแแแแ) แ แแ
แแแแแแแแถแแ แ
แแแแแแแแแแแแกแแแแแแทแ, strace
แแนแแ
แถแแแแแแพแแแแแพแแแถแแกแพแแแทแแแแแแแแพ PTRACE_CONT
แ แพแแแนแแแแแ
แถแแแถแแแแแธแแธ seccompแ
แแ
แแแแแแแพแแแแแพแ --seccomp-bpf
แแถแแแถแแแนแแแแแแนแแแธแแ แแธแแฝแ แแถแแนแแแทแแขแถแ
แ
แผแแแฝแแแแแพแแแถแแแแแแถแแแแแถแแ (แแแแแพแ -p
แแแแแแทแแธ strace
) แแแแแถแแแถแแทแแแแแผแแแถแแแถแแแแแแแ seccomp แ แแธแแธแแแบแแแแถแแแแแแแถแแแแ แแทแแแถแ แแผแแแแแกแแแแพแแแแแพแแแถแแแปแแถแ แแแแแแแแแแ seccomp แแแแผแแแถแแแแฝแแแแแแแแแแแแพแแแถแแแปแแถแแแถแแแขแแ แแแแแทแแแถแแแแแแแถแแแทแแแแแพแแแถแแแแแ
แแแแขแทแแแแแแทแ
แแแแขแแแธแแแแแแแแแทแแแแแถแแ strace
แแแแพแแถแแแถแแฝแ seccomp
แขแถแ
แแแแถแแแธ
xt_bpf
แฅแกแผแแแแ แ แผแแแพแแแแแแแแแ แแทแแแแแแแแแถแแแทแแ
แแแแแแแแทแ แแถแแแธแแผแแแถแแแถแแแแแ แพแ แแแแปแแแแแถแ แขแ แ แง แแแแผแแแบ xt_u32
แแแแแถแแ netfilter แ แแถโแแแแผแโแแถแโแแแแแโแแแโแแถแโแแแแแแแแผแ
โแแถโแแฝแโแแนแโแแถแโแ
แถแแโแแแแถแแโแ
แแถแ
แแแโแแปแแถแโแแถแแโแแโแ
แแแพแโ cls_u32
แแทแแขแแปแแแแถแแฑแแแขแแแแแแแแแแแแฝแแแแแแแแแแแแแแธแแแถแแขแแแพแ
แทแแแแแแแแถแแ iptables แแแแแแแพแแแแแทแแแแแทแแถแแแถแแแแแแถแแแแแแแ แแแแปแ 32 แแแธแแแธแแแแ
แแแแฝแ แ แพแแขแแปแแแแแแแแปแแแแแแแแทแแแแแทแแถแแแแแแแแแแพแแฝแแแถแ แงแแถแ แแแ,
sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"
แแแแปแ 32 แแแธแแแแแแแแแถ IP แแแแ
แถแแแแแแพแแแธ padding 6 แ แพแแขแแปแแแแแแแถแแแแฝแแแ
แแฝแแแถ 0xFF
(แแแแแแถแ) แ แแถแแแแแ protocol
แแแแแแถ IP แ แพแแแพแแแแแแแแแแแถแแถแแฝแ 1 (ICMP) แ แขแแแแขแถแ
แแแแ
แผแแแแแถแแผแแแถแแแแแฝแแแทแแทแแแแแถแ
แแแพแแแ
แแแแปแแ
แแแถแแแแฝแ แ แพแแขแแแแแแขแถแ
แแแแแทแแแแแทแแแแแทแแแแแทแแแแแแแแ @
- แแแแถแแแแธ X bytes แแ
แแถแแแแแถแแ แงแแถแ แแแแ
แแแถแแ
iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"
แแทแแทแแแแแพแแแถแแพแแแแแแแถแแ TCP แแทแแแแแพแแแแถ 0x29
. แแแแปแโแแนแโแแทแโแแทแแถแโแแแแขแทแโแแแแแแโแแแโแแ แแแแแโแแถโแ
แแแถแแโแ แพแโแแถโแแถแโแแแแแโแ
แแแถแแโแแแโแแแโแแแโแแโแแทแโแแผแโแแแแฝแโแแแ แแ
แแแแปแแขแแแแแ xt_u32
. แแผแแแพแแแแแแแแผแแแแแแแแถแแแแ
แ
แปแแแแแ
แแแแแขแแแแแแแแแ
แ
แถแแแแถแแแแธแแแแถแ 2013 แแแผแแปแแแแแฝแแฑแแแแแผแแปแ xt_u32
แขแแแแขแถแ
แแแแพแแแผแแปแแแแแแถแแแผแแแแแถแแแพ BPF xt_bpf
. แแแแถแแแแถแแแแแแแถแแขแถแแแแแถแแแแแแฝแแแแ
แแแถแแแแฝแ
แ แพแแขแแแธแแแแแถแแแแแแแแแแทแแแแแทแแถแแแแแแแถ: แแแแพแแแถแ BPF bytecode แแถแ
แแแถแแ iptables แ แขแแแแขแถแ
แแแแแพแแ
แแแถแแแแแแธแงแแถแ แแแแแผแ
แแแแ
iptables -A INPUT -m bpf --bytecode <ะฑะฐะนัะบะพะด> -j LOG
แแ
แแธแแแ <ะฑะฐะนัะบะพะด>
- แแแแแบแแถแแผแแแ
แแแแปแแแแแแแแแแแแแแแแแ assembler bpf_asm
แแถแแแแแถแแแพแ แงแแถแ แแแ
$ cat /tmp/test.bpf
ldb [9]
jneq #17, ignore
ret #1
ignore: ret #0
$ bpf_asm /tmp/test.bpf
4,48 0 0 9,21 0 1 17,6 0 0 1,6 0 0 0,
# iptables -A INPUT -m bpf --bytecode "$(bpf_asm /tmp/test.bpf)" -j LOG
แแแแปแแงแแถแ แแแแแแ แแพแแแแแปแแแแแแแแแ
แแ UDP แแถแแแขแแแ แแแทแแแแแแแถแแแแแแแแทแแธ BPF แแ
แแแแปแแแแผแแปแแแฝแแ xt_bpf
แแถแแถแแแทแแแถแแ แ
แแแขแปแแแ
แแทแแแแแแแแแแ
แแแแแแแแถแ แแแแปแแแแแธ iptables แแ
แแถแแ
แถแแแแแแพแแแแแแแแแถ IPv4 แ แแแแกแแแแแแแแแธแแแแแแทแแธ BPF false
แแถแแแแแแถแแแแ
แแแแแแแแถแแแทแแแแแผแแแแแถแ
แแถแ
แแแถแแแแถแแแแถแแแผแแปแ xt_bpf
แแถแแแแแแแแแแแแแปแแแแแถแแแถแแงแแถแ แแแแแถแแแพแ แแผแแแแแกแแแแพแแงแแถแ แแแแแถแแแแแแแแแธ Cloudfare แ แแ แผแแแแแแแแแแแแแธแแแแแแฝแแแแแถแแแแแพแแแผแแปแ xt_bpf
แแพแแแแธแแถแแแถแแแแแแถแแแแนแแแถแแแถแแแแแ แถแ DDoS แ แแ
แแแแปแแขแแแแแ bpfgen
แขแแแแขแถแ
แแแแแพแแแแแแแทแแธ BPF แแแแแแแผแแแแแถแแนแแแแแฝแ DNS แแแแแถแแแแแแแแแฝแแ habr.com
:
$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax
lb_0:
ld [x + 0]
jneq #0x04686162, lb_1
ld [x + 4]
jneq #0x7203636f, lb_1
ldh [x + 8]
jneq #0x6d00, lb_1
ret #65535
lb_1:
ret #0
แแ
แแแแปแแแแแแแทแแธแแแแผแแแพแแแแแ
แผแแแ
แแแแปแแ
แปแแแแแแ X
แขแถแแแแแแถแแ
แถแแแแแแพแแแแแแถแแ x04habrx03comx00
แแ
แแถแแแแแปแ UDP datagram แ แพแแแแแแถแแแแแแทแแทแแแแแพแแแแแพแ 0x04686162 <-> "x04hab"
แ แพแแแผแ
แแแแแแ
แแพแ
แแแแแทแ
แแแแแแแ Cloudfare แแถแแแแแแปแแแแแผแ p0f -> BPF compiler codeแ แแ
แแแแปแแขแแแแแ
$ ./bpfgen p0f -- 4:64:0:0:*,0::ack+:0
39,0 0 0 0,48 0 0 8,37 35 0 64,37 0 34 29,48 0 0 0,
84 0 0 15,21 0 31 5,48 0 0 9,21 0 29 6,40 0 0 6,
...
แแแแแแแแแแแแแพ Cloudfare แแแแ แพแ xt_bpf
แ
แถแแแแถแแแแธแแฝแแแแแถแแแแแถแแแแ
XDP - แแแแแพแแแฝแแแแแปแแ
แแแแแแแแแพแแแแแแถแแแแถแแแแแพแแแแถแแแแแแแแแแธแแ BPF แแผแแแพแแ
cls_bpf
แงแแถแ แแแแ
แปแแแแแแแแแแถแแแแแพ BPF แแปแแถแแแ
แแแแปแแแบแแแแแบแแถแขแแแแ
แถแแแแแแถแแ cls_bpf
แแแแแถแแแแแแแแแแแแแแแแแแแแแแ
แแถแ
แแแแแ
แแแแปแแแธแแปแ
แแแแแแแแ
แแธแแปแ
แแ
แ
แปแแแแแถแ 2013 แแทแแแแแฝแแแแแแแแทแแแปแแถแแ cls_u32
.
แแแแแถแแแถแแแถแแแแแแฅแกแผแแแแแแพแแแนแแแทแแแทแแแแแถแขแแแธแแถแแแถแแแแแแแ cls_bpf
แ
แถแแแแถแแแแธแแแแแแแแแ
แแแแแแนแแขแแแธ BPF แแปแแถแแแแแแนแแแทแแแแแแแฑแแแแพแแแผแแขแแแธแแแแแ - แแพแแแถแแแแแถแแแแปแแแถแแแถแแแขแแแแฝแ
แ แพแแ แแพแแแธแแแแแแแแ
แแแแปแแขแแแแแแแถแแแแแแแแแถแแแแแแแทแแถแแขแแแธ Extended BPF แแพแแแนแแแฝแแขแแแแ
แถแแแแแแถแแแแแแ
แแแพแแแถแแแแแแ
แ แแแปแแแแฝแแแแแแแแแทแแแทแแถแแขแแแธแแถแแแแแพแแแแถแแ BPF แแปแแถแ c cls_bpf
แแแแ แถแแบแแถ แแพแแแแแแแแแแ
แแนแ Extended BPF แแทแแถแแแถแแแแแถแแขแแปแแแแแแแแปแแแแแธแแแแแแแผแแแถแแแฝแแแผแ
แแแถแแแแแถแแแ แแแแแแทแแธแแปแแถแแแทแแขแถแ
แแแแถแแแแแแผแแแแแนแแแถแแแแแแแ
แแ แแทแแแทแแขแถแ
แแแแแถแแปแแแแแถแแแถแแแแถแแแถแแ แ
แแผแแแแแแแถแแแแ
แแผแ แแแแแแถแแแแแแแแแแแแแผแแแทแแถแแแถแแ BPF แแปแแถแ แ แพแแแพแแแ แขแแถแแแ
แแถแแ BPF แแปแแถแ
แแพแแแถแแแพแแแธแแแแแแแแแ
แแ
แแแแทแแแแถ BPF แแแแแแแผแแแถแแแแแแพแแกแพแแแ
แแพแแแแแแแแแแแธ 32 แแแแแ
แแแแแแแแแแแแแปแแแแแแแแแฝแแแถแแแฝแแแแแแแแแ แ แพแแแ แผแแแแแ
แปแแแแแ
แแแแถแแแแแพแแแแแแแทแแธแแแแธแ แแแแแแถแแแถแแแแแ แแแแแแแแแแถแแ
แแนแแแถแแแแแถแแแแแแผแแแธแแแถแแแธแแแแแแ
RISC แแแแแถแแแแแแพแแถแแแแแถแแแแปแแ
แแแถแแแแแแถแแแแถแแขแแทแแแแ BPF แแปแแถแแแ
แแแแปแแแแแแแแแแแแแถแ 64 แแถแแแถแแแแแถแแแแแแผแแแธแแแถแแแธแ XNUMX แแแธแแแ
XNUMX แแแธแ แ แพแ BPF แแปแแถแแแถแแ
แถแแแแแแพแแแแแแแแพแ แแพแแแธแแแแแแแแแแแแแถแแแแแ BPF แแปแแถแแแถแแแแแแทแแแแแถแแแแถแแ แ แพแแแแแแแแแธแแพแแแแถแแแแแแแแแ แฝแแแแแ - แแพแแแทแแแถแแแแแแแแถแแแแแปแแแถแแแแแแถแแปแแแแแถแแแถแแแแถแแแถแแ แ
แแ
แแถแแแแแแแแทแแธ BPF แแทแแแถแแแแแแแถแแแแขแแแแแแแแแแแแแขแแแแแแแพแแแแแแแถแแแแแแถแแทแแแถแแแแแแแถแแแแแพแขแแแแแแแแแแแ แแถแแฝแแแบแแแ แแพแแแแแแแแถแแขแถแแ
แแแฝแแแแแแแแแแถแแแ
แแถแแแแแแแแ sk_buff
แแทแแแถแแแพแแแแแพแแแถแแแปแแแถแแแแแฝแแแถแแแแแถแแแแแแแแปแ แขแแแแแทแแขแถแ
แแแแถแแแแแแผแแแแแนแแแถแแแแแแแ
แแแแแแแแถแ แแทแแแแแแผแแแแแแแฝแแแถแแถแแแแ
แแถแแแทแแแ แแ แแ แปแแแแแแแแแ แขแแแธแแถแแแขแแแแแแแ แแแแแแแแ BPF แแปแแถแแแ แแแแปแแแธแแปแ แแบแแถแ แแแปแ แแแแแถแแ API แ แพแแแ แแถแแแแแปแแแบแแแแแแแแแทแแธแแปแแถแแแถแแแขแแ แแทแแแถแแถแแถแแแแแแแแแ แฌแแแแแ seccomp แแแแผแแแถแแแแแแแแแแแแแแแแแแแแแแแทแแ แแถแแแแแแแแแแธ Extended BPF แ (แแพแแแนแแแทแแถแแขแแแธแแแแแแแแแถแแพแแกแพแแแ แแแแปแแขแแแแแแแแแแถแแแ )
แแถแแแแแถแแแแแแผแแแ
แแถแแแแแแถแแแแแแแแแแแแธแแถแแ
แถแแแแแแพแแแ
แแแแปแแแแแถแ 2013 แแ
แแแแแแ Alexey Starovoitov แแถแแแแแพแแแแแแแแแแพแแ
แแ
แปแแแแแแแแถแ BPF แ แแ
แแแแถแ 2014 แแแแแแแแแแแผแแแแแถแ
แขแแแแแแแแแแแแแแแแ แแแแปแแแแแแธแแแแแนแแแแแแแแแแแแแพแแแแถแแแแแแแแ แแทแแแแแแแทแแธแแแแ แแ แแแแทแแแแถแแแแธ แแแแแแแผแแแแแแแถแแแแถแแถ BPF แแถแแแแแปแ แแแแแถแแแแแแแแแธแ BPF แ แพแแฅแกแผแแแแแแถแแแแแแถ BPF แ
แแแ แแแแธแแแ
- Steven McCanne แแทแ Van Jacobson, "The BSD Packet Filter: A New Architecture for User-level Packet Capture",
https://www.tcpdump.org/papers/bpf-usenix93.pdf
- Steven McCanne, "libpcap: แแแแถแแแแแแแแ แแทแแแทแแธแแถแแแแแแแแแแพแแแแแแทแแแแแถแแแแแแถแแแแถแแ
แถแแแแแแแแ
แแ",
https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
tcpdump
,libpcap
:https://www.tcpdump.org/ แแถแแแแแแแแขแแแธแแถแแแแแแฝแ IPtable U32 .- BPF - แแแแแผแแแแแแแแแแแ
แ
https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
- แแถแแแแแถแแงแแแแแ BPFแ
https://blog.cloudflare.com/introducing-the-bpf-tools/
bpf_cls
:http://man7.org/linux/man-pages/man8/tc-bpf.8.html
- แแทแแแแแถแแแผแแ
แแฝแแแทแแถแแธแ
https://lwn.net/Articles/656307/
https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
habrแ แแปแแแบแแแ แแทแแแปแแแแแทแแถแแ seccomp habr: แแแแแแแทแแแถแแฝแแแแแแแแแแฌ "แขแแแแแทแแแแแผแแแถแ Docker แแแแแถแแแแฟแแแแแแ!" - Paul Chaignon, "strace --seccomp-bpf: a look under the hood",
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
netsniff-ng
:http://netsniff-ng.org/
แแแแแ: www.habr.com