BPF แƒžแƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜: แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF

Berkeley Packet Filters (BPF) แƒแƒ แƒ˜แƒก Linux-แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒ™แƒ•แƒ” แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒฌแƒ”แƒšแƒ˜แƒ แƒ˜แƒœแƒ’แƒšแƒ˜แƒกแƒฃแƒ แƒ”แƒœแƒแƒ•แƒแƒœแƒ˜ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒ–แƒ”แƒ. แƒ™แƒแƒœแƒคแƒ”แƒ แƒ”แƒœแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ˜แƒ•แƒกแƒ”แƒ‘แƒ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒ— BPF-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘. แƒ“แƒ”แƒ•แƒ˜แƒ“ แƒ›แƒ˜แƒšแƒ”แƒ แƒ˜, Linux แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒฅแƒ•แƒ”แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜, แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒ•แƒšแƒแƒก Linux Plumbers 2018-แƒ–แƒ” "แƒ”แƒก แƒกแƒแƒฃแƒ‘แƒแƒ แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก XDP-แƒ–แƒ”" (XDP แƒแƒ แƒ˜แƒก BPF-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ). แƒ‘แƒ แƒ”แƒœแƒ“แƒแƒœ แƒ’แƒ แƒ”แƒ’แƒ˜ แƒแƒขแƒแƒ แƒ”แƒ‘แƒก แƒ›แƒแƒšแƒแƒžแƒแƒ แƒแƒ™แƒ”แƒ‘แƒ”แƒ‘แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒ— Linux BPF แƒกแƒฃแƒžแƒ”แƒ  แƒซแƒแƒšแƒ”แƒ‘แƒ˜. แƒขแƒแƒ™แƒ” แƒฐแƒแƒ˜แƒšแƒแƒœแƒ“แƒ˜-แƒ˜แƒแƒ แƒ’แƒ”แƒœแƒกแƒ”แƒœแƒ˜ แƒ˜แƒชแƒ˜แƒœแƒ˜แƒกแƒ แƒแƒ› แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒแƒฎแƒšแƒ แƒ›แƒ˜แƒ™แƒ แƒแƒ™แƒ”แƒ แƒœแƒ”แƒšแƒ˜แƒ. แƒ—แƒแƒ›แƒแƒก แƒ’แƒ แƒแƒคแƒ˜ แƒฎแƒ”แƒšแƒก แƒฃแƒฌแƒงแƒแƒ‘แƒก แƒ˜แƒ› แƒแƒ–แƒ แƒก, แƒ แƒแƒ› BPF แƒแƒ แƒ˜แƒก javascript แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒแƒ  แƒแƒ แƒ˜แƒก BPF-แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ Habrรฉ-แƒ–แƒ” แƒ“แƒ แƒแƒ›แƒ˜แƒขแƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒ”แƒ แƒ˜แƒแƒจแƒ˜ แƒจแƒ”แƒ•แƒ”แƒชแƒ“แƒ”แƒ‘แƒ˜ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ˜แƒก แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒแƒ–แƒ”, แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒงแƒ BPF แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒคแƒ”แƒ แƒแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒ. แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ, แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜, แƒกแƒ”แƒ แƒ˜แƒแƒจแƒ˜, แƒ›แƒแƒ’แƒ•แƒ˜แƒ—แƒฎแƒ แƒแƒ‘แƒก แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF-แƒ˜แƒก แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒแƒกแƒ แƒ“แƒ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒแƒก แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒแƒ•แƒšแƒ”แƒœแƒก แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒก. tcpdump, seccomp, strace, แƒ“แƒ แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒ˜.

BPF-แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒแƒก แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒก Linux แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒ, BPF-แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒœแƒ”แƒ‘แƒแƒ แƒ—แƒ•แƒ˜แƒ— @eucariot, แƒกแƒ”แƒ แƒ˜แƒแƒšแƒก "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 แƒžแƒ แƒแƒชแƒ”แƒกแƒแƒ แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ” - แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒฃแƒจแƒ. Apple II แƒแƒœ NES. แƒแƒฎแƒแƒšแƒ›แƒ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ›แƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ› แƒแƒ—แƒฏแƒ”แƒ  แƒ’แƒแƒ–แƒแƒ แƒ“แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ—แƒแƒœ แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ—.

BPF แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ

แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒแƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ’แƒ–แƒ˜แƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒ— แƒ’แƒแƒ•แƒ”แƒชแƒœแƒแƒ‘แƒ˜แƒ—. แƒ—แƒฃแƒ›แƒชแƒ, แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒ แƒแƒ› แƒแƒžแƒแƒ แƒแƒขแƒก แƒฐแƒฅแƒแƒœแƒ“แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒแƒ แƒ˜ 32-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜, แƒแƒ™แƒฃแƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜. A แƒ“แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜ X, 64 แƒ‘แƒแƒ˜แƒขแƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ (16 แƒกแƒ˜แƒขแƒงแƒ•แƒ), แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒฉแƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒฌแƒแƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒแƒ“ แƒ“แƒ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ˜แƒ แƒ” แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒแƒ› แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒžแƒ˜แƒ แƒแƒ‘แƒ˜แƒ—แƒ˜ แƒ’แƒแƒ›แƒแƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒฎแƒขแƒแƒ›แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ˜แƒงแƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒœแƒแƒฎแƒขแƒแƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฌแƒ˜แƒœ แƒ˜แƒงแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜, แƒแƒœแƒฃ, แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒแƒ™แƒ แƒซแƒแƒšแƒฃแƒšแƒ˜ แƒ˜แƒงแƒ แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ.

แƒแƒžแƒแƒ แƒแƒขแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒกแƒฅแƒ”แƒ›แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜แƒ. แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒฅแƒ›แƒœแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก BPF แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ (แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ˜), แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒก แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ แƒแƒ แƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ–แƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒฉแƒแƒ›แƒแƒกแƒ•แƒšแƒ). แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ แƒฎแƒ“แƒ”แƒ‘แƒ, แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ—แƒแƒ แƒฏแƒ˜แƒ›แƒแƒœแƒจแƒ˜) แƒ“แƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ แƒจแƒ”แƒ”แƒกแƒแƒ‘แƒแƒ›แƒ”แƒ‘แƒ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒ”แƒ’แƒ˜แƒแƒœแƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜).

แƒ–แƒ”แƒ›แƒแƒ— แƒฉแƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒšแƒ˜ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒงแƒฃแƒ แƒ”แƒ‘แƒ: แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒกแƒแƒ›แƒ”แƒ‘แƒ  แƒ’แƒแƒ•แƒ”แƒชแƒœแƒแƒ‘แƒ˜แƒ— แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒก แƒ“แƒ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒก. แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒจแƒ”แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒแƒ— แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒ“แƒ แƒ’แƒแƒ”แƒชแƒœแƒแƒ— แƒ›แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒแƒ แƒ˜แƒ’แƒ˜แƒœแƒแƒšแƒฃแƒ แƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ BSD แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒแƒœ/แƒ“แƒ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒฎแƒ”แƒ•แƒแƒ แƒ˜ Documentation/networking/filter.txt แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒ“แƒแƒœ. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒแƒ— แƒžแƒ แƒ”แƒ–แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ libpcap: แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒ“แƒ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒแƒšแƒแƒ’แƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ›แƒแƒ™แƒ™แƒแƒœแƒ˜, BPF-แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒแƒ•แƒขแƒแƒ แƒ˜, แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒแƒ–แƒ” แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒก 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 แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ‘แƒแƒ˜แƒขแƒ”แƒ™แƒแƒ“แƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ— แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ (แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒ˜ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ Tcpdump: แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ). แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒšแƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒงแƒ•แƒ”แƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜ eth0. แƒ—แƒฃ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒแƒ แƒแƒœแƒฃแƒšแƒแƒ•แƒแƒœ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก n, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒ“แƒ” n แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ‘แƒแƒ˜แƒขแƒ˜ แƒ™แƒแƒžแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒ— แƒ›แƒแƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒจแƒ˜ tcpdump.

BPF แƒžแƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜: แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF

แƒ’แƒแƒ›แƒแƒ“แƒ˜แƒก, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒแƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜ แƒ˜แƒงแƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ 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, แƒ“แƒ แƒ”แƒก แƒœแƒ˜แƒจแƒœแƒแƒ•แƒกแƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ (แƒกแƒ˜แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ‘แƒ—, แƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก VLAN แƒขแƒ”แƒ’แƒ”แƒ‘แƒ˜):

       6              6          2
|Destination MAC|Source MAC|Ether Type|...|

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ ldh [12] แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜ A แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ•แƒ”แƒšแƒ˜ Ether Type - แƒแƒ› Ethernet แƒฉแƒแƒ แƒฉแƒแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒขแƒ˜แƒžแƒ˜. 1 แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ–แƒ” แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ“แƒแƒ แƒ”แƒ‘แƒ— แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒก แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒก A (แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒขแƒ˜แƒžแƒ˜) แƒ’ 0x86dd, แƒ“แƒ แƒ”แƒก แƒ“แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒขแƒ˜แƒžแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒก แƒแƒ แƒ˜แƒก IPv6. 1 แƒฎแƒแƒ–แƒ–แƒ”, แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, แƒแƒ แƒ˜แƒก แƒ™แƒ˜แƒ“แƒ”แƒ• แƒแƒ แƒ˜ โ€‹โ€‹แƒกแƒ•แƒ”แƒขแƒ˜ - 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) แƒ›แƒ”-3 แƒฎแƒแƒ–แƒ–แƒ”.

แƒ›แƒ”-4 แƒ“แƒ แƒ›แƒ”-5 แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ” แƒ•แƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒ— แƒ›แƒ”-20 แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ–แƒ” แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ” แƒœแƒแƒฎแƒ”แƒ•แƒแƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒก แƒ“แƒ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒแƒก jset แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— แƒแƒ แƒ˜แƒก แƒ—แƒฃ แƒแƒ แƒ แƒกแƒแƒ›แƒ˜แƒ“แƒแƒœ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ˜ - แƒ’แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒœแƒ˜แƒฆแƒ‘แƒ˜แƒก แƒขแƒแƒ แƒ”แƒ‘แƒ jset แƒกแƒแƒ›แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒ‘แƒ˜แƒขแƒ˜ แƒ’แƒแƒกแƒฃแƒคแƒ—แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ. แƒกแƒแƒ›แƒ˜ แƒ‘แƒ˜แƒขแƒ˜แƒ“แƒแƒœ แƒแƒ แƒ˜ แƒ’แƒ•แƒ”แƒฃแƒ‘แƒœแƒ”แƒ‘แƒ, แƒแƒ แƒ˜แƒก แƒ—แƒฃ แƒแƒ แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒคแƒ แƒแƒ’แƒ›แƒ”แƒœแƒขแƒฃแƒšแƒ˜ IP แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ“แƒ แƒ—แƒฃ แƒแƒกแƒ”แƒ, แƒแƒ แƒ˜แƒก แƒ—แƒฃ แƒแƒ แƒ แƒ˜แƒก แƒ‘แƒแƒšแƒ แƒคแƒ แƒแƒ’แƒ›แƒ”แƒœแƒขแƒ˜. แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ‘แƒ˜แƒขแƒ˜ แƒ“แƒแƒชแƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒœแƒฃแƒšแƒ˜. แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ— แƒแƒ แƒช แƒแƒ แƒแƒกแƒ แƒฃแƒšแƒ˜ แƒ“แƒ แƒแƒ แƒช แƒ’แƒแƒขแƒ”แƒฎแƒ˜แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ•แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ— แƒกแƒแƒ›แƒ˜แƒ•แƒ” แƒ‘แƒ˜แƒขแƒก.

แƒ›แƒ”-6 แƒฎแƒแƒ–แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ แƒแƒ› แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒจแƒ˜. แƒ’แƒแƒ›แƒแƒฎแƒแƒขแƒฃแƒšแƒ”แƒ‘แƒ ldxb 4*([14]&0xf) แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒฉแƒแƒ•แƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒ— แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜ X แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒฎแƒฃแƒ—แƒ›แƒ”แƒขแƒ” แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒแƒ—แƒฎแƒ˜ แƒ‘แƒ˜แƒขแƒ˜ แƒ’แƒแƒ›แƒ แƒแƒ•แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ 4-แƒ–แƒ”. แƒ›แƒ”แƒ—แƒฎแƒฃแƒ—แƒ›แƒ”แƒขแƒ” แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒแƒ—แƒฎแƒ˜ แƒ‘แƒ˜แƒขแƒ˜ แƒแƒ แƒ˜แƒก แƒ•แƒ”แƒšแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒก แƒกแƒ˜แƒ’แƒ แƒซแƒ” IPv4 แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒก แƒกแƒ˜แƒ’แƒ แƒซแƒ”แƒก แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒจแƒ˜, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ›แƒ แƒแƒ•แƒšแƒแƒ— 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
...

แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒแƒ  แƒฎแƒแƒ–แƒ–แƒ” แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒœแƒ”แƒ“แƒšแƒ˜ แƒกแƒแƒ™แƒ”แƒขแƒ˜ แƒงแƒ•แƒ”แƒšแƒ Ethernet แƒฉแƒแƒ แƒฉแƒแƒก แƒฌแƒแƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒแƒ“ แƒ“แƒ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ—แƒแƒœ แƒ›แƒ˜แƒ‘แƒ›แƒ 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.

แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒ แƒแƒ› แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ”แƒ แƒ—แƒแƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒกแƒแƒ™แƒ”แƒขแƒก, แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒœแƒ”แƒ“แƒšแƒ”แƒฃแƒšแƒก. แฒแƒฅ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒงแƒ•แƒ”แƒขแƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒš UDP แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒ แƒแƒ›แƒแƒก, แƒ’แƒแƒ แƒ“แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒแƒ แƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒกแƒ. (แƒ™แƒแƒ“แƒจแƒ˜ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ” แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ แƒแƒ  แƒ’แƒแƒญแƒ”แƒ“แƒแƒก.)

แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ setsockopt แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒšแƒแƒ“ แƒ˜แƒฎ แƒกแƒแƒ™แƒ”แƒขแƒ˜ (7), แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ struct sock_fprog แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” tcpdump แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ— แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ BPF-แƒ˜แƒก แƒ“แƒแƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒฎแƒ”แƒšแƒ˜แƒ—.

แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF แƒ“แƒ 21-แƒ” แƒกแƒแƒฃแƒ™แƒฃแƒœแƒ”

BPF แƒจแƒ”แƒ•แƒ˜แƒ“แƒ Linux-แƒจแƒ˜ 1997 แƒฌแƒ”แƒšแƒก แƒ“แƒ แƒ™แƒแƒ แƒ’แƒ แƒฎแƒแƒœแƒก แƒ“แƒแƒ แƒฉแƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒซแƒแƒšแƒแƒ“ libpcap แƒ แƒแƒ˜แƒ›แƒ” แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” (แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒšแƒ˜แƒœแƒฃแƒฅแƒกแƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒฉแƒ•แƒ”แƒœ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ— แƒแƒ  แƒจแƒ”แƒชแƒ•แƒแƒšแƒ”แƒก แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜). แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒกแƒ”แƒ แƒ˜แƒแƒ–แƒฃแƒšแƒ˜ แƒœแƒ˜แƒจแƒœแƒ”แƒ‘แƒ˜ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› BPF แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ“แƒ”แƒ‘แƒแƒ“แƒ, แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ 2011 แƒฌแƒ”แƒšแƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ”แƒ แƒ˜แƒ™ แƒ“แƒฃแƒ›แƒแƒ–แƒ”แƒขแƒ›แƒ แƒจแƒ”แƒกแƒ—แƒแƒ•แƒแƒ–แƒ แƒžแƒแƒขแƒฉแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒแƒขแƒ”แƒ‘แƒก Just In Time Compiler-แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒก - แƒ—แƒแƒ แƒฏแƒ˜แƒ›แƒแƒœแƒ˜ BPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒจแƒแƒ‘แƒšแƒ˜แƒฃแƒ แƒแƒ“ แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก x86_64 แƒ™แƒแƒ“แƒ˜.

JIT แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜ แƒ˜แƒงแƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒฏแƒแƒญแƒ•แƒจแƒ˜: 2012 แƒฌแƒ”แƒšแƒก แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒก แƒฃแƒœแƒแƒ แƒ˜ แƒฌแƒแƒ›แƒ˜BPF-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, 2013 แƒฌแƒšแƒ˜แƒก แƒ˜แƒแƒœแƒ•แƒแƒ แƒจแƒ˜ แƒ˜แƒงแƒ แƒ“แƒแƒ”แƒ›แƒแƒขแƒ แƒ›แƒแƒ“แƒฃแƒšแƒ˜ 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;
}

แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒชแƒ˜แƒ— แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜ [1]). แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ 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 แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ”แƒ‘แƒจแƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒžแƒแƒ•แƒแƒ— แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ  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 แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— seccomp-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒก, แƒ แƒแƒ’แƒแƒ แƒช 2007 แƒฌแƒšแƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก, แƒแƒกแƒ”แƒ•แƒ” แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก BPF แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— (แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ libseccomp-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—), แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒก seccomp-แƒ˜แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ–แƒ” Docker-แƒ—แƒแƒœ แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒ‘แƒ”แƒ•แƒ  แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ‘แƒ›แƒฃแƒšแƒก. แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ“แƒ”แƒ›แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ–แƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ systemd-แƒ˜แƒ— แƒแƒœ โ€žแƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ Docker!โ€œ แƒ˜แƒก แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก, แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒแƒ•แƒ˜ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒแƒœ แƒ—แƒ”แƒ—แƒ แƒ˜ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ”แƒ›แƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ—, แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ“แƒ แƒฉแƒแƒ•แƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ— แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ 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() แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ”แƒ‘แƒ˜. (แƒกแƒแƒกแƒแƒชแƒ˜แƒšแƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒš commit-แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ›แƒแƒช แƒ“แƒแƒแƒ›แƒแƒขแƒ seccomp แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ›แƒแƒ— แƒ“แƒแƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒแƒ— แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒ–แƒ” แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒœแƒ”แƒ‘แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ. mod (แƒ“แƒแƒงแƒแƒคแƒ˜แƒก แƒ“แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜) แƒ“แƒ แƒแƒฎแƒšแƒ แƒ›แƒ˜แƒฃแƒฌแƒ•แƒ“แƒแƒ›แƒ”แƒšแƒ˜แƒ seccomp BPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒขแƒงแƒ“แƒ”แƒ‘แƒ ABI.)

แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ•แƒ˜แƒชแƒ˜แƒ— แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜, แƒ แƒแƒ› แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ“แƒ แƒฌแƒแƒ•แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— 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 แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒแƒจแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒฅแƒแƒœแƒ“แƒ”แƒ— แƒกแƒ แƒฃแƒšแƒ˜ แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ–แƒแƒ’แƒฏแƒ”แƒ  แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒ˜แƒ แƒ’แƒฅแƒแƒœแƒ“แƒ”แƒ— แƒžแƒแƒ แƒขแƒแƒขแƒฃแƒšแƒ˜ แƒ“แƒ/แƒแƒœ แƒฌแƒแƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ˜ แƒ™แƒแƒ“แƒ˜. แƒแƒ›แƒแƒจแƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒ“แƒแƒ’แƒ•แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ libseccomp, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒš แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒก แƒจแƒแƒ•แƒ˜ แƒแƒœ แƒ—แƒ”แƒ—แƒ แƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“.

แƒ›แƒแƒ“แƒ˜แƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒก แƒแƒ แƒแƒ‘แƒ˜แƒ— แƒคแƒแƒ˜แƒšแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒแƒ แƒฉแƒ”แƒฃแƒšแƒ˜, แƒแƒ“แƒ แƒ” แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒแƒ•แƒ˜ แƒกแƒ˜แƒ˜แƒ“แƒแƒœ. แƒ–แƒ”แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ (แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒ”แƒขแƒ˜ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒžแƒแƒ•แƒแƒ— แƒกแƒ แƒฃแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒแƒฅ):

#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-แƒ–แƒ” แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒแƒฅแƒชแƒ”แƒ•แƒก แƒคแƒ˜แƒšแƒขแƒ แƒก แƒแƒ แƒแƒ‘แƒ˜แƒ— แƒกแƒแƒซแƒ˜แƒ”แƒ‘แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒ“.

แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒœแƒแƒฎแƒแƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒแƒ แƒแƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒซแƒ˜แƒ”แƒ‘แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜, แƒจแƒ”แƒฎแƒ”แƒ“แƒ”แƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฅแƒ›แƒœแƒ˜แƒก แƒแƒกแƒ”แƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒก BPF แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ แƒจแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ–แƒแƒ แƒ˜แƒก แƒœแƒแƒ›แƒ แƒ”แƒ‘แƒ˜แƒก แƒแƒ™แƒ แƒ”แƒคแƒ˜แƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“:

$ 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, แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

BPF แƒžแƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜: แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF

แƒ—แƒฃแƒ›แƒชแƒ, 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-แƒ˜แƒกแƒ’แƒแƒœ.

BPF แƒžแƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜: แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF

แƒแƒคแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก --seccomp-bpf แƒแƒ แƒ˜แƒก แƒแƒ แƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ. แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒžแƒ แƒแƒชแƒ”แƒกแƒ—แƒแƒœ แƒจแƒ”แƒ”แƒ แƒ—แƒ”แƒ‘แƒ (แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ -p แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ strace), แƒ แƒแƒ“แƒ’แƒแƒœ แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜ seccomp-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ . แƒ›แƒ”แƒแƒ แƒ”แƒช, แƒแƒ แƒแƒœแƒแƒ˜แƒ แƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒฎแƒ”แƒ“แƒ”แƒ— แƒ‘แƒแƒ•แƒจแƒ•แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ seccomp แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒแƒ•แƒจแƒ•แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒก แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

แƒชแƒแƒขแƒ แƒ›แƒ”แƒขแƒ˜ แƒ“แƒ”แƒขแƒแƒšแƒ˜, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ–แƒฃแƒกแƒขแƒแƒ“ strace แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก seccomp แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ˜แƒซแƒ”แƒ‘แƒœแƒแƒก แƒกแƒแƒ˜แƒ“แƒแƒœ แƒ‘แƒแƒšแƒ แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ. แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ BPF, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ 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. แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒก แƒแƒฆแƒแƒ  แƒ’แƒแƒ•แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘, แƒ แƒแƒ“แƒ’แƒแƒœ แƒฃแƒ™แƒ•แƒ” แƒœแƒแƒ—แƒ”แƒšแƒ˜แƒ, แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒ˜แƒ— แƒ“แƒแƒฌแƒ”แƒ แƒ แƒแƒ แƒช แƒ—แƒฃ แƒ˜แƒกแƒ” แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ. แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ BPF - แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜, แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒ— 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 แƒจแƒ”แƒขแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ แƒ“แƒแƒกแƒแƒชแƒแƒ•แƒแƒ“. แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ BPF แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒแƒ•แƒ”แƒœ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  (แƒ“แƒ แƒ แƒแƒขแƒแƒ›) แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ”แƒœ BPF แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ”แƒœ แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒก แƒแƒกแƒ”แƒ—แƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ™แƒแƒ›แƒฃแƒœแƒแƒšแƒฃแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— 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 แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜ แƒ™แƒแƒ“แƒ˜. แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ’แƒ˜แƒ“แƒ’แƒ”แƒœแƒ— p0f BPF แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒก แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒ”แƒœ แƒ แƒ แƒแƒ แƒ˜แƒก p0f แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ“แƒแƒ˜แƒงแƒ•แƒแƒœแƒแƒ— 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-แƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜, แƒ˜แƒฎ. L4Drop: XDP DDoS แƒจแƒ”แƒ แƒ‘แƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜.

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 แƒฌแƒ”แƒšแƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒžแƒแƒขแƒฉแƒ”แƒ‘แƒ˜ แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒ’แƒแƒ›แƒแƒฉแƒ”แƒœแƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜. แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“แƒแƒช แƒ›แƒ” แƒ›แƒ”แƒกแƒ›แƒ˜แƒก, แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒ”แƒ’แƒ›แƒ แƒ˜แƒงแƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ แƒ“แƒ JIT แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜แƒก แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ, แƒ แƒแƒ—แƒ แƒฃแƒคแƒ แƒ แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒแƒ“ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก 64-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœ แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ›แƒแƒ’แƒ˜แƒ”แƒ แƒแƒ“ แƒแƒ› แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒแƒ› แƒแƒฆแƒœแƒ˜แƒจแƒœแƒ Linux-แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ—แƒแƒ•แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜.

แƒแƒ› แƒกแƒ”แƒ แƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒแƒฎแƒแƒšแƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒแƒกแƒ แƒ“แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒก, แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒ แƒแƒ’แƒแƒ แƒช แƒจแƒ˜แƒ“แƒ BPF, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒฃแƒšแƒ˜ BPF แƒ“แƒ แƒแƒฎแƒšแƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ BPF.

แƒšแƒ˜แƒขแƒ”แƒ แƒแƒขแƒฃแƒ แƒ

  1. แƒกแƒขแƒ˜แƒ•แƒ”แƒœ แƒ›แƒแƒ™แƒ™แƒ”แƒœแƒ˜ แƒ“แƒ แƒ•แƒแƒœ แƒฏแƒ”แƒ˜แƒ™แƒแƒ‘แƒกแƒแƒœแƒ˜, "BSD แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ˜: แƒแƒฎแƒแƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก", https://www.tcpdump.org/papers/bpf-usenix93.pdf
  2. แƒกแƒขแƒ˜แƒ•แƒ”แƒœ แƒ›แƒแƒ™แƒ™แƒ”แƒœแƒ˜, "libpcap: แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒ“แƒ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒแƒšแƒแƒ’แƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—", https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
  3. tcpdump, libpcap: https://www.tcpdump.org/
  4. IPtable U32 Match Tutorial.
  5. BPF - แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜: https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
  6. BPF แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒชแƒœแƒแƒ‘แƒ: https://blog.cloudflare.com/introducing-the-bpf-tools/
  7. bpf_cls: http://man7.org/linux/man-pages/man8/tc-bpf.8.html
  8. แƒ›แƒ”แƒแƒ แƒ” แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ: https://lwn.net/Articles/656307/
  9. https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
  10. habr: แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ“แƒแƒชแƒ•แƒ: seccomp
  11. habr: แƒ“แƒ”แƒ›แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ–แƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒ— แƒแƒœ โ€žแƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ“แƒแƒ™แƒ”แƒ แƒ˜!โ€œ
  12. แƒžแƒแƒš แƒฉแƒ”แƒ˜แƒœแƒ˜แƒแƒœแƒ˜, "strace --seccomp-bpf: แƒ’แƒแƒ›แƒแƒฎแƒ”แƒ“แƒ•แƒ แƒ™แƒแƒžแƒแƒขแƒ˜แƒก แƒฅแƒ•แƒ”แƒจ", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ