āĻ›ā§‹āĻŸāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ BPF, āĻ…āĻ‚āĻļ āĻļā§‚āĻ¨ā§āĻ¯: āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF

āĻŦāĻžāĻ°ā§āĻ•āĻ˛ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° (āĻŦāĻŋāĻĒāĻŋāĻāĻĢ) āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ¯āĻž āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ• āĻŦāĻ›āĻ° āĻ§āĻ°ā§‡ āĻ‡āĻ‚āĻ°ā§‡āĻœāĻŋ āĻ­āĻžāĻˇāĻžāĻ° āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻĒā§āĻ°āĻ•āĻžāĻļāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻžāĻ¤āĻžāĻ¯āĻŧ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ¸āĻŽā§āĻŽā§‡āĻ˛āĻ¨āĻ—ā§āĻ˛āĻŋ BPF-āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻĻāĻ¨ā§‡ āĻĒā§‚āĻ°ā§āĻŖāĨ¤ āĻĄā§‡āĻ­āĻŋāĻĄ āĻŽāĻŋāĻ˛āĻžāĻ°, āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ¸āĻžāĻŦāĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖāĻ•āĻžāĻ°ā§€, āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻĒā§āĻ˛āĻžāĻŽā§āĻŦāĻžāĻ°āĻ¸ 2018 āĻ āĻ¤āĻžāĻ° āĻŦāĻ•ā§āĻ¤ā§ƒāĻ¤āĻž āĻ•āĻ˛ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ "āĻāĻ‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž XDP āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¨āĻ¯āĻŧ" (XDP BPF-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡)āĨ¤ āĻŦā§āĻ°ā§‡āĻ¨ā§āĻĄāĻ¨ āĻ—ā§āĻ°ā§‡āĻ— āĻāĻ¨āĻŸāĻžāĻ‡āĻŸā§‡āĻ˛ āĻŸāĻ•āĻ¸ āĻĻā§‡āĻ¨ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ¸ā§āĻĒāĻžāĻ° āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°. āĻŸā§‹āĻ•ā§‡ āĻšā§‹āĻ‡āĻ˛ā§āĻ¯āĻžāĻ¨ā§āĻĄ-āĻœāĻ°ā§āĻ—ā§‡āĻ¨āĻ¸ā§‡āĻ¨ āĻšāĻžāĻ¸ā§‡āĻ¯ā§‡ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛āĻŸāĻŋ āĻāĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ•āĻžāĻ°āĻ¨ā§‡āĻ˛āĨ¤ āĻŸāĻŽāĻžāĻ¸ āĻ—ā§āĻ°āĻžāĻĢ āĻāĻ‡ āĻ§āĻžāĻ°āĻŖāĻžāĻŸāĻŋ āĻĒā§āĻ°āĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨ BPF āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ.

HabrÊ-āĻ BPF-āĻāĻ° āĻāĻ–āĻ¨āĻ“ āĻ•ā§‹āĻ¨āĻ“ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—āĻ¤ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ¨ā§‡āĻ‡, āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ‡āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻŋāĻ°āĻŋāĻœā§‡ āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŦ, āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āĻ¯ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŦ āĻāĻŦāĻ‚ BPF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ“ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻ°ā§‚āĻĒāĻ°ā§‡āĻ–āĻž āĻĻā§‡āĻŦāĨ¤ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ, āĻļā§‚āĻ¨ā§āĻ¯, āĻ¸āĻŋāĻ°āĻŋāĻœā§‡, āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻāĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āĻ¯āĻ•ā§‡ āĻŦāĻ˛ā§‡, āĻāĻŦāĻ‚ āĻāĻ° āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¨ā§€āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻ—ā§‹āĻĒāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ“ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°ā§‡āĨ¤ tcpdump, seccomp, strace, āĻāĻŦāĻ‚ āĻ†āĻ°ā§‹ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§.

BPF āĻāĻ° āĻŦāĻŋāĻ•āĻžāĻļ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āĻ¸āĻŽā§āĻĒā§āĻ°āĻĻāĻžāĻ¯āĻŧ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŋāĻ¤ āĻšāĻ¯āĻŧ, BPF āĻāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻ¸āĻš @āĻ‡āĻ‰āĻ•āĻžāĻ°āĻŋāĻ“āĻŸ, āĻ†āĻŽāĻŋ āĻ¸āĻŋāĻ°āĻŋāĻœāĻŸāĻŋāĻ•ā§‡ "āĻ›ā§‹āĻŸāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ BPF" āĻŦāĻ˛ā§‡āĻ›āĻŋ, āĻŽāĻšāĻžāĻ¨ āĻ¸āĻŋāĻ°āĻŋāĻœā§‡āĻ° āĻ¸āĻŽā§āĻŽāĻžāĻ¨ā§‡ "āĻ›ā§‹āĻŸāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•".

BPF āĻāĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤ āĻ•ā§‹āĻ°ā§āĻ¸ (c)

āĻ†āĻ§ā§āĻ¨āĻŋāĻ• BPF āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻšāĻ˛ āĻāĻ•āĻ‡ āĻ¨āĻžāĻŽā§‡āĻ° āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻāĻŦāĻ‚ āĻ¸āĻŽā§āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ, āĻāĻ–āĻ¨ āĻŦāĻŋāĻ­ā§āĻ°āĻžāĻ¨ā§āĻ¤āĻŋ āĻāĻĄāĻŧāĻžāĻ¤ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻāĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ tcpdump, āĻĒāĻĻā§āĻ§āĻ¤āĻŋ seccomp, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻŽāĻĄāĻŋāĻ‰āĻ˛ xt_bpf āĻĨā§‡āĻ•ā§‡ iptables āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻĢāĻžāĻ¯āĻŧāĻžāĻ° cls_bpf. āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡, āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻĢāĻ°ā§āĻŽā§‡ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§‡, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ•ā§‹āĻŖ āĻĨā§‡āĻ•ā§‡, āĻāĻĒāĻŋāĻ†āĻ‡ āĻ°āĻ¯āĻŧā§‡ āĻ—ā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• āĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻ¤ā§āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°, āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻĻā§‡āĻ–āĻŦ, āĻāĻ–āĻ¨āĻ“ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻšā§āĻ›ā§‡āĨ¤ āĻāĻ‡ āĻ•āĻžāĻ°āĻŖā§‡, āĻāĻŦāĻ‚ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ āĻ§ā§āĻ°ā§āĻĒāĻĻā§€ BPF-āĻāĻ° āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡, āĻāĻŸāĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻŦāĻ‚ āĻ•ā§‡āĻ¨ āĻāĻŸāĻŋāĻ° āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻ†āĻ•āĻžāĻ°ā§‡ āĻŦāĻŋāĻ•āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻ¤āĻž āĻ†āĻ°āĻ“ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡, āĻ†āĻŽāĻŋ āĻļāĻžāĻ¸ā§āĻ¤ā§āĻ°ā§€āĻ¯āĻŧ BPF āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤

āĻ—āĻ¤ āĻļāĻ¤āĻžāĻŦā§āĻĻā§€āĻ° āĻ†āĻļāĻŋāĻ° āĻĻāĻļāĻ•ā§‡āĻ° āĻļā§‡āĻˇā§‡āĻ° āĻĻāĻŋāĻ•ā§‡, āĻŦāĻŋāĻ–ā§āĻ¯āĻžāĻ¤ āĻ˛āĻ°ā§‡āĻ¨ā§āĻ¸ āĻŦāĻžāĻ°ā§āĻ•āĻ˛ā§‡ āĻ˛ā§āĻ¯āĻžāĻŦāĻ°ā§‡āĻŸāĻ°āĻŋāĻ° āĻĒā§āĻ°āĻ•ā§ŒāĻļāĻ˛ā§€āĻ°āĻž āĻ—āĻ¤ āĻļāĻ¤āĻžāĻŦā§āĻĻā§€āĻ° āĻ†āĻļāĻŋāĻ° āĻĻāĻļāĻ•ā§‡āĻ° āĻļā§‡āĻˇā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻšāĻžāĻ°ā§āĻĄāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ°ā§‡āĻ° āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¸ā§‡āĻ‡ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻšāĻ¯āĻŧā§‡ āĻ“āĻ ā§‡āĻ¨āĨ¤ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ§āĻžāĻ°āĻŖāĻž, āĻŽā§‚āĻ˛āĻ¤ āĻ¸āĻŋāĻāĻ¸āĻĒāĻŋāĻāĻĢ (āĻ¸āĻŋāĻāĻŽāĻ‡āĻ‰/āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨āĻĢā§‹āĻ°ā§āĻĄ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°) āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¤ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻ¯āĻ¤ āĻ¤āĻžāĻĄāĻŧāĻžāĻ¤āĻžāĻĄāĻŧāĻŋ āĻ¸āĻŽā§āĻ­āĻŦ āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ•āĻ°āĻž āĻ›āĻŋāĻ˛, āĻ¯ā§‡āĻŽāĻ¨ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻ¸ā§āĻĒā§‡āĻ¸ā§‡, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¸ā§āĻĒā§‡āĻ¸ā§‡ āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻĄā§‡āĻŸāĻž āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°āĻž āĻāĻĄāĻŧāĻžāĻ¯āĻŧāĨ¤ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻ¸ā§āĻĒā§‡āĻ¸ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ•ā§‹āĻĄ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŦāĻ•ā§āĻ¸āĻ¯ā§āĻ•ā§āĻ¤ āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ•-āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻ¨āĻ¤ā§āĻ¨ RISC āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻ¤āĻ¤āĻŸāĻž āĻĻāĻ•ā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĻ¨āĻŋāĨ¤ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŦāĻžāĻ°ā§āĻ•āĻ˛ā§‡ āĻ˛ā§āĻ¯āĻžāĻŦāĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻ•ā§ŒāĻļāĻ˛ā§€āĻĻā§‡āĻ° āĻĒā§āĻ°āĻšā§‡āĻˇā§āĻŸāĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡, āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ (āĻŦāĻžāĻ°ā§āĻ•āĻ˛ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°) āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻ¯āĻžāĻ° āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°āĻŸāĻŋ āĻŽāĻŸā§‹āĻ°ā§‹āĻ˛āĻž 6502 āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻ°ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ - āĻ¯ā§‡āĻŽāĻ¨ āĻ¸ā§āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻĒāĻŖā§āĻ¯āĻ—ā§āĻ˛āĻŋāĻ° āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻšāĻ°āĻ¸āĨ¤ āĻ…ā§āĻ¯āĻžāĻĒāĻ˛ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻŦāĻž āĻāĻ¨āĻ‡āĻāĻ¸. āĻ¨āĻ¤ā§āĻ¨ āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĻāĻļāĻ—ā§āĻŖ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°

āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻœā§‡āĻ° āĻ‰āĻĒāĻžāĻ¯āĻŧā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āĻ¯ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻšāĻŦ, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻļā§āĻ°ā§āĻ¤ā§‡, āĻ†āĻ¸ā§āĻ¨ āĻŦāĻ˛āĻŋ āĻ¯ā§‡ āĻŽā§‡āĻļāĻŋāĻ¨āĻŸāĻŋāĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻžāĻ›ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸āĻ¯ā§‹āĻ—ā§āĻ¯ āĻĻā§āĻŸāĻŋ 32-āĻŦāĻŋāĻŸ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸāĻžāĻ° āĻ›āĻŋāĻ˛, āĻāĻ•āĻŸāĻŋ āĻ¸āĻžā§āĻšāĻ¯āĻŧāĻ•āĻžāĻ°ā§€ A āĻāĻŦāĻ‚ āĻ‡āĻ¨āĻĄā§‡āĻ•ā§āĻ¸ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸāĻžāĻ° X, 64 āĻŦāĻžāĻ‡āĻŸ āĻŽā§‡āĻŽāĻ°āĻŋ (16 āĻļāĻŦā§āĻĻ), āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻĄāĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§, āĻāĻŦāĻ‚ āĻāĻ‡ āĻŦāĻ¸ā§āĻ¤ā§āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽāĨ¤ āĻļāĻ°ā§āĻ¤āĻ¸āĻžāĻĒā§‡āĻ•ā§āĻˇ āĻ…āĻ­āĻŋāĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻœāĻžāĻŽā§āĻĒ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻžāĻŦāĻ˛ā§€ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡āĻ“ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ›āĻŋāĻ˛, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻŽāĻ¤ā§‹ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻœāĻžāĻŽā§āĻĒāĻ—ā§āĻ˛āĻŋ āĻ•ā§‡āĻŦāĻ˛āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ—āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻŦāĻŋāĻļā§‡āĻˇāĻ¤, āĻ˛ā§āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§ āĻ›āĻŋāĻ˛āĨ¤

āĻŽā§‡āĻļāĻŋāĻ¨āĻŸāĻŋ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸ā§āĻ•āĻŋāĻŽāĻŸāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒāĨ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ BPF āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻŋāĻ›ā§ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ (āĻ¯ā§‡āĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻ˛), āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋāĻ•ā§‡ āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻ•āĻŋāĻ›ā§ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡āĻ° āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°ā§‡ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻšāĻ˛ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ•āĻžāĻ°ā§āĻĄā§‡ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ†āĻ—āĻŽāĻ¨)āĨ¤ āĻāĻ•āĻŸāĻŋ āĻ˜āĻŸāĻ¨āĻž āĻ˜āĻŸāĻ˛ā§‡, āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¯āĻŧ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻĻā§‹āĻ­āĻžāĻˇā§€āĻ¤ā§‡), āĻāĻŦāĻ‚ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡āĻ° āĻŽā§‡āĻŽāĻ°āĻŋ āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻŋāĻ˛ā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻ•āĻŋāĻ›ā§ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻŽā§‡āĻŽāĻ°āĻŋ āĻ…āĻžā§āĻšāĻ˛ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻĄā§‡āĻŸāĻž)āĨ¤

āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻšāĻŦā§‡: āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻāĻŦāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻšāĻŦāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡āĻ° āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻāĻŦāĻ‚ āĻāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻœāĻžāĻ¨āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻŽā§‚āĻ˛ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻŦāĻŋāĻāĻ¸āĻĄāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽāĻžāĻ°ā§āĻ§ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨/networking/filter.txt āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ āĻĨā§‡āĻ•ā§‡āĨ¤ āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ†āĻĒāĻ¨āĻŋ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ libpcap: āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ•ā§āĻ¯āĻžāĻĒāĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻ…āĻĒā§āĻŸāĻŋāĻŽāĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŽā§āĻ¯āĻžāĻ•āĻ•āĻžāĻ¨, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāĻ° āĻ…āĻ¨ā§āĻ¯āĻ¤āĻŽ āĻ˛ā§‡āĻ–āĻ•, āĻ¸ā§ƒāĻˇā§āĻŸāĻŋāĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛ā§‡āĻ›ā§‡āĻ¨ libpcap.

āĻ†āĻŽāĻ°āĻž āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻāĻ—āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ‡: tcpdump (libpcap), seccomp, xt_bpf, cls_bpf.

tcpdump

āĻŦāĻŋāĻĒāĻŋāĻāĻĢā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ - āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ tcpdump. āĻāĻŦāĻ‚, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻ…āĻ¨ā§‡āĻ• āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻžāĻšā§€āĻ¨āĻ¤āĻŽ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻŦāĻŋāĻ–ā§āĻ¯āĻžāĻ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŦāĨ¤

(āĻ†āĻŽāĻŋ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻžāĻ˛āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ 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)āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŋāĻ¤ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ¤āĻŽ āĻŦāĻžāĻ‡āĻŸāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ‡āĻĨāĻžāĻ°āĻ¨ā§‡āĻŸ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĄāĻŧāĻŋ 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 āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻŋ

āĻāĻ•āĻŸāĻŋ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻĻā§‡āĻ–āĻ¤ā§‡ āĻ•ā§‡āĻŽāĻ¨ āĻ¤āĻž āĻ—āĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻĒā§‹āĻ°ā§āĻŸ 666 āĻ¸āĻš āĻ¸āĻŽāĻ¸ā§āĻ¤ TCP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ•āĻĒāĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻŽāĻ°āĻž 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 āĻ†āĻ‡āĻĒāĻŋ āĻšā§‡āĻĄāĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°, āĻ¯āĻž āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ•, āĻ•āĻžāĻ°āĻŖ āĻ†āĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° TCP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ•āĻĒāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°āĻŋ 0x6 (IPPROTO_TCP) āĻ˛āĻžāĻ‡āĻ¨ 3 āĻāĨ¤

āĻ˛āĻžāĻ‡āĻ¨ 4 āĻāĻŦāĻ‚ 5 āĻ āĻ†āĻŽāĻ°āĻž āĻ āĻŋāĻ•āĻžāĻ¨āĻž 20 āĻ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻžāĻĢāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ jset āĻ¤āĻŋāĻ¨āĻŸāĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨ āĻĒāĻ¤āĻžāĻ•āĻž - āĻœāĻžāĻ°āĻŋ āĻ•āĻ°āĻž āĻŽāĻžāĻ¸ā§āĻ• āĻĒāĻ°āĻž jset āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻŋāĻŸ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻŦāĻŋāĻŸā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĻā§āĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻ˛ā§‡ āĻ¯ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ–āĻŖā§āĻĄāĻŋāĻ¤ āĻ†āĻ‡āĻĒāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ…āĻ‚āĻļ āĻ•āĻŋāĻ¨āĻž āĻāĻŦāĻ‚ āĻ¯āĻĻāĻŋ āĻ¤āĻžāĻ‡ āĻšāĻ¯āĻŧ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻļā§‡āĻˇ āĻ–āĻŖā§āĻĄ āĻ•āĻŋāĻ¨āĻžāĨ¤ āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻŦāĻŋāĻŸ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻļā§‚āĻ¨ā§āĻ¯ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻ…āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻž āĻ­āĻžāĻ™āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšā§‡āĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻŦāĻŋāĻŸ āĻšā§‡āĻ• āĻ•āĻ°āĻŋāĨ¤

āĻ˛āĻžāĻ‡āĻ¨ 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 āĻŦāĻžāĻ‡āĻŸ āĻ‡āĻĨāĻžāĻ°āĻ¨ā§‡āĻŸ āĻšā§‡āĻĄāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĻāĻ–āĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻāĻŦāĻ‚ X IPv4 āĻšā§‡āĻĄāĻžāĻ°ā§‡āĻ° āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ†āĻŽāĻ°āĻž āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§‡ A TCP āĻ—āĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻĒā§‹āĻ°ā§āĻŸ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡:

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

āĻ…āĻŦāĻļā§‡āĻˇā§‡, 8 āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻĒāĻ›āĻ¨ā§āĻĻāĻ¸āĻ‡ āĻŽāĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ—āĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻĒā§‹āĻ°ā§āĻŸā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ 9 āĻŦāĻž 10 āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻĢāĻ˛āĻžāĻĢāĻ˛āĻŸāĻŋ āĻĢā§‡āĻ°āĻ¤ āĻĻāĻŋāĻ‡ - āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°āĻž āĻšā§‹āĻ• āĻŦāĻž āĻ¨āĻž āĻšā§‹āĻ•āĨ¤

Tcpdump: āĻ˛ā§‹āĻĄ āĻšāĻšā§āĻ›ā§‡

āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻŋ āĻ¸ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻŽāĻ°āĻž āĻŦāĻŋāĻļā§‡āĻˇāĻ­āĻžāĻŦā§‡ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻŋāĻ¨āĻŋāĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡ āĻŦāĻ˛āĻ¤ā§‡, 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 āĻ¸āĻžāĻ˛ā§‡ āĻāĻ¸ā§‡āĻ›āĻŋāĻ˛, āĻ¯āĻ–āĻ¨ āĻāĻ°āĻŋāĻ• āĻĄā§āĻŽāĻžāĻœā§‡āĻŸ āĻĒā§āĻ°āĻ¸ā§āĻ¤āĻžāĻŦ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ā§‡āĻ¨ āĻ¤āĻžāĻ˛āĻŋ, āĻ¯āĻž āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻœāĻžāĻ¸ā§āĻŸ āĻ‡āĻ¨ āĻŸāĻžāĻ‡āĻŽ āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛āĻžāĻ° āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ - BPF āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄāĻ•ā§‡ āĻ¨ā§‡āĻŸāĻŋāĻ­-āĻ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻŦāĻžāĻĻāĻ• x86_64 āĻ•ā§‹āĻĄāĨ¤

JIT āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻļā§ƒāĻ™ā§āĻ–āĻ˛ā§‡ āĻĒā§āĻ°āĻĨāĻŽ āĻ›āĻŋāĻ˛: 2012 āĻ¸āĻžāĻ˛ā§‡ āĻšāĻžāĻœāĻŋāĻ° āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ˛ā§‡āĻ–āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¸ā§‡āĻ•āĻŽā§āĻĒāĻŽā§āĻĒ, BPF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻœāĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ°ā§€ 2013 āĻ›āĻŋāĻ˛ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻŽāĻĄāĻŋāĻ‰āĻ˛ xt_bpf, āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ iptables BPF āĻāĻ° āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ 2013 āĻ¸āĻžāĻ˛ā§‡āĻ° āĻ…āĻ•ā§āĻŸā§‹āĻŦāĻ°ā§‡ āĻ›āĻŋāĻ˛ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāĻ•āĻŸāĻŋ āĻŽāĻĄāĻŋāĻ‰āĻ˛ cls_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. āĻ¸āĻŋ-āĻ¤ā§‡, āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• 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),
}

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻ‡ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻŸāĻŋ āĻ–ā§āĻŦ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻ¨āĻ¯āĻŧāĨ¤ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻžāĻ°āĻ°āĻž āĻāĻŸāĻŋāĻ‡ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¯ā§āĻ•ā§āĻ¤ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ¤ā§‡ 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,

āĻ¸āĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻžāĻ°āĻĻā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻ•āĻŸāĻŋ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡:

$ 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, āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻļā§āĻ°ā§āĻ¤ā§‡ āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤

āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻāĻŦāĻ‚ āĻ¨ā§‡āĻŸāĻ¸ā§āĻ¨āĻŋāĻĢ-āĻāĻ¨āĻœāĻŋ āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨āĻļāĻ¨

āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻāĻŦāĻ‚ 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, āĻāĻ•āĻœāĻ¨ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ…ā§āĻ¯āĻžāĻ¸ā§‡āĻŽā§āĻŦāĻ˛āĻžāĻ°āĻ•ā§‡ āĻĄāĻžāĻ•āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ bpfc. āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋāĻ¤ā§‡ āĻŦā§‡āĻļ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻļā§‡āĻˇā§‡ āĻ˛āĻŋāĻ™ā§āĻ•āĻ—ā§āĻ˛āĻŋāĻ“ āĻĻā§‡āĻ–ā§āĻ¨āĨ¤

āĻ¸ā§‡āĻ•āĻŽā§āĻĒāĻŽā§āĻĒ

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻœāĻžāĻ¨āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻšāĻžāĻ°ā§‡ āĻœāĻŸāĻŋāĻ˛āĻ¤āĻžāĻ° BPF āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¨āĻ¤ā§āĻ¨ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤, āĻ¯āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒā§āĻ°āĻĨāĻŽāĻŸāĻŋ āĻšāĻ˛ seccomp āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ, āĻ¯āĻž BPF āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻ˛ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ¸ā§‡āĻŸ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻŸ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻŦāĻ‚āĻļāĻ§āĻ°āĨ¤

seccomp-āĻāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ 2005 āĻ¸āĻžāĻ˛ā§‡ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ–ā§āĻŦ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻ›āĻŋāĻ˛ āĻ¨āĻž, āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ - āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻŸāĻ•ā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ•āĻ°āĻ¤ā§‡: read, write, exit и sigreturn, āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ˛āĻ™ā§āĻ˜āĻ¨āĻ•āĻžāĻ°ā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻšāĻ¤ā§āĻ¯āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ SIGKILL. āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, 2012 āĻ¸āĻžāĻ˛ā§‡, seccomp BPF āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĻ›ā§‡, āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻŋāĻ¤ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻāĻŽāĻ¨āĻ•āĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ (āĻŽāĻœāĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻšāĻ˛, āĻ•ā§āĻ°ā§‹āĻŽ āĻāĻ‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻœāĻ¨ āĻ›āĻŋāĻ˛, āĻāĻŦāĻ‚ āĻ•ā§āĻ°ā§‹āĻŽ āĻ˛ā§‹āĻ•ā§‡āĻ°āĻž āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ BPF-āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ KRSI āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻŽāĻĄāĻŋāĻ‰āĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•āĻžāĻ¸ā§āĻŸāĻŽāĻžāĻ‡āĻœ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻāĻŋāĻšā§āĻ›ā§‡āĨ¤) āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ā§‡āĻ° āĻ˛āĻŋāĻ™ā§āĻ•āĻ—ā§āĻ˛āĻŋ āĻļā§‡āĻˇā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ°

āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻ¸ā§‡āĻ•āĻŽāĻĒ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻšāĻžāĻŦā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻšāĻ¯āĻŧāĻ¤ āĻ•ā§‡āĻ‰ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ‰āĻĒāĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻĒāĻĄāĻŧāĻžāĻ° āĻ†āĻ—ā§‡ (āĻŦāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡) āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻšāĻžāĻ‡āĻŦā§‡āĨ¤ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ā§‡ āĻ§āĻžāĻ°āĻ• āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž: seccomp Seccomp āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡, 2007 āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ BPF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ‰āĻ­āĻ¯āĻŧāĻ‡ (libseccomp āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ), āĻĄāĻ•āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ seccomp-āĻāĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛ā§‡ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§‡āĻ• āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻ˛āĻŋāĻ™ā§āĻ•āĻ“ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ā§‡ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĄā§‡āĻŽāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨ āĻ•āĻ°āĻž āĻŦāĻž "āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĄāĻ•āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡!" āĻāĻŸāĻŋ āĻ•āĻ­āĻžāĻ° āĻ•āĻ°ā§‡, āĻŦāĻŋāĻļā§‡āĻˇ āĻ•āĻ°ā§‡, āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻĄ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻĄā§‡āĻŽāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻ˛ā§‡āĻ° āĻ•āĻžāĻ˛ā§‹ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻŦāĻž āĻ¸āĻžāĻĻāĻž āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€āĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ seccomp āĻŦā§‡āĻ¯āĻŧāĻžāĻ° āĻ¸āĻŋ āĻāĻŦāĻ‚ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ libseccomp āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻāĻŦāĻ‚ āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ—ā§āĻ˛āĻŋ āĻ•ā§€ āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§‡āĻˇā§‡, āĻ†āĻ¸ā§āĻ¨ āĻĻā§‡āĻ–āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸ā§‡āĻ•āĻŽāĻĒ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ strace.

seccomp-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ˛ā§‡āĻ–āĻž āĻāĻŦāĻ‚ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž

āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻœāĻžāĻ¨āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ BPF āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻ†āĻ¸ā§āĻ¨ āĻĒā§āĻ°āĻĨāĻŽā§‡ seccomp āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸āĻŸāĻŋ āĻĻā§‡āĻ–āĻŋāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻ¤āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻāĻŦāĻ‚ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻļāĻŋāĻļā§ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻŋāĻ§āĻŋāĻ¨āĻŋāĻˇā§‡āĻ§ā§‡āĻ° āĻ‰āĻ¤ā§āĻ¤āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ°ā§€ āĻšāĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ &filter - āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻ• struct sock_fprog, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦā§‡ 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() āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ (āĻŽāĻœāĻžāĻ° āĻŦā§āĻ¯āĻžāĻĒāĻžāĻ° āĻšāĻ˛, āĻŽā§‚āĻ˛ āĻ•āĻŽāĻŋāĻŸāĻŸāĻŋāĻ¤ā§‡ āĻ¯ā§‡āĻŸāĻŋ 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 āĻ…ā§āĻ¯āĻžāĻ¸ā§‡āĻŽā§āĻŦāĻ˛āĻžāĻ°ā§‡ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ:

$ 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 āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻ¤, āĻ•ā§‹āĻ¨ āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻ¨ā§‡āĻ‡ āĻ¨āĻž āĻšāĻžāĻ‡āĻ˛ā§āĻĄ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–ā§āĻ¨, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ¸ā§‡āĻ•āĻŽāĻĒ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻāĻŸāĻŋ āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻšāĻžāĻ‡āĻ˛ā§āĻĄ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ‰āĻ¤ā§āĻ¤āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ°āĻ¸ā§‚āĻ¤ā§āĻ°ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤

āĻ āĻŋāĻ• āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸā§ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ strace āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ seccomp āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡ āĻ¸āĻžāĻŽā§āĻĒā§āĻ°āĻ¤āĻŋāĻ• āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ. āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ¤āĻĨā§āĻ¯ āĻšāĻ˛ āĻ¯ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻ¸ā§‡āĻ•āĻŽāĻĒ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ†āĻœāĻ“ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤

xt_bpf

āĻāĻ–āĻ¨ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻœāĻ—āĻ¤ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ•āĨ¤

āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ: āĻ…āĻ¨ā§‡āĻ• āĻ†āĻ—ā§‡, 2007 āĻ¸āĻžāĻ˛ā§‡, āĻŽā§‚āĻ˛ āĻ›āĻŋāĻ˛ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻŽāĻĄāĻŋāĻ‰āĻ˛ xt_u32 āĻ¨ā§‡āĻŸāĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĨ¤ āĻāĻŸāĻŋ āĻ†āĻ°āĻ“ āĻĒā§āĻ°āĻžāĻšā§€āĻ¨ āĻŸā§āĻ°āĻžāĻĢāĻŋāĻ• āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻĢāĻžāĻ¯āĻŧāĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĻā§ƒāĻļā§āĻ¯ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ cls_u32 āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ¸āĻšāĻœ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒāĻ—ā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ iptables-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻšāĻžāĻ°ā§‡ āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ: āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻĨā§‡āĻ•ā§‡ 32 āĻŦāĻŋāĻŸ āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ‰āĻĒāĻ° āĻĒāĻžāĻŸāĻŋāĻ—āĻŖāĻŋāĻ¤ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻ¨ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ,

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

āĻ†āĻ‡āĻĒāĻŋ āĻšā§‡āĻĄāĻžāĻ°ā§‡āĻ° 32 āĻŦāĻŋāĻŸ āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§‡, āĻĒā§āĻ¯āĻžāĻĄāĻŋāĻ‚ 6 āĻĨā§‡āĻ•ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ¸ā§āĻ• āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡ 0xFF (āĻ˛ā§‹ āĻŦāĻžāĻ‡āĻŸ āĻ¨āĻŋāĻ¨)āĨ¤ āĻāĻ‡ āĻŽāĻžāĻ  protocol āĻ†āĻ‡āĻĒāĻŋ āĻšā§‡āĻĄāĻžāĻ° āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ 1 (ICMP) āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°āĻŋāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽā§‡ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻšā§‡āĻ• āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°āĻ•ā§‡āĻ“ āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ @ - X āĻŦāĻžāĻ‡āĻŸ āĻĄāĻžāĻ¨āĻĻāĻŋāĻ•ā§‡ āĻ¸āĻ°āĻžāĻ¨āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¨āĻŋāĻ¯āĻŧāĻŽ

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

TCP āĻ¸āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸ āĻ¨āĻŽā§āĻŦāĻ° āĻ¸āĻŽāĻžāĻ¨ āĻ¨āĻž āĻšāĻ˛ā§‡ āĻšā§‡āĻ• āĻ•āĻ°ā§‡ 0x29. āĻ†āĻŽāĻŋ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻā§‡ āĻ¯āĻžāĻŦ āĻ¨āĻž, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ¯ā§‡ āĻšāĻžāĻ¤ā§‡ āĻāĻ‡ āĻœāĻžāĻ¤ā§€āĻ¯āĻŧ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻ—ā§āĻ˛āĻŋ āĻ˛ā§‡āĻ–āĻž āĻ–ā§āĻŦ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻ¨āĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ā§‡ BPF - āĻ­ā§āĻ˛ā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄ, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¸āĻš āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ˛āĻŋāĻ™ā§āĻ• āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ xt_u32. āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻļā§‡āĻˇā§‡ āĻ˛āĻŋāĻ™ā§āĻ•āĻ—ā§āĻ˛āĻŋāĻ“ āĻĻā§‡āĻ–ā§āĻ¨āĨ¤

2013 āĻ¸āĻžāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻŽāĻĄāĻŋāĻ‰āĻ˛ā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻŽāĻĄāĻŋāĻ‰āĻ˛ xt_u32 āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ BPF āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ xt_bpf. āĻ¯ā§‡ āĻ•ā§‡āĻ‰ āĻāĻ‡ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻĒāĻĄāĻŧā§‡āĻ›ā§‡āĻ¨ āĻ¤āĻžāĻĻā§‡āĻ° āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻāĻ° āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻ¨ā§€āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤: iptables āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ BPF āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄ āĻšāĻžāĻ˛āĻžāĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ‡āĻ°āĻ•āĻŽ:

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 āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ†āĻ°āĻ“ āĻœāĻŸāĻŋāĻ˛ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻ¸ā§āĻ¨ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄāĻĢā§‡āĻ¯āĻŧāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§‡āĻ–āĻŋāĨ¤ āĻ¸āĻŽā§āĻĒā§āĻ°āĻ¤āĻŋ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¤āĻžāĻ°āĻž āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ 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" āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡ āĻ…āĻ¨

āĻāĻ•āĻŸā§ āĻĒāĻ°ā§‡, āĻ•ā§āĻ˛āĻžāĻ‰āĻĄāĻĢā§‡āĻ¯āĻŧāĻžāĻ° 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,
...

āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻ†āĻ° āĻ•ā§āĻ˛āĻžāĻ‰āĻĄāĻĢā§‡āĻ¯āĻŧāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ›ā§‡ āĻ¨āĻž xt_bpf, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ¤āĻžāĻ°āĻž XDP-āĻ¤ā§‡ āĻšāĻ˛ā§‡ āĻ—ā§‡āĻ›ā§‡ - BPF āĻāĻ° āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ, āĻĻā§‡āĻ–ā§āĻ¨āĨ¤ L4Drop: XDP DDoS āĻĒā§āĻ°āĻļāĻŽāĻ¨.

cls_bpf

āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻļā§‡āĻˇ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻ˛ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻĢāĻžāĻ¯āĻŧāĻžāĻ° cls_bpf āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ āĻŸā§āĻ°āĻžāĻĢāĻŋāĻ• āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ āĻ¸āĻžāĻŦāĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯, ā§¨ā§Ļā§§ā§Š āĻ¸āĻžāĻ˛ā§‡āĻ° āĻļā§‡āĻˇā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ§āĻžāĻ°āĻŖāĻžāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻžāĻšā§€āĻ¨āĻ•ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ cls_u32.

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻ¨ āĻ•āĻžāĻœā§‡āĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŦ āĻ¨āĻž cls_bpf, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻœā§āĻžāĻžāĻ¨ā§‡āĻ° āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ•ā§‹āĻŖ āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻŋāĻ›ā§āĻ‡ āĻĻā§‡āĻŦā§‡ āĻ¨āĻž - āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤ āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ BPF āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻž āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻžāĻ§āĻŋāĻ•āĻŦāĻžāĻ° āĻāĻ‡ āĻļā§āĻ°ā§‡āĻŖāĻŋāĻŦāĻĻā§āĻ§āĻ•āĻžāĻ°ā§€āĻ° āĻ¸āĻžāĻĨā§‡ āĻĻā§‡āĻ–āĻž āĻ•āĻ°āĻŦāĨ¤

āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻ¨āĻž āĻŦāĻ˛āĻžāĻ° āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻ•āĻžāĻ°āĻŖ āĻ— cls_bpf āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ˛, āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨ā§āĻĄā§‡āĻĄ āĻŦāĻŋāĻĒāĻŋāĻāĻĢā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ, āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻĒā§āĻ°āĻ¯ā§‹āĻœā§āĻ¯āĻ¤āĻžāĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻ†āĻŽā§‚āĻ˛ āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤: āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ•ā§āĻ¯āĻžāĻ˛ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻžāĨ¤

āĻ¤āĻžāĻ‡ āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ¸ā§‡āĻ›ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• āĻŦāĻŋāĻĒāĻŋāĻāĻĢāĻ•ā§‡ āĻŦāĻŋāĻĻāĻžāĻ¯āĻŧ āĻœāĻžāĻ¨āĻžāĻ¨ā§‹āĻ° āĻāĻŦāĻ‚ āĻ­āĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻ¤āĻžāĻ•āĻžāĻ¨ā§‹āĻ°āĨ¤

āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻŦāĻŋāĻĻāĻžāĻ¯āĻŧ

āĻ¨āĻŦā§āĻŦāĻ‡ āĻĻāĻļāĻ•ā§‡āĻ° āĻ—ā§‹āĻĄāĻŧāĻžāĻ° āĻĻāĻŋāĻ•ā§‡ āĻŦāĻŋāĻ•āĻļāĻŋāĻ¤ BPF āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻ• āĻļāĻ¤āĻžāĻŦā§āĻĻā§€āĻ° āĻāĻ• āĻšāĻ¤ā§āĻ°ā§āĻĨāĻžāĻ‚āĻļ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻŦā§‡āĻāĻšā§‡ āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻļā§‡āĻˇ āĻ…āĻŦāĻ§āĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ—ā§‡āĻ›ā§‡ āĻ¤āĻž āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–ā§‡āĻ›āĻŋāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ• āĻŽā§‡āĻļāĻŋāĻ¨ āĻĨā§‡āĻ•ā§‡ RISC-āĻ¤ā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ, āĻ¯āĻž āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF-āĻāĻ° āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‡āĻ°āĻŖāĻž āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛, 32-āĻāĻ° āĻĻāĻļāĻ•ā§‡ 64-āĻŦāĻŋāĻŸ āĻĨā§‡āĻ•ā§‡ XNUMX-āĻŦāĻŋāĻŸ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF āĻ…āĻĒā§āĻ°āĻšāĻ˛āĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF-āĻāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ–ā§āĻŦ āĻ¸ā§€āĻŽāĻŋāĻ¤, āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ° āĻ›āĻžāĻĄāĻŧāĻžāĻ“ - BPF āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ°āĻžāĻœā§āĻ¯ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨ā§‡āĻ‡, āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ā§‡āĻ° āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻ¨ā§‡āĻ‡, āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻ¨ā§‡āĻ‡ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡, āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻĒāĻĄāĻŧāĻž āĻ›āĻžāĻĄāĻŧāĻž sk_buff āĻāĻŦāĻ‚ āĻ¸āĻšāĻœāĻ¤āĻŽ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ¨āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤

āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡, āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• BPF-āĻāĻ° āĻ¯āĻž āĻ…āĻŦāĻļāĻŋāĻˇā§āĻŸ āĻ†āĻ›ā§‡ āĻ¤āĻž āĻšāĻ˛ API āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸, āĻāĻŦāĻ‚ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡āĻ° āĻ­āĻŋāĻ¤āĻ°ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ, āĻ¤āĻž āĻ¸āĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻŦāĻž seccomp āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°, āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸā§‡, āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨ā§āĻĄā§‡āĻĄ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ (āĻ†āĻŽāĻ°āĻž āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ āĻŋāĻ• āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻ˜āĻŸā§‡ āĻ¸ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦāĨ¤)

āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°ā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ 2013 āĻ¸āĻžāĻ˛ā§‡, āĻ¯āĻ–āĻ¨ āĻ†āĻ˛ā§‡āĻ•ā§āĻ¸āĻŋ āĻ¸ā§āĻŸāĻžāĻ°āĻ­āĻ¯āĻŧā§‡āĻŸāĻ­ āĻāĻ•āĻŸāĻŋ BPF āĻ†āĻĒāĻĄā§‡āĻŸ āĻ¸ā§āĻ•āĻŋāĻŽ āĻĒā§āĻ°āĻ¸ā§āĻ¤āĻžāĻŦ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ā§‡āĻ¨āĨ¤ 2014 āĻ¸āĻžāĻ˛ā§‡ āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻĒā§āĻ¯āĻžāĻš āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡ āĻŽā§‚āĻ˛ā§‡ āĻ¯āĻ¤āĻĻā§‚āĻ° āĻ†āĻŽāĻŋ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ, āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻžāĻŸāĻŋ āĻ›āĻŋāĻ˛ 64-āĻŦāĻŋāĻŸ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻ†āĻ°āĻ“ āĻĻāĻ•ā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ° āĻāĻŦāĻ‚ JIT āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛āĻžāĻ°āĻ•ā§‡ āĻ…āĻĒā§āĻŸāĻŋāĻŽāĻžāĻ‡āĻœ āĻ•āĻ°āĻž, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻāĻ‡ āĻ…āĻĒā§āĻŸāĻŋāĻŽāĻžāĻ‡āĻœā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…āĻ§ā§āĻ¯āĻžāĻ¯āĻŧā§‡āĻ° āĻ¸ā§‚āĻšāĻ¨āĻž āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤

āĻāĻ‡ āĻ¸āĻŋāĻ°āĻŋāĻœā§‡āĻ° āĻ†āĻ°āĻ“ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āĻ¯ āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•āĻ­āĻžāĻ° āĻ•āĻ°āĻŦā§‡, āĻ¯āĻž āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ BPF, āĻ¤āĻžāĻ°āĻĒāĻ° āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ BPF āĻāĻŦāĻ‚ āĻāĻ–āĻ¨ āĻ•ā§‡āĻŦāĻ˛ BPF āĻ¨āĻžāĻŽā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤āĨ¤

āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸

  1. āĻ¸ā§āĻŸāĻŋāĻ­ā§‡āĻ¨ āĻŽā§āĻ¯āĻžāĻ•āĻ•ā§āĻ¯āĻžāĻ¨ āĻāĻŦāĻ‚ āĻ­ā§āĻ¯āĻžāĻ¨ āĻœā§āĻ¯āĻžāĻ•āĻŦāĻ¸āĻ¨, "āĻĻā§āĻ¯ āĻŦāĻŋāĻāĻ¸āĻĄāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°: āĻ‡āĻ‰āĻœāĻžāĻ°-āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ•ā§āĻ¯āĻžāĻĒāĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°", 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 āĻŽā§āĻ¯āĻžāĻš āĻŸāĻŋāĻ‰āĻŸā§‹āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛.
  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. āĻāĻ•āĻŸāĻŋ seccomp āĻ“āĻ­āĻžāĻ°āĻ­āĻŋāĻ‰: 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. āĻĒāĻ˛ āĻšā§‡āĻ‡āĻ—āĻ¨āĻ¨, "āĻ¸ā§āĻŸā§āĻ°ā§‡āĻ¸ --āĻ¸ā§‡āĻ•āĻŽāĻĒ-āĻŦāĻŋāĻĒāĻŋāĻāĻĢ: āĻ† āĻ˛ā§āĻ• āĻ†āĻ¨ā§āĻĄāĻžāĻ° āĻĻā§āĻ¯ āĻšā§āĻĄ", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨