Berkeley Packet Filters (BPF) แแ แแก Linux-แแก แแแ แแแแก แขแแฅแแแแแแแ, แ แแแแแแช แฃแแแ แ แแแแแแแแ แฌแแแแ แแแแแแกแฃแ แแแแแแแ แขแแฅแแแแฃแ แ แแแแแชแแแแแแก แแแ แแแ แแแแ แแแแแแ. แแแแคแแ แแแชแแแแ แแแกแแแ แแแแแ แแจแแแแ BPF-แแก แแแแแงแแแแแแกแ แแ แแแแแแแแ แแแแก แจแแกแแฎแแ. แแแแแ แแแแแ แ, Linux แฅแกแแแแก แฅแแแกแแกแขแแแแก แจแแแกแ แฃแแแแแแ, แฃแฌแแแแแก แแแแแก แแแแแกแแแแก Linux Plumbers 2018-แแ
แฏแแ แแแแแ แแ แแ แแก BPF-แแก แกแแกแขแแแฃแ แ แแฆแฌแแ แ Habrรฉ-แแ แแ แแแแขแแ แกแขแแขแแแแแก แกแแ แแแจแ แจแแแแชแแแแ แแแกแแฃแแ แ แขแแฅแแแแแแแแก แแกแขแแ แแแแ, แแฆแแฌแแ แ แแ แฅแแขแแฅแขแฃแ แแกแ แแ แแแแแแแแ แแแแก แแแกแขแ แฃแแแแขแแแ แแ แแแแแแงแ BPF แแแแแงแแแแแแก แแแแแงแแแแแแก แกแคแแ แแแแ แแ แแ แแฅแขแแแ. แแก แกแขแแขแแ, แแฃแแแแแแ, แกแแ แแแจแ, แแแแแแแฎแ แแแก แแแแกแแแฃแ แ BPF-แแก แแกแขแแ แแแกแ แแ แแ แฅแแขแแฅแขแฃแ แแก แแ แแกแแแ แแแแแแก แแแกแ แแแฅแแแแแแแก แแ แแแชแแแแแแก แกแแแแฃแแแแแแแแก. tcpdump
, seccomp
, strace
, แแ แฃแคแ แ แแแขแ.
BPF-แแก แแแแแแแแ แแแแก แแแแแขแ แแแแแก Linux แฅแกแแแแก แกแแแแแแแแแแ, BPF-แแก แซแแ แแแแแ แแ แกแแแฃแแ แแแแแแแชแแแแ แแแแแแจแแ แแแฃแแแ แฅแกแแแแแแแ แแ, แจแแกแแแแแแกแแ, แแแแแ แแแแ
แแแแแ แแฃแ แกแ BPF-แแก แแกแขแแ แแแจแ (c)
แแแแแแแแ แแแ BPF แขแแฅแแแแแแแ แแ แแก แแแแแ แกแแฎแแแแก แซแแแแ แขแแฅแแแแแแแแก แแแฃแแฏแแแแกแแแฃแแ แแ แแแคแแ แแแแแฃแแ แแแ แกแแ, แ แแแแแกแแช แแฎแแ แแแแกแแแฃแ BPF-แก แฃแฌแแแแแแ แแแแแแฃแแแแแก แแแแแแแ แแกแแชแแแแแแแ. แชแแแแแแ แฃแขแแแแขแ แจแแแฅแแแ แแแแกแแแฃแ แ BPF-แแก แกแแคแฃแซแแแแแ tcpdump
, แแแฅแแแแแแ seccomp
, แแกแแแ แ แแแแ แช แแแแแแแแ แชแแแแแแ แแแแฃแแแแ xt_bpf
แแแแกแแแแก iptables
แแ แแแแกแแคแแแแขแแ แ cls_bpf
. แแแแแแแแ แแแ Linux-แจแ แแแแกแแแฃแ แ BPF แแ แแแ แแแแแ แแแขแแแแขแฃแ แแ แแแแ แแแแแแ แแฎแแ แคแแ แแแจแ, แแฃแแชแ, แแแแฎแแแ แแแแแก แแแแแกแแแ แแกแแ, API แแแ แฉแ แแแแแแแ แแ แแแแกแแแฃแ แ BPF-แแก แแฎแแแ แแแแแงแแแแแ, แ แแแแ แช แแ แกแขแแขแแแจแ แแแแแแแฎแแแ, แฏแแ แแแแแ แแแฎแแแแแ. แแ แแแแแแแ แแ แแกแแแ แแแแก แแแแ, แ แแ Linux-แจแ แแแแกแแแฃแ แ BPF-แแก แแแแแแแแ แแแแก แแกแขแแ แแแก แจแแแแแ, แฃแคแ แ แแแแแแ แแแฎแแแแ, แแฃ แ แแแแ แแ แ แแขแแ แฉแแแแงแแแแแแ แแแ แแแก แแแแแแแแ แแแ แคแแ แแแจแ, แแแแแแฌแงแแแขแ แแแแแฌแงแ แกแขแแขแแแ แแแแกแแแฃแ แ BPF-แแก แจแแกแแฎแแ.
แแแกแฃแแ แกแแฃแแฃแแแก แแแฎแแแชแแแแ แฌแแแแแก แแแแแก, แชแแแแแแ แแแฃแ แแแก แแแ แแแแก แแแแแ แแขแแ แแแก แแแแแแ แแแ แแแแแขแแ แแกแแแแ แแแแฎแแแแ, แแฃ แ แแแแ แกแฌแแ แแ แแแคแแแขแ แแ แฅแกแแแแก แแแแแขแแแ แแแแ แแขแฃแ แแแ, แ แแแแแแช แแแแแแแแ แแแ แแงแ แแแกแฃแแ แกแแฃแแฃแแแก แแแฎแแแชแแแแ แฌแแแแแก แแแแแก. แคแแแขแ แแชแแแก แซแแ แแแแแ แแแแ, แ แแแแแแช แแแแแแแแ แแแแแ แแแแฎแแ แชแแแแแ CSPF (CMU/Stanford Packet Filter) แขแแฅแแแแแแแแจแ, แแงแ แแ แแกแแญแแ แ แแแแแขแแแแก แ แแช แจแแแซแแแแ แแแ แ แแแคแแแขแแ แ, แ.แ. แแแ แแแแก แกแแแ แชแแจแ, แ แแแแแ แแก แแแแแแแ แแแชแแแแแก แแ แแกแแญแแ แ แแแแแชแแแแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แแแแแ แแแแก. แแแ แแแแก แกแแแ แชแแจแ แแแแฎแแแ แแแแแก แแแแแก แแแจแแแแแก แฃแกแแคแ แแฎแแแแแก แฃแแ แฃแแแแแกแแงแแคแแ, แแแแแงแแแแแฃแแ แแฅแแ sandboxed แแแ แขแฃแแแฃแ แ แแแแฅแแแ.
แแฃแแชแ, แแ แกแแแฃแแ แคแแแขแ แแแแก แแแ แขแฃแแแฃแ แ แแแแฅแแแแแ แจแแฅแแแแแแ แกแขแแแแ แแแคแฃแซแแแแฃแ แแแแฅแแแแแแ แแฃแจแแแแแกแแแแก แแ แแ แแฃแจแแแแแแแ แแกแ แแคแแฅแขแฃแ แแ แแฎแแ RISC แแแแ แแขแแแแ. แจแแแแแแ, Berkeley Labs-แแก แแแแแแ แแแแก แซแแแแกแฎแแแแแ, แจแแแฅแแแ แแฎแแแ BPF (Berkeley Packet Filters) แขแแฅแแแแแแแ, แ แแแแแก แแแ แขแฃแแแฃแ แ แแแแฅแแแแก แแ แฅแแขแแฅแขแฃแ แ แจแแแฅแแแ Motorola 6502 แแ แแชแแกแแ แแก แกแแคแฃแซแแแแแ - แแกแแแ แชแแแแแแ แแ แแแฃแฅแขแแแแก แแฃแจแ.
BPF แแแแฅแแแแแแก แแ แฅแแขแแฅแขแฃแ แ
แแ แฅแแขแแฅแขแฃแ แแก แกแแแฃแจแแ แแแแ, แแแแแแแแแแแก แแแแแแแแ แแแแแชแแแแแ. แแฃแแชแ, แแแกแแฌแงแแกแแกแแแแก, แแแฅแแแ, แ แแ แแแแ แแขแก แฐแฅแแแแ แแแแฎแแแ แแแแแกแแแแก แฎแแแแแกแแฌแแแแแ แแ แ 32-แแแขแแแแ แ แแแแกแขแ แ, แแแฃแแฃแแแขแแ แ. A
แแ แแแแแฅแกแแก แ แแแกแขแ แ X
, 64 แแแแขแ แแแฎแกแแแ แแแ (16 แกแแขแงแแ), แฎแแแแแกแแฌแแแแแแ แฉแแกแแฌแแ แแ แแ แจแแแแแแ แฌแแกแแแแแฎแแ แแ แแ แซแแแแแแแแก แแชแแ แ แกแแกแขแแแ แแ แแแแแฅแขแแแแแ แแฃแจแแแแแกแแแแก. แแแ แแแแแ แแแแแแแแฅแแแแแแแก แแแแฎแแ แชแแแแแแแก แแแฎแขแแแแก แแแกแขแ แฃแฅแชแแแแ แแกแแแ แฎแแแแแกแแฌแแแแแ แแงแ แแ แแแ แแแแแจแ, แแแแ แแ แแ แแแ แแแแก แแ แแฃแแแ แแแกแ แฃแแแแแก แแแ แแแขแแ แแแแกแแแแก, แแแฎแขแแแแแ แแฎแแแแ แฌแแ แแงแ แจแแกแแซแแแแแแ, แแแฃ, แแแ แซแแ, แแแ แซแแแฃแแ แแงแ แแแ แงแฃแแแแแก แจแแฅแแแ.
แแแแ แแขแแก แแแจแแแแแก แแแแแแ แกแฅแแแ แจแแแแแแแ. แแแแฎแแแ แแแแแ แฅแแแแก แแ แแแ แแแแก BPF แแ แฅแแขแแฅแขแฃแ แแกแแแแก แแ แแงแแแแแก แแแแแแ แแ แแแ แแแแก แแแฅแแแแแแ (แ แแแแ แแชแแ แกแแกแขแแแฃแ แ แแแ แ), แแขแแแ แแแแ แแ แแแแแจแแ แแแก แแ แแแ แแแแก แแแแแแ แแก แแแแแแแแแแก แแแแแ แแขแแ แก แแแ แแแจแ (แแแแแแแแแ, แแแแแแแ แแ แแก แฅแกแแแแก แแแ แแแแ แจแแแแแแ แแแแแขแแก แฉแแแแกแแแ). แ แแแแกแแช แแแแแแแ แฎแแแแ, แแแ แแแ แแฌแแ แแแแแก แแ แแแ แแแแก (แแแแแแแแแ, แแแ แฏแแแแแจแ) แแ แแแแฅแแแแก แแแฎแกแแแ แแแ แจแแแกแแแแแแแ แแแแแแ แแก แแแ แแแแก แแแฎแกแแแ แแแแก แ แแแแแแ (แแแแแแแแแ, แจแแแแแแแแแ แแแแแขแแก แแแแแชแแแแแ).
แแแแแ แฉแแแแแแแแแ แกแแแแแ แแกแ แแฅแแแแ แแแแกแแแแแก, แ แแ แแแแแฌแงแแ แแแแแแแแแแแก แงแฃแ แแแ: แกแแญแแ แแแแแกแแแแแ แแแแแชแแแแแ แกแแกแขแแแแก แแ แแ แซแแแแแแก แคแแ แแแขแก. แแฃ แแกแฃแ แ แแแฃแงแแแแแแแแ แจแแแกแฌแแแแแ แแแ แขแฃแแแฃแ แ แแแแฅแแแแก แแ แซแแแแแแก แกแแกแขแแแ แแ แแแแชแแแ แแแก แงแแแแ แจแแกแแซแแแแแแแแแก, แแแจแแ แจแแแแซแแแแ แฌแแแแแแฎแแ แแ แแแแแแแฃแ แ แกแขแแขแแ libpcap
: แแ แฅแแขแแฅแขแฃแ แ แแ แแแขแแแแแแชแแแก แแแแแแแแแแแ แแแแแขแแก แแแญแแ แแกแแแแกlibpcap
.
แแฎแแ แฉแแแ แแแแแแฎแแแแแ Linux-แแ แแแแกแแแฃแ แ BPF-แแก แแแแแงแแแแแแก แงแแแแ แแแแจแแแแแแแแ แแแแแแแแก: tcpdump
(libpcap
), แกแแแแแแ, xt_bpf
, cls_bpf
.
tcpdump
BPF-แแก แจแแแฃแจแแแแแ แแแแฎแแ แชแแแแแ แแแแแขแแแแก แคแแแขแ แแชแแแก แฌแแแ แแแฌแแแแก แจแแแฃแจแแแแแแก แแแ แแแแแฃแ แแ - แชแแแแแแ แแ แแแ แแแ. tcpdump
. แแ แ แแแแแ แแก แแ แแก แแแแกแแแฃแ แ BPF แแแแแงแแแแแแก แฃแซแแแแแกแ แแ แงแแแแแแ แชแแแแแแ แแแแแแแแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ แแแแ แแแแ แแชแแฃแ แกแแกแขแแแแแ, แฉแแแ แแแแแฌแงแแแ แแ แขแแฅแแแแแแแแก แจแแกแฌแแแแแก.
(แแ แกแขแแขแแแจแ แงแแแแ แแแแแแแแ แแแแแขแแ แ Linux-แแ 5.6.0-rc6
. แแแแแแ แแ แแ แซแแแแแแก แแแแแแแแแแ แ แแแแฅแขแแ แแแฃแแแ แฃแแแแแกแ แฌแแแแแฎแแแกแแแแก.)
แแแแแแแแ: IPv6 แแแแแขแแแแ แแแแแแ แแแแ
แฌแแ แแแแแแแแแแ, แ แแ แฉแแแ แแแแแแ แจแแแฎแแแแ แงแแแแ IPv6 แแแแแขแก แแแขแแ แคแแแกแแ eth0
. แแแแกแแแแแก แฉแแแ แจแแแแแซแแแ แแแแฃแจแแแ แแ แแแ แแแ tcpdump
แแแ แขแแแ แคแแแขแ แแ ip6
:
$ sudo tcpdump -i eth0 ip6
แแ แจแแแแฎแแแแแจแ, tcpdump
แแแแแแก แคแแแขแ แก ip6
BPF แแ แฅแแขแแฅแขแฃแ แแก แแแแขแแแแแจแ แแ แแแแแแแแแ แแก แแแ แแแจแ (แแฎแแแแ แแแขแแแแแ แแแแงแแคแแแแแแจแ 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)
แแแแแแแแแแแฃแแ แฅแกแแแแก แแแแแขแแก แ แแแแขแ. แฉแแแ แแแแแฎแฃแแแแ แแแแแขแแแก Ethernet แแแขแแ แคแแแกแแแแ eth0
, แแ แแก
6 6 2
|Destination MAC|Source MAC|Ether Type|...|
แแกแ แ แแ, แแ แซแแแแแแก แจแแกแ แฃแแแแแก แจแแแแแ ldh [12]
แ แแแกแขแ แจแ A
แแฅแแแแ แแแแ Ether Type
- แแ Ethernet แฉแแ แฉแแจแ แแแแแชแแแฃแแ แแแแแขแแก แขแแแ. 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 แแแแแขแ (แแแแ แแก แขแแแ = 0x800
) แแ แฉแแขแแแ แแแ แแก แ แแแกแขแ แจแ A
แแแแแขแแก 24-แ แแแแขแ. แฉแแแแ แแแแแขแ แแกแ แแแแแแงแฃแ แแแ
14 8 1 1
|ethernet header|ip fields|ttl|protocol|...|
แ แแช แแแจแแแแก, แ แแ แฉแแแ แแขแแแ แแแแ แ แแแกแขแ แจแ A
IP แกแแแแฃแ แแก แแ แแขแแแแแแก แแแแ, แ แแช แแแแแแฃแ แแ, แ แแแแแ แแแแแแ แแฎแแแแ TCP แแแแแขแแแแก แแแแแ แแแ. แฉแแแ แจแแแแแแ แแแ แแ แแขแแแแแก 0x6
(IPPROTO_TCP
แแ-4 แแ แแ-5 แกแขแ แแฅแแแแแแ แแขแแแ แแแแ แแ-20 แแแกแแแแ แแแ แแแแแแ แ แแแฎแแแแ แกแแขแงแแแแก แแ แแแงแแแแแ แแ แซแแแแแแก jset
แจแแแแแฌแแแ แแ แแก แแฃ แแ แ แกแแแแแแ แแ แแ jset
แกแแแ แงแแแแแแ แแแแจแแแแแแแแแ แแแขแ แแแกแฃแคแแแแแแฃแแแ. แกแแแ แแแขแแแแ แแ แ แแแแฃแแแแแ, แแ แแก แแฃ แแ แ แแแแแขแ แคแ แแแแแแขแฃแแ IP แแแแแขแแก แแแฌแแแ แแ แแฃ แแกแแ, แแ แแก แแฃ แแ แ แแก แแแแ แคแ แแแแแแขแ. แแแกแแแ แแแขแ แแแชแฃแแแ แแ แฃแแแ แแงแแก แแฃแแ. แฉแแแ แแ แแแแแแ แจแแแแแแฌแแแ แแ แช แแ แแกแ แฃแแ แแ แแ แช แแแขแแฎแแแ แแแแแขแแแ, แแแแขแแ แแแแแฌแแแแ แกแแแแแ แแแขแก.
แแ-6 แฎแแแ แงแแแแแแ แกแแแแขแแ แแกแแ แแ แฉแแแแแแแแแแจแ. แแแแแฎแแขแฃแแแแ ldxb 4*([14]&0xf)
แแแจแแแแก, แ แแ แฉแแแขแแแ แแแแ แ แแแกแขแ แจแ X
แแแแแขแแก แแแแฎแฃแแแแขแ แแแแขแแก แงแแแแแแ แแแแแแแแ แแแแจแแแแแแแแแ แแแฎแ แแแขแ แแแแ แแแแแแฃแแ 4-แแ. แแแแฎแฃแแแแขแ แแแแขแแก แงแแแแแแ แแแแแแแแ แแแแจแแแแแแแแแ แแแฎแ แแแขแ แแ แแก แแแแ 4*([14]&0xf)
แแ แแก แแฆแแแจแแแ แกแแแชแแแแฃแ แ แแแกแแแแ แแแก แกแฅแแแแกแแแแก, แ แแแแแแช แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แแฎแแแแ แแ แคแแ แแแ แแ แแฎแแแแ แ แแแกแขแ แแกแแแแก X
, แ.แ. แแแ แช แแแขแงแแแ 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 แแแแขแแแแแก แแแ แแแจแ แแแแแขแแก แคแแแขแ แแชแแแกแแแแก. แฒแแแแแแ, tcpdump
แแแ แขแแ แแแฃแแแ แแ แแแแ แกแแกแขแแแแจแ แแ แคแแแขแ แแแแแ แแฃแจแแแแแกแแแแก tcpdump
libpcap
libpcap
, แแฅแแแ แฃแแแ แแแแแแแแ แจแแแแแแ:
- แจแแฅแแแแแ แขแแแแก แแฆแแฌแแ แ
pcap_t
แแแขแแ แคแแแกแแก แกแแฎแแแแแแ: ,pcap_create
- แแแขแแ แคแแแกแแก แแแแฅแขแแฃแ แแแ:
,pcap_activate
- แแแแแแแแชแแแก แคแแแขแ แ:
,pcap_compile
- แคแแแขแ แแก แแแแแแจแแ แแแ:
.pcap_setfilter
แ แแ แแแฎแแ แ แแแแ แคแฃแแฅแชแแแแแ แแแก pcap_setfilter
แแแแแ แแแแ Linux-แจแ, แฉแแแ แแแงแแแแแ 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
. Of 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 แแ 21-แ แกแแฃแแฃแแ
BPF แจแแแแแ Linux-แจแ 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))
แแแแฅแแแแแแก แแแแแแแก แกแแฎแแ แแ แแแ แแแแแแก แแแฌแแ แ แแ แช แแฃ แแกแ แแแกแแฎแแ แฎแแแแแแ, แแแแ แแ แแแแฏแแ แแฃแชแแแแแแแแ (แแแแแแแแแ, แแแแแ แแแแกแแแแก, แแ แแแฃแแแก แขแแกแขแแแแก แจแแกแแฅแแแแแแ, แกแขแแขแแแแแก แแแฌแแ แ Habrรฉ-แแ แแ แ.แจ.). แแแฎแแ แฎแแแฃแแแแแกแแแแก, แคแแแแจแ <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),
}
แแฃแแชแ, แแก แแแ แแแแขแ แแ แแ แแก แซแแแแแ แแแกแแฎแแ แฎแแแแแ. แแก แแ แแก แแก, แ แแกแแช Linux kernel แแ แแแ แแแแกแขแแแ แแแขแแแชแแแแแแ แแ, แจแแกแแแแแแกแแ, แแแ แแฅแขแแ แแแจแ 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
, แ แแแแ แช แแแแแแแแแ แแ แแแแงแแคแแแแแแก แแแกแแฌแงแแกแจแ.
Linux แแ netsniff-ng แแแคแแ แแแแแแแ
แกแขแแแแแ แขแฃแแ BPF-แแก แแแ แแ, Linux แแ tools/bpf/bpf_asm
แแฎแแ แแแญแแ แ แแ struct sk_buff
, แ แแแแแแช แแฆแฌแแ แก แฅแกแแแแก แแแแแขแก แแแ แแแจแ. แแฃแแชแ, แแกแแแ แแ แกแแแแแก แกแฎแแ แกแแฎแแก แแแแฎแแแ แ แแแกแขแ แฃแฅแชแแแแ, แแแแแแแแแ ldw cpu
แฉแแแขแแแ แแแแ แ แแแกแขแ แจแ A
แแแ แแแแก แคแฃแแฅแชแแแก แแแจแแแแแก แจแแแแแ raw_smp_processor_id()
. (BPF-แแก แแฎแแ แแแ แกแแแจแ, แแก แแ แแกแขแแแแแ แขแฃแแ แแแคแแ แแแแแแแ แแแคแแ แแแแแ, แ แแแ แฃแแ แฃแแแแแงแแก แแ แแแ แแแแแ แแแ แแแแก แแแแฎแแแ แแแแแก แแแแ แแแแ แแแฎแกแแแ แแแแแ, แกแขแ แฃแฅแขแฃแ แแแแ แแ แแแแแแแแแแก แแแแแ แแ แแแแกแแแแก.) แแฅ แแ แแก แคแแแขแ แแก แกแแแแขแแ แแกแ แแแแแแแแ, แ แแแแแจแแช แฉแแแ แแแแแแแ แแแ แแฎแแแแ แแแแแขแแก แกแแแแฃแ แแแ แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แแแคแแ แแแแแแก แแแแแงแแแแแแ poff
, แแแขแแแ แแแแก แแคแกแแขแฃแ แ:
ld poff
ret a
BPF แแแคแแ แแแแแแแแก แแแแแงแแแแแ แจแแฃแซแแแแแแแ tcpdump
, แแแแ แแ แแก แแแ แแ แแแแแแแ แแแแฃแแแแฃแ แ แแแแแขแแก แแแกแแชแแแแแ netsniff-ng
netsniff-ng
, แ แแแแแแช, แแแ แแ BPF-แแก แแแแแงแแแแแแ แคแแแขแ แแชแแแกแ, แแกแแแ แจแแแชแแแก แแคแแฅแขแฃแ แขแ แแคแแแแก แแแแแ แแขแแ แก แแ แฃแคแ แ แแแแแแแแ แแแฃแแก, แแแแ แ tools/bpf/bpf_asm
แแแ แแแ BPF แแกแแแแแแ แแ bpfc
. แแแแแขแ แจแแแชแแแก แกแแแแแแ แแแขแแแฃแ แแแแฃแแแแขแแชแแแก, แแกแแแ แแฎแแแแ แแแฃแแแแ แกแขแแขแแแก แแแแแก.
แฌแแแ
แแกแ แ แแ, แฉแแแ แฃแแแ แแแชแแ แ แแแแ แแแแฌแแ แแ แแแแแแแแฃแ แ แกแแ แแฃแแแก BPF แแ แแแ แแแแแ แแ แแแแ แแแ แ แแแแแแฎแแแแ แแฎแแ แแแแแแแแแแก, แ แแแแแแแแแ แแแ แแแแ แแ แแก seccomp แขแแฅแแแแแแแ, แ แแแแแแช BPF แคแแแขแ แแแแก แแแแแงแแแแแแ แกแแจแฃแแแแแแก แแซแแแแก แแแ แแแก แกแแกแขแแแฃแ แ แแแ แแก แแ แแฃแแแแขแแแแก แแแแ แแแ แแ แแแแ แแแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ. แแแชแแแฃแแ แแ แแชแแกแ แแ แแแกแ แจแแแแแแแแแแแ.
seccomp-แแก แแแ แแแแ แแแ แกแแ แแแแแแขแ แแแ แแแก 2005 แฌแแแก แแ แแ แช แแฃ แแกแ แแแแฃแแแ แฃแแ แแงแ, แ แแแแแ แแก แแฎแแแแ แแ แ แแแ แแแแขแก แแซแแแแแ - แแ แแชแแกแแกแแแแก แฎแแแแแกแแฌแแแแแ แกแแกแขแแแฃแ แ แแแ แแแแก แแแแ แแแแก แจแแแฆแฃแแแ แจแแแแแแแ: read
, write
, exit
ะธ sigreturn
, แแ แแ แแชแแกแ, แ แแแแแแช แแ แฆแแแแแ แฌแแกแแแก, แแแแแแก แแแแแงแแแแแแ SIGKILL
. แแฃแแชแ, 2012 แฌแแแก seccomp-แแ แแแแแแขแ BPF แคแแแขแ แแแแก แแแแแงแแแแแแก แจแแกแแซแแแแแแแ, แ แแช แกแแจแฃแแแแแแก แแแซแแแแ แแแแกแแแฆแแ แแ แแแจแแแแฃแแ แกแแกแขแแแฃแ แ แแแ แแแแก แแแแ แแแ แแ แจแแแกแ แฃแแแ แแแแ แแ แแฃแแแแขแแแแก แจแแแแฌแแแแแช แแ. (แกแแแแขแแ แแกแแ, แ แแ Chrome แแงแ แแ แคแฃแแฅแชแแแก แแ แ-แแ แแ แแแ แแแแ แแแแฎแแแ แแแแแ แแ Chrome-แแก แฎแแแฎแ แแแแแแแ แแแแแแ แแแก KRSI แแแฅแแแแแแก, แ แแแแแแช แแแคแฃแซแแแแฃแแแ BPF-แแก แแฎแแ แแแ แกแแแแ แแ แกแแจแฃแแแแแแก แแซแแแแก Linux-แแก แฃแกแแคแ แแฎแแแแแก แแแแฃแแแแแก แแแ แกแแแแแแแแชแแแก.) แแแแแขแแแแแ แแแแฃแแแแขแแชแแแก แแแฃแแแแ แจแแแแซแแแแ แแแฎแแ แแแแแก. แกแขแแขแแแก.
แแแแแแแแแกแฌแแแแ, แ แแ แฐแแแแ แฃแแแ แแงแ แกแขแแขแแแแ seccomp-แแก แแแแแงแแแแแแก แจแแกแแฎแแ, แจแแกแแซแแแ แแแแแแก แแแฃแแแแก แแแแ แฌแแแแแฎแแ แจแแแแแ แฅแแแแแแงแแคแแแแแแแแก แฌแแแแแฎแแแแแ (แแ แแแก แแแชแแแแ). แกแขแแขแแแจแ
แจแแแแแ แฉแแแ แแแแฎแแแ, แ แแแแ แแแแฌแแ แแ แแ แฉแแแขแแแ แแแ แคแแแขแ แแแ seccomp
แจแแจแแแ C-แจแ แแ แแแแแแแแแแแก แแแแแงแแแแแแ libseccomp
แแ แ แ แแแแแแแแ แแ แฃแแ แงแแคแแแ แแฎแแ แแแแ แแฅแแก แแแแแแฃแ แแแ แแแแขแก แแ แแแแแก แแแแฎแแ, แ แแแแ แแงแแแแแก seccomp แแ แแแ แแแแก strace
.
แคแแแขแ แแแแก แฉแแฌแแ แ แแ แฉแแขแแแ แแแ seccomp-แแกแแแแก
แฉแแแ แฃแแแ แแแชแแ แ แแแแ แแแแฌแแ แแ BPF แแ แแแ แแแแแ, แแกแ แ แแ, แแแแแ, แฏแแ แแแแแแฎแแแแ seccomp แแ แแแ แแแแ แแแแก แแแขแแ แคแแแกแก. แแฅแแแ แจแแแแซแแแแ แแแแงแแแแ แคแแแขแ แ แแ แแชแแกแแก แแแแแแ แแ แงแแแแ แแแแจแแแก แแ แแชแแกแ แแแแแแแแ แแแแแ แแแแฆแแแก แจแแแฆแฃแแแแแก. แแก แแแแแแแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ seccomp(2)
seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)
แกแแแแช &filter
- แแก แฉแแแแแแแก แฃแแแ แแแชแแแแ แกแขแ แฃแฅแขแฃแ แแก แแแฉแแแแแแแแแ struct sock_fprog
, แ.แ. BPF แแ แแแ แแแ.
แ แแ แแแแกแฎแแแแแแแ seccomp-แแก แแ แแแ แแแแแ แกแแแแขแแแแก แแ แแแ แแแแแแกแแแ? แแแแแชแแแฃแแ แแแแขแแฅแกแขแ. แกแแแแขแแแแก แจแแแแฎแแแแแจแ, แฉแแแ แแแแซแแแแ แแแฎแกแแแ แแแแก แแ แแแแ, แ แแแแแแช แจแแแชแแแก แแแแแขแก, แฎแแแ 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. แ แ แแ แแก แแก แกแแกแขแแแฃแ แ แแแ แแแ? แแแแแแแแแแแแแ แแแ แแแขแงแแแ, แ แแแแแ แแ แแแชแแ, แ แแแแแ แแ แฅแแขแแฅแขแฃแ แแกแแแแก แแแแฌแแ แ แแ แแแ แแแ. แแแแขแแ, แกแแแแแแ 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
แแ แแก แจแแฃแชแแแแแ แแแกแขแ แฃแแแแขแ Linux-แแ แแ แแชแแกแแแแก แฅแชแแแแก แจแแกแแกแฌแแแแแ. แแฃแแชแ, แแแแ แก แกแแแแแ แแแแก แจแแกแแฎแแ 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
แแฎแแ แแแแฃแแ แฃแแแแ แฅแกแแแแแแก แกแแแงแแ แแก.
แคแแแ: แแแแ แฎแแแก แฌแแ, 2007 แฌแแแก, แแแ แแแ แแงแ xt_u32
แแแขแคแแแขแ แแกแแแแก. แแแ แแแแฌแแ แ แขแ แแคแแแแก แแแแแ แฃแคแ แ แฃแซแแแแแกแ แแแแกแแคแแแแขแแ แแก แแแแแแแแแ cls_u32
แแ แกแแจแฃแแแแแแก แแแแชแแแ แแแฌแแ แแ แแแแแแแแฃแ แ แแ แแแแแ แฌแแกแแแ iptable-แแแแกแแแแก แจแแแแแแ แแแ แขแแแ แแแแ แแชแแแแแก แแแแแงแแแแแแ: แฉแแขแแแ แแแ 32 แแแขแ แแแแแขแแแแ แแ แจแแแกแ แฃแแแ แแแแแ แแ แแแแแขแแแฃแแ แแแฅแแแแแแแแแก แแแแ แแแ. แฒแแแแแแแแ,
sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"
แแขแแแ แแแแ IP แกแแแแฃแ แแก 32 แแแขแ, แแแฌแงแแแฃแแ 6-แแก แแแแแจแแแแ แแ แแงแแแแแก แแแ แแแฆแแแก 0xFF
(แแแฆแแ แแแแแแ แแแแขแ). แแก แกแคแแ แ protocol
IP แกแแแแฃแ แ แแ แแแแแ แแแ 1-แก (ICMP). แแฅแแแ แจแแแแซแแแแ แแแแแแแจแแ แแ แแ แแแแแ แจแแแแฌแแแแ แแ แ แฌแแกแจแ, แแกแแแ แจแแแแซแแแแ แจแแแกแ แฃแแแ แแแแ แแขแแ แ @
โ แแแแแแขแแแแ X แแแแขแ แแแ แฏแแแแ. แแแแแแแแแ, แฌแแกแ
iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"
แแแแฌแแแแก, แแฃ TCP Sequence Number แแ แแ แแก แขแแแ 0x29
. แแแขแแแแแก แแฆแแ แแแแแแ แซแแแแ, แ แแแแแ แฃแแแ แแแแแแแ, แ แแ แแกแแแ แฌแแกแแแแก แฎแแแแ แแแฌแแ แ แแ แช แแฃ แแกแ แแแกแแฎแแ แฎแแแแแแ. แกแขแแขแแแจแ xt_u32
. แแกแแแ แแฎแแแแ แแแฃแแแแ แแ แกแขแแขแแแก แแแแแก.
2013 แฌแแแแแ แแแแฃแแ แแแแฃแแแก แแแชแแแแ xt_u32
แจแแแแซแแแแ แแแแแแงแแแแ BPF แแแคแฃแซแแแแฃแแ แแแแฃแแ xt_bpf
. แแแแช แฌแแแแแแฎแ แแฅแแแแ, แฃแแแ แฃแแแ แแชแแแแก แแแกแ แแแฅแแแแแแแก แแ แแแชแแแ: แแแฃแจแแแ BPF bytecode, แ แแแแ แช iptables แฌแแกแแแ. แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ แแฎแแแ แฌแแกแ, แแแแแแแแแ, แแกแ:
iptables -A INPUT -m bpf --bytecode <ะฑะฐะนัะบะพะด> -j LOG
แแฅ <ะฑะฐะนัะบะพะด>
- แแก แแ แแก แแแแ แแกแแแแแแ แแก แแแแแแแแแแ แคแแ แแแขแจแ 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 แแแแแชแแแแ แแ แแแแก แจแแแแแ แแ แจแแแแแ แจแแแแแฌแแแ แแแแฎแแแแ: 0x04686162 <-> "x04hab"
แ.แจ.
แชแแขแ แแแแแแแแแแแ, Cloudfare-แแ แแแแแแฅแแแงแแ p0f -> BPF แจแแแแแแแแแ แแแแ. แกแขแแขแแแจแ
$ ./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
แแแแฃแฅแกแแก แขแ แแคแแแแก แแแแขแ แแแแก แฅแแแกแแกแขแแแแกแแแแก, แ แแแแแแช แแแแแแขแ Linux-แก 2013 แฌแแแก แแแแแก แแ แแแแชแแแขแฃแแแฃแ แแ แจแแชแแแแ แฃแซแแแแแกแ cls_u32
.
แแฃแแชแ, แฉแแแ แแฎแแ แแ แแฆแแฌแแ แ แแแแฃแจแแแแ แก cls_bpf
, แ แแแแแ แแแแกแแแฃแ แ BPF-แแก แจแแกแแฎแแ แชแแแแแก แแแแแกแแแ แแกแแ แแก แแ แแคแแ แก แแแแแชแแแก - แฉแแแ แฃแแแ แแแแแชแแแแ แงแแแแ แคแฃแแฅแชแแแแแ แแแแก. แแแ แแ แแแแกแ, แจแแแแแแ แกแขแแขแแแแจแ, แ แแแแแแแช แแกแแฃแแ แแแ แแแคแแ แแแแแฃแ BPF-แแ, แแ แแแแกแแคแแแแขแแ แก แแ แแแ แแฎแแ แจแแแฎแแแแแแ.
แแแแแ แแ แแ แแแแแแ แแแแกแ, แ แแ แแ แแแกแแฃแแ แแ แแแแกแแแฃแ แ BPF-แแก แแแแแงแแแแแแแ c cls_bpf
แแ แแแแแแ แแก แแ แแก, แ แแ Extended BPF-แแแ แจแแแแ แแแแ, แแ แจแแแแฎแแแแแจแ แแแแแงแแแแแแก แคแแ แแแแแ แ แแแแแแแฃแ แแ แแแฌแ แแแแแแ: แแแแกแแแฃแ แแ แแแ แแแแแก แแ แจแแฃแซแแแแ แจแแชแแแแแ แแแแแขแแแแก แจแแแแแ แกแ แแ แแแ แจแแแแแฎแแ แแแแแแแ แแแแ แแแ แแแก แจแแ แแก.
แแกแ แ แแ, แแ แแ แแแแแแจแแแแแแแ แแแแกแแแฃแ BPF-แก แแ แจแแแฎแแแแ แแแแแแแแก.
แแแแแจแแแแแแแ แแแแกแแแฃแ BPF-แก
แฉแแแ แจแแแฎแแแแ, แแฃ แ แแแแ แแแแแแแแ แแ BPF แขแแฅแแแแแแแ, แ แแแแแแช แแแแแแแแ แแ แแแฎแแแชแแแแแแแแ แฌแแแแแก แแแกแแฌแงแแกแจแ, แฌแแ แแแขแแแแ แแชแฎแแแ แ แแแแแฎแแแ แกแแฃแแฃแแแก แแแแแแแแแแแจแ แแ แแแแแแแ แแแแแ แแฎแแแ แแ แแแ แแแแแ. แแฃแแชแ, แแแกแขแ แแแแฅแแแแแแแแ RISC-แแ แแแแแกแแแแก แแกแแแแกแแ, แ แแแแแแช แแแแฃแแกแ แแงแ แแแแกแแแฃแ แ BPF-แแก แแแแแแแแ แแแแกแแแแก, 32-แแแ แฌแแแแจแ แแแฎแแ แแแแแกแแแ 64-แแแขแแแ XNUMX-แแแขแแแ แแแแ แแขแแแแ แแ แแแแกแแแฃแ แ BPF แแแแฌแงแ แแแซแแแแแแ. แแแ แแ แแแแกแ, แแแแกแแแฃแ แ BPF-แแก แจแแกแแซแแแแแแแแแ แซแแแแแ แจแแแฆแฃแแฃแแแ แแ แแแซแแแแแแฃแแ แแ แฅแแขแแฅแขแฃแ แแก แแแ แแ - แฉแแแ แแ แแแแฅแแก BPF แแ แแแ แแแแแแ แแแ แแแก แจแแ แแก แแแแแแแ แแแแแก แจแแแแฎแแแก แจแแกแแซแแแแแแแ, แแ แแ แแก แแแ แแแแแ แ แแแแฎแแแ แแแแแก แฃแ แแแแ แแฅแแแแแแแก แจแแกแแซแแแแแแแ, แแ แแ แแก แฃแ แแแแ แแฅแแแแแแแก แจแแกแแซแแแแแแแ. แแแ แแแแ, แแแ แแ แกแขแ แฃแฅแขแฃแ แฃแแ แแแแแแแก แจแแแฆแฃแแฃแแ แ แแแแแแแแแก แฌแแแแแฎแแแกแ sk_buff
แแ แฃแแแ แขแแแแกแ แแแแฎแแแ แ แคแฃแแฅแชแแแแแก แแแจแแแแแ, แแฅแแแ แแ แจแแแแซแแแแ แจแแชแแแแแ แแแแแขแแแแก แจแแแแแ แกแ แแ แแแแแแแกแแแแ แแแ แแกแแแ.
แคแแฅแขแแแ แแแแ, แแแแแแแ Linux-แจแ แแแแกแแแฃแ แ BPF-แแกแแแ แ แฉแแแ แแฎแแแแ API แแแขแแ แคแแแกแ แแ แแแ แแแแก แจแแแแแ แงแแแแ แแแแกแแแฃแ แ แแ แแแ แแแ, แแฅแแแแ แแก แกแแแแขแแก แคแแแขแ แแแ แแฃ seccomp แคแแแขแ แแแ, แแแขแแแแขแฃแ แแ แแแแ แแแแแแ แแฎแแ แคแแ แแแขแจแ, Extended BPF. (แแฃแกแขแแ แ แแแแ แฎแแแแ แแก แจแแแแแ แกแขแแขแแแจแ แแแกแแฃแแ แแแ.)
แแฎแแ แแ แฅแแขแแฅแขแฃแ แแแ แแแแแกแแแ แแแแฌแงแ 2013 แฌแแแก, แ แแแแกแแช แแแแฅแกแแ แกแขแแ แแแแแขแแแแ แจแแกแแแแแแ BPF แแแแแฎแแแแแก แกแฅแแแ. 2014 แฌแแแก แจแแกแแแแแแกแ แแแขแฉแแแ
แแ แกแแ แแแก แจแแแแแแแ แกแขแแขแแแแ แแแแชแแแก แแฎแแแ แขแแฅแแแแแแแแก แแ แฅแแขแแฅแขแฃแ แแกแ แแ แแแแแแแชแแแแก, แแแแแแแแ แแแแแ แชแแแแแแ แ แแแแ แช แจแแแ BPF, แจแแแแแ แแแคแแ แแแแแฃแแ BPF แแ แแฎแแ แฃแแ แแแแ BPF.
แแแขแแ แแขแฃแ แ
- แกแขแแแแ แแแแแแแ แแ แแแ แฏแแแแแแกแแแ, "BSD แแแแแขแแก แคแแแขแ แ: แแฎแแแ แแ แฅแแขแแฅแขแฃแ แ แแแแฎแแแ แแแแแก แแแแแก แแแแแขแแแแก แแแญแแ แแกแแแแก",
https://www.tcpdump.org/papers/bpf-usenix93.pdf
- แกแขแแแแ แแแแแแแ, "libpcap: แแ แฅแแขแแฅแขแฃแ แ แแ แแแขแแแแแแชแแแก แแแแแแแแแแแ แแแแแขแแก แแฆแแแแก แแแแแแ",
https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
tcpdump
,libpcap
:https://www.tcpdump.org/ IPtable U32 Match Tutorial .- 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: แแแแแแแแแก แแแแแแ แแแ แกแแกแขแแแแ แแ โแแแแกแแแแก แแ แแญแแ แแแแแ แแแแแ แ!โ - แแแ แฉแแแแแแแ, "strace --seccomp-bpf: แแแแแฎแแแแ แแแแแขแแก แฅแแแจ",
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
netsniff-ng
:http://netsniff-ng.org/
แฌแงแแ แ: www.habr.com