BPF แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžผแž“แžแžผแž… แž•แŸ’แž“แŸ‚แž€แžŸแžผแž“แŸ’แž™แŸ– BPF แž”แžปแžšแžถแžŽ

Berkeley Packet Filters (BPF) แž‚แžบแž‡แžถแž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแžแžบแžŽแŸ‚แž›แž›แžธแž“แžปแž… แžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž›แžพแž‘แŸ†แž–แŸแžšแž˜แžปแžแž“แŸƒแž€แžถแžšแž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแž‡แžถแž—แžถแžŸแžถแžขแž„แŸ‹แž‚แŸ’แž›แŸแžŸแžขแžŸแŸ‹แžšแž™แŸˆแž–แŸแž›แž‡แžถแž…แŸ’แžšแžพแž“แž†แŸ’แž“แžถแŸ†แž˜แž€แž แžพแž™แŸ” แžŸแž“แŸ’แž“แžทแžŸแžธแž‘แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ†แž–แŸแž‰แžŠแŸ„แž™แžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแŸ’แžแžธแž–แžธแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แž“แžทแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ BPF แŸ” David Miller แžขแŸ’แž“แž€แžแŸ‚แž‘แžถแŸ†แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžšแž„แž”แžŽแŸ’แžแžถแž‰แž›แžธแž“แžปแž… แž แŸ…แž€แžถแžšแž–แžทแž—แžถแž€แŸ’แžŸแžถแžšแž”แžŸแŸ‹แž‚แžถแžแŸ‹แž“แŸ… Linux Plumbers 2018 "แž€แžถแžšแž“แžทแž™แžถแž™แž“แŸแŸ‡แž˜แžทแž“แž˜แŸ‚แž“แž“แžทแž™แžถแž™แžขแŸ†แž–แžธ XDP แž‘แŸ" (XDP แž‚แžบแž‡แžถแž€แžšแžŽแžธแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž˜แžฝแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹ BPF) แŸ” Brendan Gregg แž•แŸ’แžแž›แŸ‹แž€แžถแžšแž–แžทแž—แžถแž€แŸ’แžŸแžถแžŠแŸ‚แž›แž˜แžถแž“แž…แŸ†แžŽแž„แž‡แžพแž„ แž›แžธแž“แžปแž… BPF แž˜แž แžถแžขแŸ†แžŽแžถแž…. Toke Hรธiland-Jรธrgensen แžŸแžพแž…แžแžถแžแžบแžŽแŸ‚แž›แžฅแžกแžผแžœแž“แŸแŸ‡แž‚แžบแž‡แžถแž˜แžธแž€แŸ’แžšแžผแžแžบแžŽแŸ‚แž›แŸ” Thomas Graf แž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™แž‚แŸ†แž“แžทแžแž“แŸ„แŸ‡แŸ” BPF แž‚แžบแž‡แžถ javascript แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแžบแžŽแŸ‚แž›.

แž“แŸ…แžแŸ‚แž˜แžทแž“แž˜แžถแž“แž€แžถแžšแž–แžทแž–แžŽแŸŒแž“แžถแž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž“แŸƒ BPF แž›แžพHabre แž‘แŸ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž‡แžถแž”แž“แŸ’แžแž”แž“แŸ’แž‘แžถแž”แŸ‹ แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž–แŸ’แž™แžถแž™แžถแž˜แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถ แž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแžงแž”แž€แžšแžŽแŸแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ แž“แžทแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แž แžพแž™แžšแŸ€แž”แžšแžถแž”แŸ‹แž–แžธแž•แŸ’แž“แŸ‚แž€แž“แŸƒแž€แžถแžšแžขแž“แžปแžœแžแŸ’แž แž“แžทแž„แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ BPF แŸ” แžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แžŸแžผแž“แŸ’แž™แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸŠแŸแžšแžธแž”แŸ’แžšแžถแž”แŸ‹แž–แžธแž”แŸ’แžšแžœแžแŸ’แžแžท แž“แžทแž„แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แž“แŸƒ BPF แž”แžปแžšแžถแžŽ แž แžพแž™แž€แŸแž”แž„แŸ’แž แžถแž‰แž–แžธแžขแžถแžแŸŒแž€แŸ†แž”แžถแŸ†แž„แž“แŸƒแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžšแž”แžŸแŸ‹แžœแžถแž•แž„แžŠแŸ‚แžšแŸ” tcpdump, seccomp, strace, แž“แžทแž„แž…แŸ’แžšแžพแž“แž‘แŸ€แžแŸ”

แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ BPF แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŠแŸ„แž™แžŸแž แž‚แž˜แž“แŸแž”แžŽแŸ’แžแžถแž‰แž›แžธแž“แžปแž… แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžšแžถแž”แŸ‹แžŸแŸ†แžแžถแž“แŸ‹แŸ—แžšแž”แžŸแŸ‹ BPF แž‚แžบแž‘แžถแž€แŸ‹แž‘แž„แž‘แŸ…แž“แžนแž„แž”แžŽแŸ’แžแžถแž‰ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™แžŠแŸ„แž™แž˜แžถแž“แž€แžถแžšแžขแž“แžปแž‰แŸ’แž‰แžถแžแŸ” @eucariotแžแŸ’แž‰แžปแŸ†แž”แžถแž“แž แŸ…แžŸแŸŠแŸแžšแžธ "BPF แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžผแž“แžแžผแž…" แž‡แžถแž€แžทแžแŸ’แžแžทแž™แžŸแž“แŸƒแžŸแŸŠแŸแžšแžธแžŠแŸแžขแžŸแŸ’แž…แžถแžšแŸ’แž™ "แž”แžŽแŸ’แžแžถแž‰แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แŸ’แž˜แŸแž„แžแžผแž…".

แžœแž‚แŸ’แž‚แžแŸ’แž›แžธแž˜แžฝแž™แž€แŸ’แž“แžปแž„แž”แŸ’แžšแžœแžแŸ’แžแžทแžŸแžถแžŸแŸ’แžšแŸ’แžแž“แŸƒ BPF (c)

แž”แž…แŸ’แž…แŸแž€แžœแžทแž‡แŸ’แž‡แžถ BPF แž‘แŸ†แž“แžพแž”แž‚แžบแž‡แžถแž€แŸ†แžŽแŸ‚แžŠแŸ‚แž›แž”แžถแž“แž€แŸ‚แž›แž˜แŸ’แžข แž“แžทแž„แž–แž„แŸ’แžšแžธแž€แž“แŸƒแž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแž…แžถแžŸแŸ‹แžŠแŸ‚แž›แž˜แžถแž“แžˆแŸ’แž˜แŸ„แŸ‡แžŠแžผแž…แž‚แŸ’แž“แžถ แžŠแŸ‚แž›แžฅแžกแžผแžœแž“แŸแŸ‡แž แŸ…แžแžถ BPF แž”แžปแžšแžถแžŽ แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ€แžŸแžœแžถแž„แž€แžถแžšแž—แžถแž“แŸ‹แž…แŸ’แžšแžกแŸ†แŸ” แžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž›แŸ’แž”แžธแž˜แžฝแž™แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพ BPF แž”แžปแžšแžถแžŽ tcpdump, แž™แž“แŸ’แžแž€แžถแžš seccompแž€แŸแžŠแžผแž…แž‡แžถแž˜แŸ‰แžผแžŒแžปแž›แžŠแŸ‚แž›แž˜แžทแž“แžŸแžผแžœแžŸแŸ’แž‚แžถแž›แŸ‹ xt_bpf แžŸแž˜แŸ’แžšแžถแž”แŸ‹ iptables แž“แžทแž„แžขแŸ’แž“แž€แž…แžถแžแŸ‹แžแŸ’แž“แžถแž€แŸ‹ cls_bpf. แž“แŸ…แž€แŸ’แž“แžปแž„แž›แžธแž“แžปแž…แž‘แŸ†แž“แžพแž” แž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แž”แžปแžšแžถแžŽแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž€แž”แŸ’แžšแŸ‚แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž‘แŸ…แž‡แžถแž‘แž˜แŸ’แžšแž„แŸ‹แžแŸ’แž˜แžธ แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แžแžถแž˜แž‘แžŸแŸ’แžŸแž“แŸˆแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพ API แž“แŸ…แžแŸ‚แž˜แžถแž“แž“แŸ…แž“แžนแž„แž€แž“แŸ’แž›แŸ‚แž„ แž แžพแž™แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžแŸ’แž˜แžธแžŸแž˜แŸ’แžšแžถแž”แŸ‹ BPF แž”แžปแžšแžถแžŽ แžŠแžผแž…แžŠแŸ‚แž›แž™แžพแž„แž“แžนแž„แžƒแžพแž‰แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แž“แŸ…แžแŸ‚แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž€แžƒแžพแž‰แŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž แŸแžแžปแž•แž›แž“แŸแŸ‡ แž แžพแž™แž€แŸแžŠแŸ„แž™แžŸแžถแžšแžแŸ‚แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ BPF แž”แžปแžšแžถแžŽแž“แŸ…แž€แŸ’แž“แžปแž„แž›แžธแž“แžปแž… แžœแžถแž“แžนแž„แž€แžถแž“แŸ‹แžแŸ‚แž…แŸ’แž”แžถแžŸแŸ‹แžขแŸ†แž–แžธแžšแž”แŸ€แž” แž“แžทแž„แž˜แžผแž›แž แŸแžแžปแžŠแŸ‚แž›แžœแžถแžœแžทแžœแžแŸ’แžแž‘แŸ…แž‡แžถแž‘แž˜แŸ’แžšแž„แŸ‹แž‘แŸ†แž“แžพแž”แžšแž”แžŸแŸ‹แžœแžถ แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž‡แžถแž˜แžฝแž™แž“แžนแž„แžขแžแŸ’แžแž”แž‘แžขแŸ†แž–แžธ BPF แž”แžปแžšแžถแžŽแŸ”

แž“แŸ…แž…แžปแž„แž”แž‰แŸ’แž…แž”แŸ‹แž“แŸƒแž‘แžŸแžœแžแŸ’แžŸแžšแŸแž‘แžธ XNUMX แž“แŸƒแžŸแžแžœแžแŸ’แžŸแž…แžปแž„แž€แŸ’แžšแŸ„แž™แž“แŸแŸ‡ แžœแžทแžŸแŸ’แžœแž€แžšแž˜แž€แž–แžธแž˜แž“แŸ’แž‘แžธแžšแž–แžทแžŸแŸ„แž’แž“แŸ Lawrence Berkeley แžŠแŸแž›แŸ’แž”แžธแž›แŸ’แž”แžถแž‰แž”แžถแž“แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž›แžพแžŸแŸ†แžŽแžฝแžšแžขแŸ†แž–แžธแžšแž”แŸ€แž”แžแŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹แž”แžŽแŸ’แžแžถแž‰แžฑแŸ’แž™แž”แžถแž“แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœแž“แŸ…แž›แžพแž•แŸ’แž“แŸ‚แž€แžšแžนแž„แžŠแŸ‚แž›แž‘แŸ†แž“แžพแž”แž“แŸ…แž…แžปแž„แž‘แžŸแžœแžแŸ’แžŸแžšแŸแž‘แžธ XNUMX แž“แŸƒแžŸแžแžœแžแŸ’แžŸแž‘แžธแž…แžปแž„แž€แŸ’แžšแŸ„แž™แŸ” แž‚แŸ†แž“แžทแžแž‡แžถแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž“แŸƒแž€แžถแžšแžแŸ’แžšแž„แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแžŠแŸ†แž”แžผแž„แž“แŸ…แž€แŸ’แž“แžปแž„แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถ CSPF (CMU/Stanford Packet Filter) แž‚แžบแžŠแžพแž˜แŸ’แž”แžธแžแŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžŠแŸ‚แž›แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แžฑแŸ’แž™แž”แžถแž“แž†แžถแž”แŸ‹แžแžถแž˜แžŠแŸ‚แž›แžขแžถแž…แž’แŸ’แžœแžพแž‘แŸ…แž”แžถแž“ แž–แŸ„แž›แž‚แžบแžงแŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แž…แž“แŸ’แž›แŸ„แŸ‡แžแžบแžŽแŸ‚แž› แž–แŸ’แžšแŸ„แŸ‡แžœแžถแž‡แŸ€แžŸแžœแžถแž„แž€แžถแžšแž…แž˜แŸ’แž›แž„แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แž‘แŸ…แž€แŸ’แž“แžปแž„แž‘แŸ†แž แŸ†แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ” แžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แžแž›แŸ‹แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž–แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แžผแžŠแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž€แŸ’แž“แžปแž„แž…แž“แŸ’แž›แŸ„แŸ‡แžแžบแžŽแŸ‚แž› แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแž Sandbox แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ”

แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแž˜แŸ’แžšแž„แžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžšแžถแž”แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž…แž“แžถแžกแžพแž„แžŠแžพแž˜แŸ’แž”แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แžŠแŸ‚แž›แž˜แžถแž“แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž›แžพแž‡แž„แŸ‹ แž แžพแž™แž˜แžทแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ’แžšแž€แž”แžŠแŸ„แž™แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แžŠแžผแž…แž˜แŸ‰แžถแžŸแŸŠแžธแž“ RISC แžแŸ’แž˜แžธแž‡แžถแž„แž“แŸแŸ‡แž‘แŸแŸ” แž‡แžถแž›แž‘แŸ’แž’แž•แž› แžแžถแž˜แžšแž™แŸˆแž€แžถแžšแžแžทแžแžแŸ†แž”แŸ’แžšแžนแž„แž”แŸ’แžšแŸ‚แž„แžšแž”แžŸแŸ‹แžœแžทแžŸแŸ’แžœแž€แžšแž˜แž€แž–แžธ Berkeley Labs แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถ BPF (Berkeley Packet Filters) แžแŸ’แž˜แžธแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„ แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแžแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž…แž“แžถแžกแžพแž„แžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ†แžŽแžพแžšแž€แžถแžš Motorola 6502 แžŠแŸ‚แž›แž‡แžถแž€แž˜แŸ’แž›แžถแŸ†แž„แž–แž›แž€แž˜แŸ’แž˜แž“แŸƒแž•แž›แžทแžแž•แž›แž›แŸ’แž”แžธแžŠแžผแž…แž‡แžถ Apple II แžฌ แžขแžทแž“แŸ” แžขแŸ. แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแžแžแŸ’แž˜แžธแž”แžถแž“แž”แž„แŸ’แž€แžพแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแž˜แŸ’แžšแž„แžšแžถแž”แŸ‹แžŸแžทแž”แžŠแž„แž”แžพแž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž‘แŸ…แž“แžนแž„แžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžšแžถแž”แŸ‹แŸ”

แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“ BPF

แž™แžพแž„แž“แžนแž„แžŸแŸ’แž‚แžถแž›แŸ‹แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แžแžถแž˜แžšแž”แŸ€แž”แž’แŸ’แžœแžพแž€แžถแžšแžŠแŸ„แž™แžœแžทแž—แžถแž‚แžงแž‘แžถแž แžšแžŽแŸแŸ” แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แžŠแžพแž˜แŸ’แž”แžธแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ แžงแž”แž˜แžถแžแžถแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แžถแž“แž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡ 32-bit แž…แŸ†แž“แžฝแž“แž–แžธแžšแžŠแŸ‚แž›แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แžŠแŸ‚แž›แž‡แžถแžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแž˜แžผแž›แž•แŸ’แžแžปแŸ† A แž“แžทแž„แž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แžŸแž“แŸ’แž‘แžŸแŸ’แžŸแž“แŸ X, 64 แž”แŸƒแž“แŸƒแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ† (16 แž–แžถแž€แŸ’แž™) แž˜แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŸแžšแžŸแŸแžš แž“แžทแž„แž€แžถแžšแžขแžถแž“แž‡แžถแž”แž“แŸ’แžแž”แž“แŸ’แž‘แžถแž”แŸ‹ แž“แžทแž„แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžแžผแž…แž˜แžฝแž™แž“แŸƒแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แžœแžแŸ’แžแžปแž‘แžถแŸ†แž„แž“แŸแŸ‡แŸ” แž€แžถแžšแžŽแŸ‚แž“แžถแŸ†แž›แŸ„แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž€แž“แŸ’แžŸแŸ„แž˜แžแžถแž˜แž›แž€แŸ’แžแžแžŽแŸ’แžŒแž€แŸแž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ‚แžš แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŠแžพแž˜แŸ’แž”แžธแž’แžถแž“แžถแž€แžถแžšแž”แž‰แŸ’แž…แž”แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‘แžถแž“แŸ‹แž–แŸแž›แžœแŸแž›แžถ แž€แžถแžšแž›แŸ„แžแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžกแžพแž„แž‘แŸ…แž˜แžปแžแžแŸ‚แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แž–แŸ„แž›แž‚แžบ แž‡แžถแž–แžทแžŸแŸแžŸแžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž แžถแž˜แžƒแžถแžแŸ‹แž˜แžทแž“แžฑแŸ’แž™แž”แž„แŸ’แž€แžพแžแžšแž„แŸ’แžœแžทแž›แž‡แžปแŸ†แŸ”

แž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸแž‘แžผแž‘แŸ…แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แžถแž“แžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ” แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž”แž„แŸ’แž€แžพแžแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ BPF แž“แžทแž„แžŠแŸ„แž™แž”แŸ’แžšแžพ แžแŸ’แž›แŸ‡ แž™แž“แŸ’แžแž€แžถแžšแžแžบแžŽแŸ‚แž› (แžŠแžผแž…แž‡แžถแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’) แž•แŸ’แž‘แžปแž€ แž“แžทแž„แž—แŸ’แž‡แžถแž”แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‘แŸ… แž‘แŸ…แžแŸ’แž›แŸ‡ แž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž”แž„แŸ’แž€แžพแžแž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแž“แŸ…แž€แŸ’แž“แžปแž„แžแžบแžŽแŸ‚แž› (แžงแž‘แžถแž แžšแžŽแŸ แž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแž˜แžฝแž™แž‚แžบแž‡แžถแž€แžถแžšแž˜แž€แžŠแž›แŸ‹แž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž”แž“แŸ’แž‘แžถแž”แŸ‹แž“แŸ…แž›แžพแž€แžถแžแž”แžŽแŸ’แžแžถแž‰)แŸ” แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแž˜แžฝแž™แž€แžพแžแžกแžพแž„ แžแžบแžŽแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ (แžงแž‘แžถแž แžšแžŽแŸ แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แž€แž”แŸ’แžšแŸ‚) แž แžพแž™แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แž˜แŸ‰แžถแžŸแŸŠแžธแž“แžแŸ’แžšแžผแžœแž“แžนแž„ แž‘แŸ…แžแŸ’แž›แŸ‡ แžแŸ†แž”แž“แŸ‹แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แžแžบแžŽแŸ‚แž› (แžงแž‘แžถแž แžšแžŽแŸ แž‘แžทแž“แŸ’แž“แž“แŸแž™แž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž…แžผแž›)แŸ”

แžแžถแž„แž›แžพแž“แžนแž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž™แžพแž„แžŠแžพแž˜แŸ’แž”แžธแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แžพแž›แžงแž‘แžถแž แžšแžŽแŸแŸ– แž™แžพแž„แž“แžนแž„แžŸแŸ’แž‚แžถแž›แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž“แžทแž„แž‘แž˜แŸ’แžšแž„แŸ‹แž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแžแžถแž˜แž€แžถแžšแž…แžถแŸ†แž”แžถแž…แŸ‹แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แžŸแžทแž€แŸ’แžŸแžถแž—แŸ’แž›แžถแž˜แŸ—แž“แžผแžœแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แž‰แŸ’แž‡แžถแžšแž”แžŸแŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž“แžทแž˜แŸ’แž˜แžทแž แž“แžทแž„แžŸแŸ’แžœแŸ‚แž„แž™แž›แŸ‹แžขแŸ†แž–แžธแžŸแž˜แžแŸ’แžแž—แžถแž–แžšแž”แžŸแŸ‹แžœแžถแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸ„แŸ‡ แžขแŸ’แž“แž€แžขแžถแž…แžขแžถแž“แžขแžแŸ’แžแž”แž‘แžŠแžพแž˜ แžแž˜แŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹ BSD แž“แžทแž„/แžฌแž–แžถแž€แŸ‹แž€แžŽแŸ’แžแžถแž›แžŠแŸ†แž”แžผแž„แž“แŸƒแžฏแž€แžŸแžถแžš แžฏแž€แžŸแžถแžš/แž”แžŽแŸ’แžแžถแž‰/filter.txt แž–แžธแžฏแž€แžŸแžถแžšแžแžบแžŽแŸ‚แž›แŸ” แž›แžพแžŸแž–แžธแž“แŸแŸ‡แž‘แŸ€แžแžขแŸ’แž“แž€แžขแžถแž…แžŸแžทแž€แŸ’แžŸแžถแž”แž‘แž”แž„แŸ’แž แžถแž‰ libpcapแŸ– แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžšแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ แž“แžทแž„แž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž™แž€แž€แž‰แŸ’แž…แž”แŸ‹แžŠแŸ‚แž›แž€แŸ’แž“แžปแž„แž“แŸ„แŸ‡ McCanne แžŠแŸ‚แž›แž‡แžถแžขแŸ’แž“แž€แž“แžทแž–แž“แŸ’แž’แž˜แŸ’แž“แžถแž€แŸ‹แž“แŸƒ BPF แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž€แžถแžšแž”แž„แŸ’แž€แžพแž libpcap.

แžฅแžกแžผแžœแž“แŸแŸ‡แž™แžพแž„แž”แž“แŸ’แžแž‘แŸ…แž–แžทแž…แžถแžšแžŽแžถแžงแž‘แžถแž แžšแžŽแŸแžŸแŸ†แžแžถแž“แŸ‹แŸ—แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸƒแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ BPF แž”แžปแžšแžถแžŽแž“แŸ…แž›แžพแž›แžธแž“แžปแž…แŸ– tcpdump (libpcap), seccomp, xt_bpf, cls_bpf.

tcpdump

แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ BPF แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแžŸแŸ’แžšแž”แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž•แŸ’แž“แŸ‚แž€แžแžถแž„แž˜แžปแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžแŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“ - แžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž›แŸ’แž”แžธ tcpdump. แž แžพแž™แžŠแŸ„แž™แžŸแžถแžšแž“แŸแŸ‡แž‚แžบแž‡แžถแžงแž‘แžถแž แžšแžŽแŸแž…แžถแžŸแŸ‹แž”แŸ†แž•แžปแž แž“แžทแž„แž›แŸ’แž”แžธแž›แŸ’แž”แžถแž‰แž”แŸ†แž•แžปแžแž“แŸƒแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ BPF แž”แžปแžšแžถแžŽแžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž›แžพแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแž‡แžถแž…แŸ’แžšแžพแž“ แž™แžพแž„แž“แžนแž„แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž€แžถแžšแžŸแžทแž€แŸ’แžŸแžถแžšแž”แžŸแŸ‹แž™แžพแž„แžขแŸ†แž–แžธแž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแž‡แžถแž˜แžฝแž™แžœแžถแŸ”

(แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžšแžแŸ‹แžงแž‘แžถแž แžšแžŽแŸแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แž“แŸ…แž›แžพแž›แžธแž“แžปแž… 5.6.0-rc6. แž›แž‘แŸ’แž’แž•แž›แž“แŸƒแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแž˜แžฝแž™แž…แŸ†แž“แžฝแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžขแžถแž“แž€แžถแž“แŸ‹แžแŸ‚แž”แŸ’แžšแžŸแžพแžšแŸ” )

แžงแž‘แžถแž แžšแžŽแŸแŸ– แž€แžถแžšแžŸแž„แŸ’แž€แŸแžแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“ IPv6

แžŸแžผแž˜แžŸแŸ’แžšแž˜แŸƒแžแžถแž™แžพแž„แž…แž„แŸ‹แž˜แžพแž›แž€แž‰แŸ’แž…แž”แŸ‹ IPv6 แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸ…แž›แžพแž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แž˜แžฝแž™แŸ” eth0. แžŠแžพแž˜แŸ’แž”แžธแž’แŸ’แžœแžพแžŠแžผแž…แž“แŸแŸ‡แž™แžพแž„แžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ tcpdump แž‡แžถแž˜แžฝแž™แž“แžนแž„แžแž˜แŸ’แžšแž„แžŸแžถแž˜แž‰แŸ’แž‰ ip6:

$ sudo tcpdump -i eth0 ip6

แžŠแžผแž…แŸ’แž“แŸแŸ‡ tcpdump แž…แž„แž€แŸ’แžšแž„แžแž˜แŸ’แžšแž„ ip6 แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„ BPF architecture bytecode แž แžพแž™แž•แŸ’แž‰แžพแžœแžถแž‘แŸ…แžแžบแžŽแŸ‚แž› (แžŸแžผแž˜แž˜แžพแž›แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแžแž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž“แŸ‚แž€ 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)th byte แž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž”แžŽแŸ’แžแžถแž‰แžŠแŸ‚แž›แž”แžถแž“แžœแžทแž—แžถแž‚แŸ” แž™แžพแž„แžขแžถแž“แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž–แžธแž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แžขแŸŠแžธแžŸแžบแžšแžŽแžทแž eth0, แž แžพแž™โ€‹แž“แŸแŸ‡ แž˜แž’แŸ’แž™แŸ„แž”แžถแž™แžแžถแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž“แŸแŸ‡ (แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž—แžถแž–แžŸแžถแž˜แž‰แŸ’แž‰ แž™แžพแž„แžŸแž“แŸ’แž˜แžแŸ‹แžแžถแž˜แžทแž“แž˜แžถแž“แžŸแŸ’แž›แžถแž€ VLAN แž“แŸ…แž€แŸ’แž“แžปแž„แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž‘แŸ)แŸ–

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

แžŠแžผแž…แŸ’แž“แŸแŸ‡แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถ ldh [12] แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡ A แžœแžถแž“แžนแž„แž˜แžถแž“แžœแžถแž›แž˜แžฝแž™แŸ” Ether Type - แž”แŸ’แžšแž—แŸแž‘แž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž‡แžผแž“แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸŠแžปแž˜แžขแŸŠแžธแžŸแžบแžšแžŽแžทแžแž“แŸแŸ‡แŸ” แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธ 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 (แž”แŸ’แžšแž—แŸแž‘ Ether = 0x800) แž แžพแž™แž•แŸ’แž‘แžปแž€แžœแžถแž‘แŸ…แž€แŸ’แž“แžปแž„แž”แž‰แŸ’แž‡แžธ A 24 แž”แŸƒแž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แŸ” แž€แž‰แŸ’แž…แž”แŸ‹แžšแž”แžŸแŸ‹แž™แžพแž„แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž‡แžถ

       14            8      1     1
|ethernet header|ip fields|ttl|protocol|...|

แžŠแŸ‚แž›แž˜แžถแž“แž“แŸแž™แžแžถแž™แžพแž„แž•แŸ’แž‘แžปแž€แž‘แŸ…แž€แŸ’แž“แžปแž„แž”แž‰แŸ’แž‡แžธ A แžœแžถแž› Protocol แž“แŸƒแž”แž‹แž˜แž€แžแžถ 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, i.e. แž™แžพแž„แž€แŸแž˜แžทแž“แžขแžถแž…แž“แžทแž™แžถแž™แž”แžถแž“แžŠแŸ‚แžšแŸ” ldb 4*([14]&0xf) แž˜แžทแž“ ldxb 5*([14]&0xf) (แž™แžพแž„แžขแžถแž…แž”แž‰แŸ’แž‡แžถแž€แŸ‹แž”แžถแž“แžแŸ‚แžขแžปแž แŸ’แžœแžŸแžทแžแž•แŸ’แžŸแŸแž„แžงแž‘แžถแž แžšแžŽแŸ ldxb 4*([16]&0xf)) แžœแžถแž…แŸ’แž”แžถแžŸแŸ‹แžŽแžถแžŸแŸ‹แžแžถแž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸแžขแžถแžŸแž™แžŠแŸ’แž‹แžถแž“แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ… BPF แž™แŸ‰แžถแž„แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžŠแžพแž˜แŸ’แž”แžธแž‘แž‘แžฝแž›แž”แžถแž“ X (แž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แžŸแž“แŸ’แž‘แžŸแŸ’แžŸแž“แŸ) แž”แŸ’แžšแžœแŸ‚แž„แž”แž‹แž˜แž€แžแžถ IPv4 แŸ”

แžŠแžผแž…แŸ’แž“แŸแŸ‡แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธ 7 แž™แžพแž„แž–แŸ’แž™แžถแž™แžถแž˜แž•แŸ’แž‘แžปแž€แž–แžถแž€แŸ’แž™แž–แžถแž€แŸ‹แž€แžŽแŸ’แžแžถแž› (X+16). แž…แž„แž…แžถแŸ†แžแžถ 14 แž”แŸƒแžแŸ’แžšแžผแžœแž”แžถแž“แž€แžถแž“แŸ‹แž€แžถแž”แŸ‹แžŠแŸ„แž™แž”แž‹แž˜แž€แžแžถ Ethernet แž“แžทแž„ X แž˜แžถแž“แž”แŸ’แžšแžœแŸ‚แž„แž“แŸƒแž”แž‹แž˜แž€แžแžถ IPv4 แž™แžพแž„แž™แž›แŸ‹แžแžถแž“แŸ…แž€แŸ’แž“แžปแž„ A แž…แŸ’แžšแž€แž‚แŸ„แž›แžŠแŸ… TCP แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‘แžปแž€แŸ–

       14           X           2             2
|ethernet header|ip header|source port|destination port|

แž‘แžธแž”แŸ†แž•แžปแžแž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธ 8 แž™แžพแž„แž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž…แŸ’แžšแž€แž‚แŸ„แž›แžŠแŸ…แž‡แžถแž˜แžฝแž™แž“แžนแž„แžแž˜แŸ’แž›แŸƒแžŠแŸ‚แž›แž…แž„แŸ‹แž”แžถแž“ แž แžพแž™แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธ 9 แžฌ 10 แž™แžพแž„แž•แŸ’แžแž›แŸ‹แž›แž‘แŸ’แž’แž•แž›แž˜แž€แžœแžทแž‰แžแžถแžแžพแžแŸ’แžšแžผแžœแž…แž˜แŸ’แž›แž„แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžฌแžขแžแŸ‹แŸ”

TcpdumpแŸ– แž€แŸ†แž–แžปแž„แž•แŸ’แž‘แžปแž€

แž“แŸ…แž€แŸ’แž“แžปแž„แžงแž‘แžถแž แžšแžŽแŸแž–แžธแž˜แžปแž“ แž™แžพแž„แž˜แžทแž“แž”แžถแž“แž”แž‰แŸ’แž‡แžถแž€แŸ‹แž›แž˜แŸ’แžขแžทแžแžขแŸ†แž–แžธแžšแž”แŸ€แž”แžŠแŸ‚แž›แž™แžพแž„แž•แŸ’แž‘แžปแž€ BPF bytecode แž‘แŸ…แž€แŸ’แž“แžปแž„แžแžบแžŽแŸ‚แž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžแŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž“แŸ„แŸ‡แž‘แŸแŸ” แž“แžทแž™แžถแž™แž‡แžถแž‘แžผแž‘แŸ…, tcpdump แž”แž‰แŸ’แž‡แžผแž“แž‘แŸ…แž€แžถแž“แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‡แžถแž…แŸ’แžšแžพแž“ แž“แžทแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แžแž˜แŸ’แžšแž„ tcpdump แž”แŸ’แžšแžพแž”แžŽแŸ’แžŽแžถแž›แŸแž™ libpcap. แžŠแŸ„แž™แžŸแž„แŸ’แžแŸแž” แžŠแžพแž˜แŸ’แž”แžธแžŠแžถแž€แŸ‹แžแž˜แŸ’แžšแž„แž›แžพแž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แžŠแŸ„แž™แž”แŸ’แžšแžพ libpcapแžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž’แŸ’แžœแžพแžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸˆ

  • แž”แž„แŸ’แž€แžพแžแžขแŸ’แž“แž€แž–แžทแž–แžŽแŸŒแž“แžถแž”แŸ’แžšแž—แŸแž‘ pcap_t แž–แžธแžˆแŸ’แž˜แŸ„แŸ‡แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แŸ– pcap_create,
  • แž’แŸ’แžœแžพแžฑแŸ’แž™แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แžŸแž€แž˜แŸ’แž˜แŸ– pcap_activate,
  • แž…แž„แž€แŸ’แžšแž„แžแž˜แŸ’แžšแž„แŸ– pcap_compile,
  • แž—แŸ’แž‡แžถแž”แŸ‹แžแž˜แŸ’แžšแž„แŸ– pcap_setfilter.

แžŠแžพแž˜แŸ’แž”แžธแž˜แžพแž›แž˜แžปแžแž„แžถแžš pcap_setfilter แžขแž“แžปแžœแžแŸ’แžแž“แŸ…แž€แŸ’แž“แžปแž„แž›แžธแž“แžปแž… แž™แžพแž„แž”แŸ’แžšแžพ strace (แž”แž“แŸ’แž‘แžถแžแŸ‹แžแŸ’แž›แŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแž€แž…แŸแž‰)แŸ–

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžทแž“แŸ’แž“แž•แž›แž–แžธแžšแžŠแŸ†แž”แžผแž„แž™แžพแž„แž”แž„แŸ’แž€แžพแž แžšแž“แŸ’แž’แž†แŸ… แžŠแžพแž˜แŸ’แž”แžธแžขแžถแž“แžŸแŸŠแžปแž˜แžขแŸŠแžธแžŸแžบแžšแžŽแžทแžแž‘แžถแŸ†แž„แžขแžŸแŸ‹ แž แžพแž™แž—แŸ’แž‡แžถแž”แŸ‹แžœแžถแž‘แŸ…แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹ eth0... แž–แžธ แžงแž‘แžถแž แžšแžŽแŸแžŠแŸ†แž”แžผแž„แžšแž”แžŸแŸ‹แž™แžพแž„แŸ” แž™แžพแž„แžŠแžนแž„แžแžถแžแž˜แŸ’แžšแž„ ip แž“แžนแž„แž˜แžถแž“แž€แžถแžšแžŽแŸ‚แž“แžถแŸ† BPF แž…แŸ†แž“แžฝแž“แž”แžฝแž“ แž แžพแž™แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธแž”แžธ แž™แžพแž„แžƒแžพแž‰แž–แžธแžšแž”แŸ€แž”แž”แŸ’แžšแžพแž‡แž˜แŸ’แžšแžพแžŸ SO_ATTACH_FILTER แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’ setsockopt แž™แžพแž„แž•แŸ’แž‘แžปแž€แž“แžทแž„แž—แŸ’แž‡แžถแž”แŸ‹แžแž˜แŸ’แžšแž„แž”แŸ’แžšแžœแŸ‚แž„ 4. แž“แŸแŸ‡แž‚แžบแž‡แžถแžแž˜แŸ’แžšแž„แžšแž”แžŸแŸ‹แž™แžพแž„แŸ”

แžœแžถแž‚แžฝแžšแžฑแŸ’แž™แž€แžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžแžถแž“แŸ…แž€แŸ’แž“แžปแž„ BPF แž”แžปแžšแžถแžŽแž€แžถแžšแž•แŸ’แž‘แžปแž€แž“แžทแž„แž—แŸ’แž‡แžถแž”แŸ‹แžแž˜แŸ’แžšแž„แžแŸ‚แž„แžแŸ‚แž€แžพแžแžกแžพแž„แž‡แžถแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžขแžถแžแžผแž˜แžทแž€แž แžพแž™แž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแž“แŸƒ BPF แž€แžถแžšแž•แŸ’แž‘แžปแž€แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž“แžทแž„แž…แž„แžœแžถแž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž”แž„แŸ’แž€แžพแžแž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ†แž”แŸ‚แž€แžแžถแž˜แž–แŸแž›แžœแŸแž›แžถแŸ”

แž€แžถแžšแž–แžทแžแžŠแŸ‚แž›แž›แžถแž€แŸ‹

แž€แŸ†แžŽแŸ‚แž–แŸแž‰แž›แŸแž‰แž‡แžถแž„แž”แž“แŸ’แžแžทแž…แž“แŸƒแž›แž‘แŸ’แž’แž•แž›แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž“แŸแŸ‡แŸ–

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0xbeefbeefbeef}, 16) = 0
recvfrom(3, 0x7ffcad394257, 1, MSG_TRUNC, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

แžŠแžผแž…แžŠแŸ‚แž›แž”แžถแž“แžšแŸ€แž”แžšแžถแž”แŸ‹แžแžถแž„แž›แžพแž™แžพแž„แž•แŸ’แž‘แžปแž€แž“แžทแž„แž—แŸ’แž‡แžถแž”แŸ‹แžแž˜แŸ’แžšแž„แžšแž”แžŸแŸ‹แž™แžพแž„แž‘แŸ…แžšแž“แŸ’แž’แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธ 5 แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžแžพแž˜แžถแž“แžขแŸ’แžœแžธแž€แžพแžแžกแžพแž„แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แžธ 3 แž“แžทแž„แž‘แžธ 4? แžœแžถแž”แŸ’แžšแŸ‚แžแžถแž“แŸแŸ‡แŸ” libpcap แžแŸ‚แžšแž€แŸ’แžŸแžถแž–แžฝแž€แž™แžพแž„ - แžŠแžผแž…แŸ’แž“แŸแŸ‡แžแžถแž›แž‘แŸ’แž’แž•แž›แž“แŸƒแžแž˜แŸ’แžšแž„แžšแž”แžŸแŸ‹แž™แžพแž„แž˜แžทแž“แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžŠแŸ‚แž›แž˜แžทแž“แž–แŸแž‰แž…แžทแžแŸ’แžแžœแžถ แž”แžŽแŸ’แžŽแžถแž›แŸแž™ แž—แŸ’แž‡แžถแž”แŸ‹ แžแž˜แŸ’แžšแž„แžขแžแŸ‹แž…แŸแŸ‡แžŸแŸ„แŸ‡ ret #0 (แž‘แž˜แŸ’แž›แžถแž€แŸ‹แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž‘แžถแŸ†แž„แžขแžŸแŸ‹) แž”แŸ’แžแžผแžšแžšแž“แŸ’แž’แž‘แŸ…แžšแž”แŸ€แž”แž˜แžทแž“แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹ แž แžพแž™แž–แŸ’แž™แžถแž™แžถแž˜แžŠแž€แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž‘แžถแŸ†แž„แžขแžŸแŸ‹แžŠแŸ‚แž›แžขแžถแž…แž“แŸ…แžŸแž›แŸ‹แž–แžธแžแž˜แŸ’แžšแž„แž–แžธแž˜แžปแž“แŸ”

แžŸแžšแžปแž”แž˜แž€ แžŠแžพแž˜แŸ’แž”แžธแžแŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹แž“แŸ…แž›แžพแž›แžธแž“แžปแž…แžŠแŸ„แž™แž”แŸ’แžšแžพ BPF แž”แžปแžšแžถแžŽ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž˜แžถแž“แžแž˜แŸ’แžšแž„แž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹แž‡แžถแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแžผแž…แž‡แžถ struct sock_fprog แž“แžทแž„แžšแž“แŸ’แž’แž”แžพแž€ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž“แŸ„แŸ‡แžแž˜แŸ’แžšแž„แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แžšแž“แŸ’แž’แžŠแŸ„แž™แž”แŸ’แžšแžพแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’ setsockopt.

แž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžแž˜แŸ’แžšแž„แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž“แžนแž„แžšแž“แŸ’แž’แžŽแžถแž˜แžฝแž™แž˜แžทแž“แžแŸ’แžšแžนแž˜แžแŸ‚แž†แŸ…แž‘แŸแŸ” แž“แŸ…แž‘แžธแž“แŸแŸ‡ แžงแž‘แžถแž แžšแžŽแŸ แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ‚แž›แž€แžถแžแŸ‹แž•แŸ’แžแžถแž…แŸ‹แž‘แžถแŸ†แž„แžขแžŸแŸ‹ แž›แžพแž€แž›แŸ‚แž„แžแŸ‚แž–แžธแžšแž”แŸƒแžŠแŸ†แž”แžผแž„แž–แžธแž‘แžทแž“แŸ’แž“แž“แŸแž™ UDP แžŠแŸ‚แž›แž…แžผแž›แž˜แž€แž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ” (แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžผแžŠ แžŠแžพแž˜แŸ’แž”แžธแž€แžปแŸ†แžฑแŸ’แž™แž˜แžถแž“แž€แžถแžšแž–แž„แŸ’แžšแžถแž™แžขแžแŸ’แžแž”แž‘แŸ” )

แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแžแž”แž“แŸ’แžแŸ‚แž˜แžขแŸ†แž–แžธแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ setsockopt แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžแž˜แŸ’แžšแž„ แžŸแžผแž˜แž˜แžพแž› แžšแž“แŸ’แž’ (7)แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžขแŸ†แž–แžธแž€แžถแžšแžŸแžšแžŸแŸแžšแžแž˜แŸ’แžšแž„แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžŠแžผแž…แž‡แžถ struct sock_fprog แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž‡แŸ†แž“แžฝแž™ tcpdump แž™แžพแž„แž“แžนแž„แž“แžทแž™แžถแž™แž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž“แŸ‚แž€ แž€แžถแžšแžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แžŠแŸ„แž™แžŠแŸƒแžšแž”แžŸแŸ‹แž™แžพแž„แž•แŸ’แž‘แžถแž›แŸ‹.

แž”แžปแžšแžถแžŽ BPF แž“แžทแž„แžŸแžแžœแžแŸ’แžŸแž‘แžธ XNUMX

BPF แžแŸ’แžšแžผแžœแž”แžถแž“แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž“แŸ…แž€แŸ’แž“แžปแž„แž›แžธแž“แžปแž…แž€แŸ’แž“แžปแž„แž†แŸ’แž“แžถแŸ† 1997 แž แžพแž™แž“แŸ…แžแŸ‚แž‡แžถแžขแŸ’แž“แž€แž’แŸ’แžœแžพแž€แžถแžšแžขแžŸแŸ‹แžšแž™แŸˆแž–แŸแž›แž‡แžถแž™แžผแžšแž˜แž€แž แžพแž™ libpcap แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž–แžทแžŸแŸแžŸแžŽแžถแž˜แžฝแž™ (แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž›แžธแž“แžปแž…, แžœแžถแž‚แžบแž‡แžถแž€แžถแžšแž”แŸ‰แžปแž“แŸ’แžแŸ‚แž–แžฝแž€แž‚แŸแž˜แžทแž“แž”แžถแž“แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžšแžผแž”แž—แžถแž–แžŸแž€แž›แž‘แŸ)แŸ” แžŸแž‰แŸ’แž‰แžถแž’แŸ’แž„แž“แŸ‹แž’แŸ’แž„แžšแžŠแŸ†แž”แžผแž„แžŠแŸ‚แž› BPF แž“แžนแž„แžœแžทแžœแžŒแŸ’แžแž€แžพแžแžกแžพแž„แž“แŸ…แž†แŸ’แž“แžถแŸ† 2011 แž“แŸ…แž–แŸแž›แžŠแŸ‚แž› Eric Dumazet แž”แžถแž“แžŸแŸ’แž“แžพแžกแžพแž„แŸ” แž”แŸ†แžŽแŸ‡แžŠแŸ‚แž›แž”แž“แŸ’แžแŸ‚แž˜ Just In Time Compiler แž‘แŸ…แžแžบแžŽแŸ‚แž› - แžขแŸ’แž“แž€แž”แž€แž”แŸ’แžšแŸ‚แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ†แž”แŸ’แž›แŸ‚แž„ BPF bytecode แž‘แŸ…แžŠแžพแž˜ 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))

แž€แžถแžšแžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹แž‡แžถแž€แžผแžŠแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แžทแž“แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž–แŸแž›แžแŸ’แž›แŸ‡แžœแžถแž…แžถแŸ†แž”แžถแž…แŸ‹ (แžงแž‘แžถแž แžšแžŽแŸ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž€แŸ‚แž€แŸ†แž แžปแžŸ แž€แžถแžšแž”แž„แŸ’แž€แžพแžแž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแžฏแž€แžแžถ แž€แžถแžšแžŸแžšแžŸแŸแžšแžขแžแŸ’แžแž”แž‘แž“แŸ…แž›แžพHabre แŸ”แž›แŸ”)แŸ” แžŠแžพแž˜แŸ’แž”แžธแž—แžถแž–แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš <linux/filter.h> แž˜แŸ‰แžถแž€แŸ’แžšแžผแž‡แŸ†แž“แžฝแž™แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹ - แžงแž‘แžถแž แžšแžŽแŸแžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„แžแžถแž„แž›แžพแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแžšแžŸแŸแžšแžกแžพแž„แžœแžทแž‰แž‡แžถ

struct sock_filter code[] = {
        BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
        BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
        BPF_STMT(BPF_RET|BPF_K, 0x00040000),
        BPF_STMT(BPF_RET|BPF_K, 0),
}

แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™แž‡แž˜แŸ’แžšแžพแžŸแž“แŸแŸ‡แž˜แžทแž“แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž‘แŸแŸ” แž“แŸแŸ‡แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžแžบแžŽแŸ‚แž›แž›แžธแž“แžปแž…แž”แžถแž“แžœแŸ‚แž€แž‰แŸ‚แž€ แž แŸแžแžปแžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™แž“แŸ…แž€แŸ’แž“แžปแž„แžแž tools/bpf แžแžบแžŽแŸ‚แž› แžขแŸ’แž“แž€แžขแžถแž…แžŸแŸ’แžœแŸ‚แž„แžšแž€แžงแž”แž€แžšแžŽแŸแžŠแŸ†แžกแžพแž„ แž“แžทแž„แž”แŸ†แž”แžถแžแŸ‹แž€แŸ†แž แžปแžŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™ BPF แž”แžปแžšแžถแžŽแŸ”

แž—แžถแžŸแžถแžŠแŸ†แžกแžพแž„แž‚แžบแžŸแŸ’แžšแžŠแŸ€แž„แž‘แŸ…แž“แžนแž„แž›แž‘แŸ’แž’แž•แž›แž”แŸ†แž”แžถแžแŸ‹แž€แŸ†แž แžปแžŸ tcpdumpแž”แŸ‰แžปแž“แŸ’แžแŸ‚แž›แžพแžŸแž–แžธแž“แŸแŸ‡แž‘แŸ€แž แž™แžพแž„แžขแžถแž…แž”แž‰แŸ’แž‡แžถแž€แŸ‹แžŸแŸ’แž›แžถแž€แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแŸ” แžงแž‘แžถแž แžšแžŽแŸ แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŠแŸ‚แž›แž‘แž˜แŸ’แž›แžถแž€แŸ‹แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž‘แžถแŸ†แž„แžขแžŸแŸ‹ แž›แžพแž€แž›แŸ‚แž„แžแŸ‚ TCP/IPv4แŸ–

$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0

แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ แžขแŸ’แž“แž€แžŠแŸ†แžกแžพแž„แž”แž„แŸ’แž€แžพแžแž€แžผแžŠแž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹ <ะบะพะปะธั‡ะตัั‚ะฒะพ ะธะฝัั‚ั€ัƒะบั†ะธะน>,<code1> <jt1> <jf1> <k1>,...แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžงแž‘แžถแž แžšแžŽแŸแžšแž”แžŸแŸ‹แž™แžพแž„แž‡แžถแž˜แžฝแž™ TCP แžœแžถแž“แžนแž„แž€แŸ’แž›แžถแž™แž‡แžถ

$ tools/bpf/bpf_asm /tmp/tcp-over-ipv4.bpf
6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 6,6 0 0 4294967295,6 0 0 0,

แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž—แžถแž–แž„แžถแž™แžŸแŸ’แžšแžฝแž›แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ C แž‘แž˜แŸ’แžšแž„แŸ‹แž›แž‘แŸ’แž’แž•แž›แž•แŸ’แžŸแŸแž„แž‚แŸ’แž“แžถแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแŸ–

$ tools/bpf/bpf_asm -c /tmp/tcp-over-ipv4.bpf
{ 0x28,  0,  0, 0x0000000c },
{ 0x15,  0,  3, 0x00000800 },
{ 0x30,  0,  0, 0x00000017 },
{ 0x15,  0,  1, 0x00000006 },
{ 0x06,  0,  0, 0xffffffff },
{ 0x06,  0,  0, 0000000000 },

แžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž…แž˜แŸ’แž›แž„แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแž—แŸแž‘ struct sock_filterแžŠแžผแž…แžŠแŸ‚แž›แž™แžพแž„แž”แžถแž“แž’แŸ’แžœแžพแž“แŸ…แžŠแžพแž˜แž•แŸ’แž“แŸ‚แž€แž“แŸแŸ‡แŸ”

แž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แžแŸ‚แž˜แž›แžธแž“แžปแž… แž“แžทแž„ netsniff-ng

แž”แž“แŸ’แžแŸ‚แž˜แž–แžธแž›แžพแžŸแŸ’แžแž„แŸ‹แžŠแžถแžš BPF, Linux แž“แžทแž„ tools/bpf/bpf_asm แž‚แžถแŸ†แž‘แŸ’แžš แž“แžทแž„ แžŸแŸ†แžŽแžปแŸ†แž˜แžทแž“แžŸแŸ’แžแž„แŸ‹แžŠแžถแžš. แž‡แžถแž‘แžผแž‘แŸ… แž€แžถแžšแžŽแŸ‚แž“แžถแŸ†แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแžŠแžพแž˜แŸ’แž”แžธแž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹แžœแžถแž›แž“แŸƒแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž˜แžฝแž™แŸ” struct sk_buffแžŠแŸ‚แž›แž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž”แžŽแŸ’แžแžถแž‰แž“แŸ…แž€แŸ’แž“แžปแž„แžแžบแžŽแŸ‚แž›แŸ” แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แž€แŸแž˜แžถแž“แž”แŸ’แžšแž—แŸแž‘แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž“แŸƒแž€แžถแžšแžŽแŸ‚แž“แžถแŸ†แž‡แŸ†แž“แžฝแž™แž•แž„แžŠแŸ‚แžš แžงแž‘แžถแž แžšแžŽแŸ ldw cpu แž“แžนแž„แž•แŸ’แž‘แžปแž€แž‘แŸ…แž€แŸ’แž“แžปแž„แž”แž‰แŸ’แž‡แžธ A แž›แž‘แŸ’แž’แž•แž›แž“แŸƒแž€แžถแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž˜แžปแžแž„แžถแžšแžแžบแžŽแŸ‚แž› raw_smp_processor_id(). (แž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแž“แŸƒ BPF แž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แžแŸ‚แž˜แžŠแŸ‚แž›แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแžŸแŸ’แžแž„แŸ‹แžŠแžถแžšแž‘แžถแŸ†แž„แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž–แž„แŸ’แžšแžธแž€แžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แžแž›แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แžถแž˜แžฝแž™แž“แžนแž„แžŸแŸ†แžŽแžปแŸ†แž“แŸƒแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‡แŸ†แž“แžฝแž™แžแžบแžŽแŸ‚แž›แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ† แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ แž“แžทแž„แž€แžถแžšแž”แž„แŸ’แž€แžพแžแž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแŸ”) แž“แŸแŸ‡แž‚แžบแž‡แžถแžงแž‘แžถแž แžšแžŽแŸแž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž“แŸƒแžแž˜แŸ’แžšแž„แžŠแŸ‚แž›แž™แžพแž„แž…แž˜แŸ’แž›แž„แžแŸ‚แž•แŸ’แž“แŸ‚แž€ แž”แž‹แž˜แž€แžแžถ packet แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„แž‘แŸ†แž แŸ†แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แžŠแŸ„แž™แž”แŸ’แžšแžพแž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แžแŸ‚แž˜ poff, payload offset:

ld poff
ret a

แž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แžแŸ‚แž˜ BPF แž˜แžทแž“แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แž‘แŸแŸ” tcpdumpแž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸแŸ‡แž‚แžบแž‡แžถแž แŸแžแžปแž•แž›แžŠแŸแž›แŸ’แžขแžŠแžพแž˜แŸ’แž”แžธแžŸแŸ’แž‚แžถแž›แŸ‹แž€แž‰แŸ’แž…แž”แŸ‹แžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ netsniff-ngแžŠแŸ‚แž›แž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แžšแž”แžŸแŸ‹แž•แŸ’แžŸแŸแž„แž‘แŸ€แž แž˜แžถแž“แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แž˜แŸ’แžšแžทแžแžแŸ’แž–แžŸแŸ‹ netsniff-ngแžŠแŸ‚แž›แž”แž“แŸ’แžแŸ‚แž˜แž–แžธแž›แžพแž€แžถแžšแžแŸ’แžšแž„แžŠแŸ„แž™แž”แŸ’แžšแžพ BPF แž€แŸแž˜แžถแž“แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž—แŸ’แž›แžพแž„แž…แžšแžถแž…แžšแžŠแŸแž˜แžถแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž– แž“แžทแž„แž€แž˜แŸ’แžšแžทแžแžแŸ’แž–แžŸแŸ‹แž‡แžถแž„ tools/bpf/bpf_asmแžขแŸ’แž“แž€แžŠแŸ†แžกแžพแž„ BPF แž”แžถแž“แž แŸ… bpfc. แž€แž‰แŸ’แž…แž”แŸ‹แž˜แžถแž“แžฏแž€แžŸแžถแžšแž›แž˜แŸ’แžขแžทแž แžŸแžผแž˜แž˜แžพแž›แž•แž„แžŠแŸ‚แžšแž“แžผแžœแžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž“แŸ…แž…แžปแž„แž”แž‰แŸ’แž…แž”แŸ‹แž“แŸƒแžขแžแŸ’แžแž”แž‘แŸ”

แžŸแŸŠแžธแž˜แžแž˜

แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž™แžพแž„แžŠแžนแž„แž–แžธแžšแž”แŸ€แž”แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แž“แŸƒแž—แžถแž–แžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰แžแžถแž˜แžขแŸ†แž–แžพแž…แžทแžแŸ’แž แž แžพแž™แžแŸ’แžšแŸ€แž˜แžแŸ’แž›แžฝแž“แžšแžฝแž…แž‡แžถแžŸแŸ’แžšแŸแž…แžŠแžพแž˜แŸ’แž”แžธแž˜แžพแž›แžงแž‘แžถแž แžšแžŽแŸแžแŸ’แž˜แžธ แžŠแŸ‚แž›แž‘แžธแž˜แžฝแž™แž‚แžบแž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถ seccomp แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ BPF filters แžŠแžพแž˜แŸ’แž”แžธแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŸแŸ†แžŽแžปแŸ† แž“แžทแž„แžŸแŸ†แžŽแžปแŸ†แž“แŸƒแžขแžถแž‚แžปแž™แž˜แŸ‰แž„แŸ‹แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž˜แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹ แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™ แž“แžทแž„แž€แžผแž“แž…แŸ…แžšแž”แžŸแŸ‹แžœแžถแŸ”

แž€แŸ†แžŽแŸ‚แžŠแŸ†แž”แžผแž„แž“แŸƒ seccomp แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ…แžแžบแžŽแŸ‚แž›แž€แŸ’แž“แžปแž„แž†แŸ’แž“แžถแŸ† 2005 แž แžพแž™แž˜แžทแž“แž˜แžถแž“แž”แŸ’แžšแž‡แžถแž”แŸ’แžšแžทแž™แž—แžถแž–แžแŸ’แž›แžถแŸ†แž„แž‘แŸแž–แŸ’แžšแŸ„แŸ‡แžœแžถแž•แŸ’แžแž›แŸ‹แž‡แž˜แŸ’แžšแžพแžŸแžแŸ‚แž˜แžฝแž™ - แžŠแžพแž˜แŸ’แž”แžธแž€แŸ†แžŽแžแŸ‹แžŸแŸ†แžŽแžปแŸ†แž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž˜แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜: read, write, exit ะธ sigreturnแž แžพแž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž”แŸ†แž–แžถแž“แž…แŸ’แž”แžถแž”แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแž˜แŸ’แž›แžถแž”แŸ‹แžŠแŸ„แž™แž”แŸ’แžšแžพ SIGKILL. แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™แž€แŸ’แž“แžปแž„แž†แŸ’แž“แžถแŸ† 2012 seccomp แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แžŸแž˜แžแŸ’แžแž—แžถแž–แž€แŸ’แž“แžปแž„แž€แžถแžšแž”แŸ’แžšแžพแžแž˜แŸ’แžšแž„ BPF แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž€แŸ†แžŽแžแŸ‹แžŸแŸ†แžŽแžปแŸ†แž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž”แžถแž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแž แžพแž™แžแŸ‚แž˜แž‘แžถแŸ†แž„แž’แŸ’แžœแžพแž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แž›แžพแžขแžถแž‚แžปแž™แž˜แŸ‰แž„แŸ‹แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแŸ” (แž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸ Chrome แž‚แžบแž‡แžถแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŠแŸ†แž”แžผแž„แž‚แŸแž“แŸƒแž˜แžปแžแž„แžถแžšแž“แŸแŸ‡ แž แžพแž™แž˜แž“แžปแžŸแŸ’แžŸ Chrome แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž€แŸ†แž–แžปแž„แž”แž„แŸ’แž€แžพแžแž™แž“แŸ’แžแž€แžถแžš KRSI แžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแž“แŸƒ BPF แž“แžทแž„แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž”แŸ’แžŠแžผแžšแžแžถแž˜แž”แŸ†แžŽแž„แž“แŸƒแž˜แŸ‰แžผแžŒแžปแž›แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž–แž›แžธแž“แžปแž…แŸ”) แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แžฏแž€แžŸแžถแžšแž”แž“แŸ’แžแŸ‚แž˜แžขแžถแž…แžšแž€แž”แžถแž“แž“แŸ…แž…แžปแž„แž”แž‰แŸ’แž…แž”แŸ‹แŸ” แž“แŸƒแžขแžแŸ’แžแž”แž‘แŸ”

แž…แŸ†แžŽแžถแŸ†แžแžถแž˜แžถแž“แžขแžแŸ’แžแž”แž‘แžšแžฝแž…แž แžพแž™แž“แŸ…แž›แžพแž˜แž‡แŸ’แžˆแž˜แžŽแŸ’แžŒแž›แžขแŸ†แž–แžธแž€แžถแžšแž”แŸ’แžšแžพ seccomp แž”แŸ’แžšแž แŸ‚แž›แž‡แžถแž˜แžถแž“แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž…แž„แŸ‹แžขแžถแž“แžœแžถแž˜แžปแž“ (แžฌแž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™) แžขแžถแž“แž•แŸ’แž“แŸ‚แž€แžšแž„แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘ แž€แžปแž„แžแžบแž“แŸแžš แž“แžทแž„แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž–แŸ– seccomp แž•แŸ’แžแž›แŸ‹แž“แžผแžœแžงแž‘แžถแž แžšแžŽแŸแž“แŸƒแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ seccomp แž‘แžถแŸ†แž„แž€แŸ†แžŽแŸ‚ 2007 แž“แžทแž„แž€แŸ†แžŽแŸ‚แžŠแŸ‚แž›แž”แŸ’แžšแžพ BPF (แžแž˜แŸ’แžšแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžŠแŸ„แž™แž”แŸ’แžšแžพ libseccomp) แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž€แžถแžšแž—แŸ’แž‡แžถแž”แŸ‹ seccomp แž‡แžถแž˜แžฝแž™ Docker แž แžพแž™แž€แŸแž•แŸ’แžแž›แŸ‹แž“แžผแžœแžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž‡แžถแž…แŸ’แžšแžพแž“แž•แž„แžŠแŸ‚แžšแŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘ แž€แžถแžšแž‰แŸ‚แž€แžŠแŸแž˜แžทแž“แžŠแŸ„แž™แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แžฌ "แžขแŸ’แž“แž€แž˜แžทแž“แžแŸ’แžšแžผแžœแž€แžถแžš Docker แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแžฟแž„แž“แŸแŸ‡แž‘แŸ!" แžœแžถแž‚แŸ’แžšแž”แžŠแžŽแŸ’แžแž”แŸ‹แž‡แžถแž–แžทแžŸแŸแžŸ แžšแž”แŸ€แž”แž”แž“แŸ’แžแŸ‚แž˜แž”แž‰แŸ’แž‡แžธแžแŸ’แž˜แŸ… แžฌแž”แž‰แŸ’แž‡แžธแžŸแž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸแž˜แžทแž“แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš systemd แŸ”

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž™แžพแž„แž“แžนแž„แžƒแžพแž‰แž–แžธแžšแž”แŸ€แž”แžŸแžšแžŸแŸแžš แž“แžทแž„แž•แŸ’แž‘แžปแž€แžแž˜แŸ’แžšแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ seccomp แž“แŸ…แž‘แž‘แŸ C แž“แžทแž„แž”แŸ’แžšแžพแž”แžŽแŸ’แžŽแžถแž›แŸแž™ libseccomp แž แžพแž™แžแžพแžขแŸ’แžœแžธแž‡แžถแž‚แžปแžŽแžŸแž˜แŸ’แž”แžแŸ’แžแžท แž“แžทแž„แž‚แžปแžŽแžœแžทแž”แžแŸ’แžแžทแž“แŸƒแž‡แž˜แŸ’แžšแžพแžŸแž“แžธแž˜แžฝแž™แŸ— แž แžพแž™แž…แžปแž„แž€แŸ’แžšแŸ„แž™ แžŸแžผแž˜แž˜แžพแž›แž–แžธแžšแž”แŸ€แž”แžŠแŸ‚แž›แž€แž˜แŸ’แž˜แžœแžทแž’แžธ seccomp แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŠแŸ„แž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธ strace.

แž€แžถแžšแžŸแžšแžŸแŸแžš แž“แžทแž„แž•แŸ’แž‘แžปแž€แžแž˜แŸ’แžšแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹ seccomp

แž™แžพแž„แžŠแžนแž„แž–แžธแžšแž”แŸ€แž”แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แžšแžฝแž…แž แžพแž™ แžŠแžผแž…แŸ’แž“แŸแŸ‡แžŸแžผแž˜แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แžŸแžšแžŸแŸแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธ seccomp แž‡แžถแž˜แžปแž“แžŸแžทแž“แŸ” แžขแŸ’แž“แž€แžขแžถแž…แž€แŸ†แžŽแžแŸ‹แžแž˜แŸ’แžšแž„แž“แŸ…แž€แž˜แŸ’แžšแžทแžแžŠแŸ†แžŽแžพแžšแž€แžถแžš แž แžพแž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แžปแž˜แžถแžšแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แžนแž„แž‘แž‘แžฝแž›แž€แžถแžšแžšแžนแžแž”แž“แŸ’แžแžนแž„แŸ” แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžŠแŸ„แž™แž”แŸ’แžšแžพแž€แžถแžšแž แŸ…แžแžถแž˜แž”แŸ’แžšแž–แŸแž“แŸ’แž’ seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

แžŠแŸ‚แž›แž‡แžถแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž› &filter - แž“แŸแŸ‡แž‚แžบแž‡แžถแž…แž„แŸ’แžขแžปแž›แž‘แŸ…แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž’แŸ’แž›แžถแž”แŸ‹แžŸแŸ’แž‚แžถแž›แŸ‹แž™แžพแž„แžšแžฝแž…แž แžพแž™ struct sock_fprog, i.e. แž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แŸ”

แžแžพแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŸแž˜แŸ’แžšแžถแž”แŸ‹ seccomp แžแžปแžŸแž–แžธแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŸแž˜แŸ’แžšแžถแž”แŸ‹ socket แž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž”แžšแžทแž”แž‘แž†แŸ’แž›แž„แŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž“แŸƒแžšแž“แŸ’แž’ แž™แžพแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸแž•แŸ’แžแž›แŸ‹แž€แž“แŸ’แž›แŸ‚แž„แž…แž„แž…แžถแŸ†แžŠแŸ‚แž›แž˜แžถแž“แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“ แž แžพแž™แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธ seccomp แž™แžพแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸแž•แŸ’แžแž›แŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแžผแž…แž‡แžถ

struct seccomp_data {
    int   nr;
    __u32 arch;
    __u64 instruction_pointer;
    __u64 args[6];
};

แžœแžถแž‚แžบแž‡แžถแž€แžถแžš nr แž‚แžบแž‡แžถแž›แŸแžแž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ arch - แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“ (แž”แž“แŸ’แžแŸ‚แž˜แž›แžพแž“แŸแŸ‡แžแžถแž„แž€แŸ’แžšแŸ„แž˜), args - แžขแžถแž‚แžปแž™แž˜แŸ‰แž„แŸ‹แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžšแž แžผแžแžŠแž›แŸ‹แž”แŸ’แžšแžถแŸ†แž˜แžฝแž™, แž“แžทแž„ instruction_pointer แž‚แžบโ€‹แž‡แžถโ€‹แž€แžถแžšโ€‹แž…แž„แŸ’แžขแžปแž›โ€‹แž‘แŸ…โ€‹แž€แžถแžšโ€‹แžŽแŸ‚แž“แžถแŸ†โ€‹แž…แž“แŸ’แž›แŸ„แŸ‡โ€‹แžขแŸ’แž“แž€โ€‹แž”แŸ’แžšแžพโ€‹แžŠแŸ‚แž›โ€‹แž”แžถแž“โ€‹แž’แŸ’แžœแžพโ€‹แž€แžถแžšโ€‹แž แŸ…โ€‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž‡แžถแžงแž‘แžถแž แžšแžŽแŸ แžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แž‘แžปแž€แž›แŸแžแž€แžถแžšแž แŸ…แžšแž”แžŸแŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‘แŸ…แž€แŸ’แž“แžปแž„แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡ A แž™แžพแž„แžแŸ’แžšแžผแžœแžแŸ‚แž“แžทแž™แžถแž™

ldw [0]

แž˜แžถแž“แž›แž€แŸ’แžแžŽแŸˆแž–แžทแžŸแŸแžŸแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธ seccomp แžงแž‘แžถแž แžšแžŽแŸ แž”แžšแžทแž”แž‘แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž”แžถแž“แžแŸ‚แžŠแŸ„แž™แž€แžถแžšแžแž˜แŸ’แžšแžนแž˜ 32 แž”แŸŠแžธแžแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แž แžพแž™แžขแŸ’แž“แž€แž˜แžทแž“แžขแžถแž…แž•แŸ’แž‘แžปแž€แž–แžถแž€แŸ’แž™แž–แžถแž€แŸ‹แž€แžŽแŸ’แžแžถแž› แžฌแž˜แžฝแž™แž”แŸƒแž”แžถแž“แž‘แŸ - แž“แŸ…แž–แŸแž›แž–แŸ’แž™แžถแž™แžถแž˜แž•แŸ’แž‘แžปแž€แžแž˜แŸ’แžšแž„ ldh [0] แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’ seccomp แž“แžทโ€‹แžนโ€‹แž„โ€‹แžแŸ’แžšแžกแž”แŸ‹แž˜แž€แžœแžทแž‰ EINVAL. แž˜แžปแžแž„แžถแžšแž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžแž˜แŸ’แžšแž„แžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แž‘แžปแž€ seccomp_check_filter() แžแžบแžŽแŸ‚แž› (แžขแŸ’แžœแžธแžŠแŸ‚แž›แž‚แžฝแžšแžฑแŸ’แž™แžขแžŸแŸ‹แžŸแŸ†แžŽแžพแž…แž‚แžบแž“แŸ…แž€แŸ’แž“แžปแž„ 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 แŸ” แžแžพแž€แžถแžšแž แŸ…แžแžถแž˜แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‘แžถแŸ†แž„แž“แŸแŸ‡แž‡แžถแžขแŸ’แžœแžธ? แž™แžพแž„โ€‹แž˜แžทแž“โ€‹แžขแžถแž…โ€‹แž“แžทแž™แžถแž™โ€‹แžฒแŸ’แž™โ€‹แž”แŸ’แžšแžถแž€แžŠโ€‹แž”แžถแž“โ€‹แž‘แŸ แž–แŸ’แžšแŸ„แŸ‡โ€‹แž™แžพแž„โ€‹แž˜แžทแž“โ€‹แžŠแžนแž„โ€‹แžแžถโ€‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธโ€‹แž˜แžฝแž™โ€‹แžŽแžถโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แžŸแžšแžŸแŸแžšแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แžขแŸ’แž“แž€แž“แžทแž–แž“แŸ’แž’แž“แŸƒ seccomp แž•แŸ’แžแž›แŸ‹แž‡แžผแž“ แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹แžŠแŸ„แž™แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ (แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แžแŸ’แžšแžผแžœแž”แžถแž“แž…แž„แŸ’แžขแžปแž›แž”แž„แŸ’แž แžถแž‰แž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแž”แž‘แž‡แžถแžœแžถแž›แž˜แžฝแž™แŸ” 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 assembler แžŠแŸ„แž™แž…แžปแž…แž›แŸแžแž€แžถแžšแž แŸ…แžแžถแž˜แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แžงแž‘แžถแž แžšแžŽแŸแŸ–

$ echo 1 3 6 8 13 | ./generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0

แžœแžถแž˜แžทแž“แžขแžถแž…แž‘แŸ…แžšแžฝแž…แž‘แŸแž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžšแžŸแŸแžšแžขแŸ’แžœแžธแžŠแŸ‚แž›แž›แžฟแž“แž‡แžถแž„แž“แŸแŸ‡ แž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แž˜แžทแž“แžขแžถแž…แžขแž“แžปแžœแžแŸ’แžแž€แžถแžšแž›แŸ„แžแž…แžผแž›แž”แž“แŸ’แž‘แžถแžแŸ‹ (แžงแž‘แžถแž แžšแžŽแŸ แž™แžพแž„แž˜แžทแž“แžขแžถแž…แž’แŸ’แžœแžพแž”แžถแž“แž‘แŸ) jmp A แžฌ jmp [label+X]) แž แžพแž™แžŠแžผแž…แŸ’แž“แŸแŸ‡แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž‚แžบแž‹แžทแžแžทแžœแž“แŸ’แžแŸ”

seccomp แž“แžทแž„ strace

แž˜แž“แžปแžŸแŸ’แžŸแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แž“แžถแžŠแžนแž„แž–แžธแžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ strace แž‚แžบแž‡แžถแžงแž”แž€แžšแžŽแŸแžŠแŸ‚แž›แž˜แžทแž“แžขแžถแž…แžแŸ’แžœแŸ‡แž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแžทแž€แŸ’แžŸแžถแž–แžธแžฅแžšแžทแž™แžถแž”แžแž“แŸƒแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸ…แž›แžพแž›แžธแž“แžปแž…แŸ” แž‘แŸ„แŸ‡โ€‹แž‡แžถโ€‹แž™แŸ‰แžถแž„โ€‹แžŽแžถโ€‹แž€แŸโ€‹แž˜แžถแž“โ€‹แž˜แž“แžปแžŸแŸ’แžŸโ€‹แž‡แžถโ€‹แž…แŸ’แžšแžพแž“โ€‹แž”แžถแž“โ€‹แžฎโ€‹แžขแŸ†แž–แžธ แž”แž‰แŸ’แž แžถแž€แžถแžšแžขแž“แžปแžœแžแŸ’แž แž“แŸ…แž–แŸแž›แž”แŸ’แžšแžพแžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž“แŸแŸ‡แŸ” แž€แžถแžšแž–แžทแžแž‚แžบแžแžถ strace แž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแžŠแŸ„แž™แž”แŸ’แžšแžพ ptrace(2)แž แžพแž™แž“แŸ…แž€แŸ’แž“แžปแž„แž™แž“แŸ’แžแž€แžถแžšแž“แŸแŸ‡ แž™แžพแž„แž˜แžทแž“แžขแžถแž…แž”แž‰แŸ’แž‡แžถแž€แŸ‹แžขแŸ†แž–แžธแžŸแŸ†แžŽแžปแŸ†แž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž™แžพแž„แžแŸ’แžšแžผแžœแž”แž‰แŸ’แžˆแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸ„แŸ‡แž‘แŸ แžง. แžงแž‘แžถแž แžšแžŽแŸ แž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถ

$ time strace du /usr/share/ >/dev/null 2>&1

real    0m3.081s
user    0m0.531s
sys     0m2.073s

ะธ

$ time strace -e open du /usr/share/ >/dev/null 2>&1

real    0m2.404s
user    0m0.193s
sys     0m1.800s

แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แž”แŸ’แžšแž แŸ‚แž›แžŠแžผแž…แž‚แŸ’แž“แžถ แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž“แŸ…แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž‘แžธแž–แžธแžš แž™แžพแž„แž…แž„แŸ‹แžแžถแž˜แžŠแžถแž“แž€แžถแžšแž แŸ…แžแžถแž˜แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžแŸ‚แž˜แžฝแž™แž€แŸแžŠแŸ„แž™แŸ”

แž‡แž˜แŸ’แžšแžพแžŸแžแŸ’แž˜แžธแŸ” --seccomp-bpf, แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ… strace แž€แŸ†แžŽแŸ‚ 5.3 แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž”แž„แŸ’แž€แžพแž“แž›แŸ’แž”แžฟแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž…แŸ’แžšแžพแž“แžŠแž„ แž แžพแž™แž–แŸแž›แžœแŸแž›แžถแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž“แŸ…แž€แŸ’แžšแŸ„แž˜แžŠแžถแž“แž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž˜แžฝแž™แž‚แžบแžขแžถแž…แž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž‘แŸ…แž“แžนแž„แž–แŸแž›แžœแŸแž›แžถแž“แŸƒแž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž’แž˜แŸ’แž˜แžแžถแžšแžฝแž…แž‘แŸ…แž แžพแž™แŸ–

$ time strace --seccomp-bpf -e open du /usr/share/ >/dev/null 2>&1

real    0m0.148s
user    0m0.017s
sys     0m0.131s

$ time du /usr/share/ >/dev/null 2>&1

real    0m0.140s
user    0m0.024s
sys     0m0.116s

(แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹ แž“แŸ…แž‘แžธแž“แŸแŸ‡แž˜แžถแž“แž€แžถแžšแž”แŸ„แž€แž”แž‰แŸ’แž†แŸ„แžแž”แž“แŸ’แžแžทแž…แž”แž“แŸ’แžแžฝแž…แžŠแŸ‚แž›แžแžถแž™แžพแž„แž˜แžทแž“แž”แžถแž“แžแžถแž˜แžŠแžถแž“แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŸแŸ†แžแžถแž“แŸ‹แž“แŸƒแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแž“แŸแŸ‡แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแž™แžพแž„แž€แŸ†แž–แžปแž„แžแžถแž˜แžŠแžถแž“ แžงแž‘แžถแž แžšแžŽแŸแŸ” newfsstatแž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ strace แž“แžนแž„แž แŸ’แžœแŸ’แžšแžถแŸ†แž„แžแŸ’แž›แžถแŸ†แž„แžŠแžผแž…แž‡แžถแž‚แŸ’แž˜แžถแž“ --seccomp-bpf.)

แžแžพแž‡แž˜แŸ’แžšแžพแžŸแž“แŸแŸ‡แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž“แžถแž„ strace แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แžŠแŸ†แžŽแžพแžšแž€แžถแžš แž แžพแž™แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžœแžถแžŠแŸ„แž™แž”แŸ’แžšแžพ PTRACE_SYSCALL. แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž˜แžถแž“แž”แž‰แŸ’แž แžถ (แžŽแžถแž˜แžฝแž™) แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‘แŸแžšแž‘แŸ… straceแžŠแŸ‚แž›แž˜แžพแž›แžขแžถแž‚แžปแž™แž˜แŸ‰แž„แŸ‹แž“แŸƒแž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž“แžทแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžœแžถแž‡แžถแž˜แžฝแž™ PTRACE_SYSCALL. แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž–แŸแž›แžแŸ’แž›แŸ‡ แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แž‰แŸ’แž…แž”แŸ‹แž€แžถแžšแž แŸ…แž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž แžพแž™แž“แŸ…แž–แŸแž›แž…แŸแž‰แž–แžธแžœแžถ แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‘แŸแžšแž˜แŸ’แžแž„แž‘แŸ€แž straceแžŠแŸ‚แž›แž˜แžพแž›แžแž˜แŸ’แž›แŸƒแžแŸ’แžšแžกแž”แŸ‹ แž“แžทแž„แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ„แž™แž”แŸ’แžšแžพ PTRACE_SYSCALL, แž›โ€‹แž›แŸ”

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

แžฅแžกแžผแžœแž“แŸแŸ‡ แž…แžผแžšแž™แžพแž„แžแŸ’แžšแž›แž”แŸ‹แž‘แŸ…แž–แžทแž—แž–แž“แŸƒแž”แžŽแŸ’แžแžถแž‰แžœแžทแž‰แŸ”

แž”แŸ’แžšแžœแžแŸ’แžแžทแŸ– แž€แžถแž›แž–แžธแž™แžผแžšแž™แžถแžšแžŽแžถแžŸแŸ‹แž˜แž€แž แžพแž™ แž€แŸ’แž“แžปแž„แž†แŸ’แž“แžถแŸ† แŸขแŸ แŸ แŸง แžŸแŸ’แž“แžผแž›แž‚แžบ แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜ แž˜แŸ‰แžผแžŒแžปแž› xt_u32 แžŸแž˜แŸ’แžšแžถแž”แŸ‹ netfilter แŸ” แžœแžถโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แžŸแžšแžŸแŸแžšโ€‹แžŠแŸ„แž™โ€‹แž€แžถแžšโ€‹แž”แŸ’แŸ€แž”แž”แŸ’แžŠแžผแž…โ€‹แž‡แžถโ€‹แž˜แžฝแž™โ€‹แž“แžนแž„โ€‹แž€แžถแžšโ€‹แž…แžถแžแŸ‹โ€‹แžแŸ’แž“แžถแž€แŸ‹โ€‹แž…แžšแžถแž…แžšแžŽแŸโ€‹แž”แžปแžšแžถแžŽโ€‹แž€แžถแž“แŸ‹โ€‹แžแŸ‚โ€‹แž…แŸ’แžšแžพแž“โ€‹ cls_u32 แž“แžทแž„แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž€แŸ’แž”แžฝแž“แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‚แŸ„แž›แž–แžธแžšแžแžถแž˜แžขแŸ†แž–แžพแž…แžทแžแŸ’แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹ iptables แžŠแŸ„แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžŸแžถแž˜แž‰แŸ’แž‰แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ– แž•แŸ’แž‘แžปแž€ 32 แž”แŸŠแžธแžแž–แžธแž€แž‰แŸ’แž…แž”แŸ‹แž˜แžฝแž™ แž แžพแž™แžขแž“แžปแžœแžแŸ’แžแžŸแŸ†แžŽแžปแŸ†แž“แŸƒแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแž“แž–แŸ’แžœแž“แŸ’แž’แž›แžพแž–แžฝแž€แžœแžถแŸ” แžงแž‘แžถแž แžšแžŽแŸ,

sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"

แž•แŸ’แž‘แžปแž€ 32 แž”แŸŠแžธแžแž“แŸƒแž”แž‹แž˜แž€แžแžถ IP แžŠแŸ„แž™แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž–แžธ padding 6 แž แžพแž™แžขแž“แžปแžœแžแŸ’แžแžšแž”แžถแŸ†แž„แž˜แžฝแž™แž‘แŸ…แž–แžฝแž€แžœแžถ 0xFF (แž™แž€แž”แŸƒแž‘แžถแž”) แŸ” แžœแžถแž›แž“แŸแŸ‡แŸ” protocol แž”แž‹แž˜แž€แžแžถ IP แž แžพแž™แž™แžพแž„แž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แžœแžถแž‡แžถแž˜แžฝแž™ 1 (ICMP) แŸ” แžขแŸ’แž“แž€แžขแžถแž…แž”แž‰แŸ’แž…แžผแž›แž‚แŸ’แž“แžถแž“แžผแžœแž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž€แŸ’แž“แžปแž„แž…แŸ’แž”แžถแž”แŸ‹แž˜แžฝแž™ แž แžพแž™แžขแŸ’แž“แž€แž€แŸแžขแžถแž…แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžšแž•แž„แžŠแŸ‚แžšแŸ” @ - แž•แŸ’แž›แžถแžŸแŸ‹แž‘แžธ X bytes แž‘แŸ…แžแžถแž„แžŸแŸ’แžแžถแŸ†แŸ” แžงแž‘แžถแž แžšแžŽแŸแž…แŸ’แž”แžถแž”แŸ‹

iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"

แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžแžถแžแžพแž›แŸแžแž›แŸ†แžŠแžถแž”แŸ‹ TCP แž˜แžทแž“แžŸแŸ’แž˜แžพแž‚แŸ’แž“แžถ 0x29. แžแŸ’แž‰แžปแŸ†โ€‹แž“แžนแž„โ€‹แž˜แžทแž“โ€‹แž“แžทแž™แžถแž™โ€‹แž›แž˜แŸ’แžขแžทแžโ€‹แž”แž“แŸ’แžแŸ‚แž˜โ€‹แž‘แŸ€แžโ€‹แž‘แŸ แž–แŸ’แžšแŸ„แŸ‡โ€‹แžœแžถโ€‹แž…แŸ’แž”แžถแžŸแŸ‹โ€‹แž แžพแž™โ€‹แžแžถโ€‹แž€แžถแžšโ€‹แžŸแžšแžŸแŸแžšโ€‹แž…แŸ’แž”แžถแž”แŸ‹โ€‹แž”แŸ‚แž”โ€‹แž“แŸแŸ‡โ€‹แžŠแŸ„แž™โ€‹แžŠแŸƒโ€‹แž˜แžทแž“โ€‹แžŸแžผแžœโ€‹แžŸแŸ’แžšแžฝแž›โ€‹แž‘แŸแŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘ BPF - แž›แŸแžแž€แžผแžŠแž”แŸƒแžŠแŸ‚แž›แž—แŸ’แž›แŸแž…แž˜แžถแž“แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž‡แžถแž…แŸ’แžšแžพแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แžงแž‘แžถแž แžšแžŽแŸแž“แŸƒแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แž“แžทแž„แž€แžถแžšแž”แž„แŸ’แž€แžพแžแž…แŸ’แž”แžถแž”แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹ xt_u32. แžŸแžผแž˜แž˜แžพแž›แž•แž„แžŠแŸ‚แžšแž“แžผแžœแžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž“แŸ…แž…แžปแž„แž”แž‰แŸ’แž…แž”แŸ‹แž“แŸƒแžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡แŸ”

แž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแž†แŸ’แž“แžถแŸ† 2013 แž˜แŸ‰แžผแžŒแžปแž›แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž˜แŸ‰แžผแžŒแžปแž› xt_u32 แžขแŸ’แž“แž€แžขแžถแž…แž”แŸ’แžšแžพแž˜แŸ‰แžผแžŒแžปแž›แžŠแŸ‚แž›แž˜แžถแž“แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž›แžพ BPF xt_bpf. แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แžŠแŸ‚แž›แž”แžถแž“แžขแžถแž“แž†แŸ’แž„แžถแž™แž“แŸแŸ‡แž‚แžฝแžšแžแŸ‚แž…แŸ’แž”แžถแžŸแŸ‹แžšแžฝแž…แž แžพแž™แžขแŸ†แž–แžธแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž“แŸƒแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžšแž”แžŸแŸ‹แžœแžถ: แžŠแŸ†แžŽแžพแžšแž€แžถแžš BPF bytecode แž‡แžถแž…แŸ’แž”แžถแž”แŸ‹ iptables แŸ” แžขแŸ’แž“แž€แžขแžถแž…แž”แž„แŸ’แž€แžพแžแž…แŸ’แž”แžถแž”แŸ‹แžแŸ’แž˜แžธแžงแž‘แžถแž แžšแžŽแŸแžŠแžผแž…แž“แŸแŸ‡แŸ–

iptables -A INPUT -m bpf --bytecode <ะฑะฐะนั‚ะบะพะด> -j LOG

แž“แŸ…แž‘แžธแž“แŸแŸ‡ <ะฑะฐะนั‚ะบะพะด> - แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แžผแžŠแž“แŸ…แž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹แž›แž‘แŸ’แž’แž•แž›แžšแž”แžŸแŸ‹ assembler bpf_asm แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ แžงแž‘แžถแž แžšแžŽแŸ

$ cat /tmp/test.bpf
ldb [9]
jneq #17, ignore
ret #1
ignore: ret #0

$ bpf_asm /tmp/test.bpf
4,48 0 0 9,21 0 1 17,6 0 0 1,6 0 0 0,

# iptables -A INPUT -m bpf --bytecode "$(bpf_asm /tmp/test.bpf)" -j LOG

แž€แŸ’แž“แžปแž„แžงแž‘แžถแž แžšแžŽแŸแž“แŸแŸ‡ แž™แžพแž„แž€แŸ†แž–แžปแž„แžแŸ’แžšแž„แž€แž‰แŸ’แž…แž”แŸ‹ UDP แž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ” แž”แžšแžทแž”แž‘แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แž“แŸ…แž€แŸ’แž“แžปแž„แž˜แŸ‰แžผแžŒแžปแž›แž˜แžฝแž™แŸ” xt_bpfแž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹ แž…แž„แŸ’แžขแžปแž›แž‘แŸ…แž‘แžทแž“แŸ’แž“แž“แŸแž™แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“ แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธ iptables แž‘แŸ…แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž“แŸƒแž”แž‹แž˜แž€แžแžถ IPv4 แŸ” แžแŸ’แžšแžกแž”แŸ‹แžแž˜แŸ’แž›แŸƒแž–แžธแž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แž”แŸŠแžผแž›แžธแž“แžŠแŸ‚แž›แž‡แžถแž€แž“แŸ’แž›แŸ‚แž„ false แž˜แžถแž“แž“แŸแž™แžแžถแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แž˜แžทแž“แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแŸ”

แžœแžถแž…แŸ’แž”แžถแžŸแŸ‹แžŽแžถแžŸแŸ‹แžแžถแž˜แŸ‰แžผแžŒแžปแž› xt_bpf แž‚แžถแŸ†แž‘แŸ’แžšแžแž˜แŸ’แžšแž„แžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰แž‡แžถแž„แžงแž‘แžถแž แžšแžŽแŸแžแžถแž„แž›แžพแŸ” แžŸแžผแž˜แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžงแž‘แžถแž แžšแžŽแŸแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž–แžธ Cloudfare แŸ” แžšแž แžผแžแž˜แž€แžŠแž›แŸ‹แž–แŸแž›แžแŸ’แž˜แžธแŸ—แž“แŸแŸ‡แž–แžฝแž€แž‚แŸแž”แžถแž“แž”แŸ’แžšแžพแž˜แŸ‰แžผแžŒแžปแž› xt_bpf แžŠแžพแž˜แŸ’แž”แžธแž€แžถแžšแž–แžถแžšแž”แŸ’แžšแž†แžถแŸ†แž„แž“แžนแž„แž€แžถแžšแžœแžถแž™แž”แŸ’แžšแž แžถแžš DDoS แŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘ แž€แžถแžšแžŽแŸ‚แž“แžถแŸ†แžขแŸ†แž–แžธแžงแž”แž€แžšแžŽแŸ 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 datagram แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžŸแŸ†แžŽแžพแŸ– 0x04686162 <-> "x04hab" แž แžพแž™แžŠแžผแž…แŸ’แž“แŸแŸ‡แž“แŸ…แž›แžพแŸ”

แž”แž“แŸ’แžแžทแž…แž€แŸ’แžšแŸ„แž™แž˜แž€ Cloudfare แž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž€แžผแžŠ p0f -> BPF compiler codeแŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘ แž€แžถแžšแžŽแŸ‚แž“แžถแŸ† p0f BPF compiler แž–แžฝแž€แž‚แŸแž“แžทแž™แžถแž™แžขแŸ†แž–แžธแžขแŸ’แžœแžธแžŠแŸ‚แž› 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 แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžšแž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž…แžšแžถแž…แžšแžŽแŸแž“แŸ…แž€แŸ’แž“แžปแž„แž›แžธแž“แžปแž… แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ…แž›แžธแž“แžปแž…แž“แŸ…แž…แžปแž„แž†แŸ’แž“แžถแŸ† 2013 แž“แžทแž„แž‡แŸ†แž“แžฝแžŸแžŠแŸ„แž™แž‚แŸ†แž“แžทแžแž”แžปแžšแžถแžŽแŸ” cls_u32.

แž‘แŸ„แŸ‡แž‡แžถแž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™แžฅแžกแžผแžœแž“แŸแŸ‡แž™แžพแž„แž“แžนแž„แž˜แžทแž“แž–แžทแž–แžŽแŸŒแž“แžถแžขแŸ†แž–แžธแž€แžถแžšแž„แžถแžšแž“แŸ„แŸ‡แž‘แŸแŸ” cls_bpfแž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแž‘แžŸแŸ’แžŸแž“แŸˆแž“แŸƒแž…แŸ†แžŽแŸแŸ‡แžŠแžนแž„แžขแŸ†แž–แžธ BPF แž”แžปแžšแžถแžŽแž“แŸแŸ‡แž“แžนแž„แž˜แžทแž“แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แž™แžพแž„แž“แžผแžœแžขแŸ’แžœแžธแž“แŸ„แŸ‡แž‘แŸ - แž™แžพแž„แž”แžถแž“แžŸแŸ’แž‚แžถแž›แŸ‹แž˜แžปแžแž„แžถแžšแž‘แžถแŸ†แž„แžขแžŸแŸ‹แžšแžฝแž…แž แžพแž™แŸ” แž›แžพแžŸแž–แžธแž“แŸแŸ‡แž‘แŸ€แžแž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž‡แžถแž”แž“แŸ’แžแž”แž“แŸ’แž‘แžถแž”แŸ‹แžŠแŸ‚แž›แž“แžทแž™แžถแž™แžขแŸ†แž–แžธ Extended BPF แž™แžพแž„แž“แžนแž„แž‡แžฝแž”แžขแŸ’แž“แž€แž…แžถแžแŸ‹แžแŸ’แž“แžถแž€แŸ‹แž“แŸแŸ‡แž…แŸ’แžšแžพแž“แž‡แžถแž„แž˜แŸ’แžแž„แŸ”

แž แŸแžแžปแž•แž›แž˜แžฝแž™แž‘แŸ€แžแžŠแŸ‚แž›แž˜แžทแž“แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ BPF แž”แžปแžšแžถแžŽ c cls_bpf แž”แž‰แŸ’แž แžถแž‚แžบแžแžถ แž”แžพแž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž‘แŸ…แž“แžนแž„ Extended BPF แžœแžทแžŸแžถแž›แž—แžถแž–แž“แŸƒแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แžšแžฝแž˜แžแžผแž…แž™แŸ‰แžถแž„แžแŸ’แž›แžถแŸ†แž„แŸ– แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แžปแžšแžถแžŽแž˜แžทแž“แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžแŸ’แž›แžนแž˜แžŸแžถแžšแž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹ แž“แžทแž„แž˜แžทแž“แžขแžถแž…แžšแž€แŸ’แžŸแžถแž‘แžปแž€แžŸแŸ’แžแžถแž“แž—แžถแž–แžšแžœแžถแž„แž€แžถแžšแž แŸ…แž‘แžผแžšแžŸแž–แŸ’แž‘แž”แžถแž“แž‘แŸแŸ”

แžŠแžผแž…แŸ’แž“แŸแŸ‡แžœแžถแžŠแž›แŸ‹แž–แŸแž›แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž“แžทแž™แžถแž™แž›แžถแž‘แŸ… BPF แž”แžปแžšแžถแžŽ แž แžพแž™แž˜แžพแž›แž‘แŸ…แžขแž“แžถแž‚แžแŸ”

แž›แžถแž‘แŸ… BPF แž”แžปแžšแžถแžŽ

แž™แžพแž„แž”แžถแž“แž˜แžพแž›แž–แžธแžšแž”แŸ€แž”แžŠแŸ‚แž›แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถ BPF แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แž“แŸ…แžŠแžพแž˜แž‘แžŸแžœแžแŸ’แžŸแžšแŸแž‘แžธ 32 แžšแžŸแŸ‹แž“แŸ…แžŠแŸ„แž™แž‡แŸ„แž‚แž‡แŸแž™แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แž˜แžฝแž™แž—แžถแž‚แž”แžฝแž“แž“แŸƒแžŸแžแžœแžแŸ’แžŸ แž แžพแž™แžšแž แžผแžแžŠแž›แŸ‹แž…แžปแž„แž”แž‰แŸ’แž…แž”แŸ‹แž”แžถแž“แžšแž€แžƒแžพแž‰แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžแŸ’แž˜แžธแŸ” แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถแž‘แŸ…แž“แžนแž„แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž–แžธแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž‡แž„แŸ‹แž‘แŸ… RISC แžŠแŸ‚แž›แž”แžถแž“แž”แž˜แŸ’แžšแžพแž‡แžถแž€แž˜แŸ’แž›แžถแŸ†แž„แžšแžปแž‰แž…แŸ’แžšแžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แž BPF แž”แžปแžšแžถแžŽแž“แŸ…แž€แŸ’แž“แžปแž„แž‘แžŸแžœแžแŸ’แžŸแžšแŸแž†แŸ’แž“แžถแŸ† 64 แž˜แžถแž“แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž–แžธแž˜แŸ‰แžถแžŸแŸŠแžธแž“ XNUMX แž”แŸŠแžธแžแž‘แŸ… XNUMX แž”แŸŠแžธแž แž แžพแž™ BPF แž”แžปแžšแžถแžŽแž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž›แŸ‚แž„แž”แŸ’แžšแžพแŸ” แž›แžพแžŸแž–แžธแž“แŸแŸ‡แž‘แŸ€แžแžŸแž˜แžแŸ’แžแž—แžถแž–แžšแž”แžŸแŸ‹ BPF แž”แžปแžšแžถแžŽแž˜แžถแž“แž€แž˜แŸ’แžšแžทแžแžแŸ’แž›แžถแŸ†แž„แžŽแžถแžŸแŸ‹ แž แžพแž™แž”แž“แŸ’แžแŸ‚แž˜แž–แžธแž›แžพแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แž แžฝแžŸแžŸแž˜แŸแž™ - แž™แžพแž„แž˜แžทแž“แž˜แžถแž“แžŸแž˜แžแŸ’แžแž—แžถแž–แž€แŸ’แž“แžปแž„แž€แžถแžšแžšแž€แŸ’แžŸแžถแž‘แžปแž€แžŸแŸ’แžแžถแž“แž—แžถแž–แžšแžœแžถแž„แž€แžถแžšแž แŸ…แž‘แŸ…แž€แžถแž“แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธ BPF แž˜แžทแž“แž˜แžถแž“แž›แž‘แŸ’แž’แž—แžถแž–แž“แŸƒแžขแž“แŸ’แžแžšแž€แž˜แŸ’แž˜แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แž‘แŸแžœแžถแž˜แžทแž“แž˜แžถแž“แž›แž‘แŸ’แž’แž—แžถแž–แž’แŸ’แžœแžพแžขแž“แŸ’แžแžšแž€แž˜แŸ’แž˜แž‘แŸแŸ” แž‡แžถแž˜แžฝแž™แžแžบแžŽแŸ‚แž› แž›แžพแž€แž›แŸ‚แž„แžแŸ‚แž€แžถแžšแžขแžถแž“แž…แŸ†แž“แžฝแž“แž€แŸ†แžŽแžแŸ‹แž“แŸƒแžœแžถแž›แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ sk_buff แž“แžทแž„แž€แžถแžšแž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž˜แžปแžแž„แžถแžšแž‡แŸ†แž“แžฝแž™แž€แžถแžšแžŠแŸแžŸแžถแž˜แž‰แŸ’แž‰แž”แŸ†แž•แžปแž แžขแŸ’แž“แž€แž˜แžทแž“แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแžแŸ’แž›แžนแž˜แžŸแžถแžšแž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“ แž“แžทแž„แž”แž‰แŸ’แž‡แžผแž“แž”แž“แŸ’แžแž–แžฝแž€แžœแžถแž”แžถแž“แž‘แŸแŸ”

แžแžถแž˜แž–แžทแžแž‘แŸ… แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž“แŸแŸ‡ แžขแŸ’แžœแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹แžŠแŸ‚แž›แž“แŸ…แžŸแŸแžŸแžŸแž›แŸ‹แž“แŸƒ BPF แž”แžปแžšแžถแžŽแž“แŸ…แž€แŸ’แž“แžปแž„แž›แžธแž“แžปแž… แž‚แžบแž‡แžถแž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹ API แž แžพแž™แž“แŸ…แžแžถแž„แž€แŸ’แž“แžปแž„แžแžบแžŽแŸ‚แž›แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แžปแžšแžถแžŽแž‘แžถแŸ†แž„แžขแžŸแŸ‹ แž˜แžทแž“แžแžถแžœแžถแž‡แžถแžแž˜แŸ’แžšแž„แžšแž“แŸ’แž’ แžฌแžแž˜แŸ’แžšแž„ seccomp แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž€แž”แŸ’แžšแŸ‚แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž‘แŸ…แž‡แžถแž‘แž˜แŸ’แžšแž„แŸ‹แžแŸ’แž˜แžธ Extended BPF แŸ” (แž™แžพแž„แž“แžนแž„แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแž€แžพแžแžกแžพแž„แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž”แž“แŸ’แž‘แžถแž”แŸ‹แŸ” )

แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‘แŸ…แž€แžถแž“แŸ‹แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แžแŸ’แž˜แžธแž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž“แŸ…แž€แŸ’แž“แžปแž„แž†แŸ’แž“แžถแŸ† 2013 แž“แŸ…แž–แŸแž›แžŠแŸ‚แž› Alexey Starovoitov แž”แžถแž“แžŸแŸ’แž“แžพแž‚แž˜แŸ’แžšแŸ„แž„แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž– BPF แŸ” แž“แŸ…แž†แŸ’แž“แžถแŸ† 2014 แž”แŸ†แžŽแŸ‡แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแŸ” แž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž›แŸแž…แžกแžพแž„ แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸ’แž“แžผแž›แŸ” แžแžถแž˜แžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž™แž›แŸ‹ แž•แŸ‚แž“แž€แžถแžšแžŠแžพแž˜แž‚แžบแž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ แž“แžทแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž…แž„แž€แŸ’แžšแž„ JIT แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แžถแž“แŸ‹แžแŸ‚แž˜แžถแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“ 64 แž”แŸŠแžธแžแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž•แŸ’แž‘แžปแž™แž‘แŸ…แžœแžทแž‰แž€แžถแžšแž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แž‘แžถแŸ†แž„แž“แŸแŸ‡แž”แžถแž“แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž“แŸƒแž‡แŸ†แž–แžผแž€แžแŸ’แž˜แžธแž€แŸ’แž“แžปแž„แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž›แžธแž“แžปแž…แŸ”

แžขแžแŸ’แžแž”แž‘แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸŠแŸแžšแžธแž“แŸแŸ‡แž“แžนแž„แž‚แŸ’แžšแž”แžŠแžŽแŸ’แžแž”แŸ‹แž›แžพแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ แž“แžทแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž“แŸƒแž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแžแŸ’แž˜แžธ แžŠแŸ‚แž›แžŠแŸ†แž”แžผแž„แž‚แŸแžŸแŸ’แž‚แžถแž›แŸ‹แžแžถแž‡แžถ BPF แžแžถแž„แž€แŸ’แž“แžปแž„ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž–แž„แŸ’แžšแžธแž€ BPF แž แžพแž™แžฅแžกแžผแžœแž“แŸแŸ‡แž‡แžถแž’แž˜แŸ’แž˜แžแžถ BPF แŸ”

แžŸแŸแž…แž€แŸ’แžแžธแž™แŸ„แž„

  1. Steven McCanne แž“แžทแž„ Van Jacobson, "The BSD Packet Filter: A New Architecture for User-level Packet Capture", https://www.tcpdump.org/papers/bpf-usenix93.pdf
  2. Steven McCanne, "libpcap: แžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ แž“แžทแž„แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž™แž€แž€แž‰แŸ’แž…แž”แŸ‹", https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
  3. tcpdump, libpcap: https://www.tcpdump.org/
  4. แž€แžถแžšแž”แž„แŸ’แžšแŸ€แž“แžขแŸ†แž–แžธแž€แžถแžšแž”แŸ’แžšแž€แžฝแž IPtable U32.
  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: แž‰แŸ‚แž€แžŠแŸแž˜แžทแž“แž‡แžถแž˜แžฝแž™แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžฌ "แžขแŸ’แž“แž€แž˜แžทแž“แžแŸ’แžšแžผแžœแž€แžถแžš Docker แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแžฟแž„แž“แŸแŸ‡แž‘แŸ!"
  12. Paul Chaignon, "strace --seccomp-bpf: a look under the hood", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹