เชจเชพเชจเชพเช“ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชถเซ‚เชจเซเชฏ: เช•เซเชฒเชพเชธเชฟเช• BPF

เชฌเชฐเซเช•เชฒเซ‡ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเซเชธ (BPF) เช เชเช• Linux เช•เชฐเซเชจเชฒ เชŸเซ‡เช•เชจเซ‹เชฒเซ‹เชœเซ€ เช›เซ‡ เชœเซ‡ เช›เซ‡เชฒเซเชฒเชพ เช˜เชฃเชพ เชตเชฐเซเชทเซ‹เชฅเซ€ เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เชญเชพเชทเชพเชจเชพ เชŸเซ‡เช• เชชเซเชฐเช•เชพเชถเชจเซ‹เชจเชพ เชชเชนเซ‡เชฒเชพ เชชเชพเชจเชพ เชชเชฐ เช›เซ‡. เช•เซ‹เชจเซเชซเชฐเชจเซเชธ BPF เชจเชพ เช‰เชชเชฏเซ‹เช— เช…เชจเซ‡ เชตเชฟเช•เชพเชธ เชชเชฐเชจเชพ เช…เชนเซ‡เชตเชพเชฒเซ‹เชฅเซ€ เชญเชฐเซ‡เชฒเซ€ เช›เซ‡. เชกเซ‡เชตเชฟเชก เชฎเชฟเชฒเชฐ, เชฒเชฟเชจเช•เซเชธ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชฌเชธเชฟเชธเซเชŸเชฎ เชœเชพเชณเชตเชจเชพเชฐ, Linux Plumbers 2018 เชชเชฐ เชคเซ‡เชฎเชจเซ€ เชตเชพเชค เช•เชนเซ‡ เช›เซ‡ "เช† เชšเชฐเซเชšเชพ XDP เชตเชฟเชถเซ‡ เชจเชฅเซ€" (XDP เช BPF เชฎเชพเชŸเซ‡ เชเช• เช‰เชชเชฏเซ‹เช—เชจเซ‹ เช•เซ‡เชธ เช›เซ‡). เชฌเซเชฐเซ‡เชจเซเชกเชจ เช—เซเชฐเซ‡เช— เชนเช•เชฆเชพเชฐ เชตเชพเชฐเซเชคเชพเชฒเชพเชช เช†เชชเซ‡ เช›เซ‡ Linux BPF เชธเซเชชเชฐเชชเชพเชตเชฐ. Toke Hรธiland-Jรธrgensen เชนเชธเซ‡ เช›เซ‡เช•เซ‡ เช•เชฐเซเชจเชฒ เชนเชตเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เช•เชฐเซเชจเชฒ เช›เซ‡. เชฅเซ‹เชฎเชธ เช—เซเชฐเชพเชซ เช† เชตเชฟเชšเชพเชฐเชจเซ‡ เชชเซเชฐเซ‹เชคเซเชธเชพเชนเชจ เช†เชชเซ‡ เช›เซ‡ BPF เช•เชฐเซเชจเชฒ เชฎเชพเชŸเซ‡ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ เช›เซ‡.

Habrรฉ เชชเชฐ เชนเชœเซ เชชเชฃ BPF เชจเซเช‚ เช•เซ‹เชˆ เชตเซเชฏเชตเชธเซเชฅเชฟเชค เชตเชฐเซเชฃเชจ เชจเชฅเซ€, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชฒเซ‡เช–เซ‹เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เชนเซเช‚ เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€เชจเชพ เช‡เชคเชฟเชนเชพเชธ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถ, เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช…เชจเซ‡ เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถ เช…เชจเซ‡ BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เช•เซเชทเซ‡เชคเซเชฐเซ‹ เช…เชจเซ‡ เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธเชจเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพ เช†เชชเซ€เชถ. เช† เชฒเซ‡เช–, เชถเซ‚เชจเซเชฏ, เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚, เช•เซเชฒเชพเชธเชฟเช• BPF เชจเชพ เช‡เชคเชฟเชนเชพเชธ เช…เชจเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‡ เช•เชนเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชจเชพ เชธเช‚เชšเชพเชฒเชจ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹เชจเชพ เชฐเชนเชธเซเชฏเซ‹ เชชเชฃ เชœเชฃเชพเชตเซ‡ เช›เซ‡. tcpdump, seccomp, strace, เช…เชจเซ‡ เช˜เชฃเซเช‚ เชฌเชงเซเช‚.

BPF เชจเชพ เชตเชฟเช•เชพเชธเชจเซ‡ Linux เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช— เชธเชฎเซเชฆเชพเชฏ เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, BPF เชจเซ€ เชฎเซเช–เซเชฏ เชตเชฐเซเชคเชฎเชพเชจ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เชธเชพเชฅเซ‡ @eucariot, เชฎเซ‡เช‚ เชฎเชนเชพเชจ เชถเซเชฐเซ‡เชฃเซ€เชจเชพ เชฎเชพเชจเชฎเชพเช‚ เชถเซเชฐเซ‡เชฃเซ€เชจเซ‡ โ€œเชจเชพเชจเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ BPFโ€ เช•เชนเซ€ "เชจเชพเชจเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เชจเซ‡เชŸเชตเชฐเซเช•เซเชธ".

เชฌเซ€เชชเซ€เชเชซเชจเชพ เช‡เชคเชฟเชนเชพเชธเชฎเชพเช‚ เชŸเซ‚เช‚เช•เซ‹ เช…เชญเซเชฏเชพเชธเช•เซเชฐเชฎ(c)

เช†เชงเซเชจเชฟเช• BPF เชŸเซ‡เช•เซเชจเซ‰เชฒเซ‰เชœเซ€ เช เชœ เชจเชพเชฎเชจเซ€ เชœเซ‚เชจเซ€ เชŸเซ‡เช•เซเชจเซ‰เชฒเซ‰เชœเซ€เชจเซเช‚ เชธเซเชงเชพเชฐเซ‡เชฒเซเช‚ เช…เชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เชตเชฐเซเชเชจ เช›เซ‡, เชœเซ‡เชจเซ‡ เชฎเซ‚เช‚เชเชตเชฃ เชŸเชพเชณเชตเชพ เชฎเชพเชŸเซ‡ เชนเชตเซ‡ เช•เซเชฒเชพเชธเชฟเช• BPF เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡. เช•เซเชฒเชพเชธเชฟเช• BPF เชจเชพ เช†เชงเชพเชฐเซ‡ เชเช• เชœเชพเชฃเซ€เชคเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ tcpdump, เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ seccomp, เชคเซ‡เชฎเชœ เช“เช›เชพ เชœเชพเชฃเซ€เชคเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ xt_bpf เชฎเชพเชŸเซ‡ iptables เช…เชจเซ‡ เชตเชฐเซเช—เซ€เช•เซƒเชค cls_bpf. เช†เชงเซเชจเชฟเช• เชฒเชฟเชจเช•เซเชธเชฎเชพเช‚, เช•เซเชฒเชพเชธเชฟเช• BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชจเชตเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชจเซเชตเชพเชฆเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชœเซ‹ เช•เซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€, API เชธเซเชฅเชพเชจเซ‡ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡ เช•เซเชฒเชพเชธเชฟเช• BPF เชฎเชพเชŸเซ‡ เชจเชตเชพ เช‰เชชเชฏเซ‹เช—เซ‹, เชœเซ‡เชฎ เช•เซ‡ เช†เชชเชฃเซ‡ เช† เชฒเซ‡เช–เชฎเชพเช‚ เชœเซ‹เชˆเชถเซเช‚, เชนเชœเซ เชชเชฃ เชœเซ‹เชตเชพ เชฎเชณเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡. เช† เช•เชพเชฐเชฃเซ‹เชธเชฐ, เช…เชจเซ‡ เช เชชเชฃ เช•เชพเชฐเชฃ เช•เซ‡ Linux เชฎเชพเช‚ เช•เซเชฒเชพเชธเชฟเช•เชฒ BPF เชจเชพ เชตเชฟเช•เชพเชธเชจเชพ เช‡เชคเชฟเชนเชพเชธเชจเซ‡ เช…เชจเซเชธเชฐเซ€เชจเซ‡, เชคเซ‡ เชธเซเชชเชทเซเชŸ เชฅเชˆ เชœเชถเซ‡ เช•เซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชจเซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเชพ เช†เชงเซเชจเชฟเช• เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชตเชฟเช•เชธเชฟเชค เชฅเชฏเซเช‚, เชฎเซ‡เช‚ เช•เซเชฒเชพเชธเชฟเช•เชฒ BPF เชตเชฟเชถเซ‡เชจเชพ เชฒเซ‡เช– เชธเชพเชฅเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚.

เช›เซ‡เชฒเซเชฒเซ€ เชธเชฆเซ€เชจเชพ เชเช‚เชธเซ€เชจเชพ เชฆเชพเชฏเช•เชพเชจเชพ เช…เช‚เชคเชฎเชพเช‚, เชชเซเชฐเช–เซเชฏเชพเชค เชฒเซ‹เชฐเซ‡เชจเซเชธ เชฌเชฐเซเช•เชฒเซ‡ เชฒเซ‡เชฌเซ‹เชฐเซ‡เชŸเชฐเซ€เชจเชพ เช‡เชœเชจเซ‡เชฐเซ‹เชจเซ‡ เช›เซ‡เชฒเซเชฒเซ€ เชธเชฆเซ€เชจเชพ เชเช‚เชธเซ€เชจเชพ เชฆเชพเชฏเช•เชพเชจเชพ เช…เช‚เชคเชฎเชพเช‚ เช†เชงเซเชจเชฟเช• เชเชตเชพ เชนเชพเชฐเซเชกเชตเซ‡เชฐ เชชเชฐ เชจเซ‡เชŸเชตเชฐเซเช• เชชเซ‡เช•เซ‡เชŸเซเชธเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเซเช‚ เชคเซ‡ เชชเซเชฐเชถเซเชจเชฎเชพเช‚ เชฐเชธ เชชเชกเซเชฏเซ‹. เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช—เชจเซ‹ เชฎเซ‚เชณ เชตเชฟเชšเชพเชฐ, เชฎเซ‚เชณ เชฐเซ‚เชชเซ‡ CSPF (CMU/เชธเซเชŸเซ‡เชจเชซเซ‹เชฐเซเชก เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐ) เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€เชฎเชพเช‚ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เชคเซ‡ เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซ€ เชตเชนเซ‡เชฒเซ€ เชคเช•เซ‡ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ‹ เชนเชคเซ‹, เชเชŸเชฒเซ‡ เช•เซ‡. เช•เชฐเซเชจเชฒ เชธเซเชชเซ‡เชธเชฎเชพเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช† เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชกเซ‡เชŸเชพเชจเซ€ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เชจเช•เชฒ เช•เชฐเชตเชพเชจเซเช‚ เชŸเชพเชณเซ‡ เช›เซ‡. เช•เชฐเซเชจเชฒ เชœเช—เซเชฏเชพเชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช•เซ‹เชก เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฐเชจเชŸเชพเช‡เชฎ เชธเซเชฐเช•เซเชทเชพ เชชเซ‚เชฐเซ€ เชชเชพเชกเชตเชพ เชฎเชพเชŸเซ‡, เชธเซ‡เชจเซเชกเชฌเซ‹เช•เซเชธเชตเชพเชณเซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹.

เชœเซ‹ เช•เซ‡, เชนเชพเชฒเชจเชพ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเซ‹ เชธเซเชŸเซ‡เช•-เช†เชงเชพเชฐเชฟเชค เชฎเชถเซ€เชจเซ‹ เชชเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชกเชฟเชเชพเช‡เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เช…เชจเซ‡ เชจเชตเซ€ RISC เชฎเชถเซ€เชจเซ‹ เชชเชฐ เชคเซ‡เชŸเชฒเซ€ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ เชšเชพเชฒเชคเซ€ เชจ เชนเชคเซ€. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชฌเชฐเซเช•เชฒเซ‡ เชฒเซ‡เชฌเซเชธเชจเชพ เชเชจเซเชœเชฟเชจเชฟเชฏเชฐเซ‹เชจเชพ เชชเซเชฐเชฏเชคเซเชจเซ‹ เชฆเซเชตเชพเชฐเชพ, เชจเชตเซ€ BPF (เชฌเชฐเซเช•เชฒเซ‡ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเซเชธ) เชคเช•เชจเซ€เช• เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชœเซ‡เชจเซเช‚ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ Motorola 6502 เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชนเชคเซเช‚ - เชœเซ‡เชฎ เช•เซ‡ เชœเชพเชฃเซ€เชคเชพ เช‰เชคเซเชชเชพเชฆเชจเซ‹เชจเซเช‚ เชตเชฐเซเช•เชนเซ‹เชฐเซเชธ. เชเชชเชฒ II เช…เชฅเชตเชพ เชเชจเชˆเชเชธ. เชจเชตเชพ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเซ‡ เชนเชพเชฒเชจเชพ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธเชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚ เชซเชฟเชฒเซเชŸเชฐ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฆเชธ เช—เชฃเซเช‚ เชตเชงเชพเชฐเซเชฏเซเช‚ เช›เซ‡.

BPF เชฎเชถเซ€เชจ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ

เช…เชฎเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชจเซ‡, เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชˆเชถเซเช‚. เชœเซ‹ เช•เซ‡, เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เชฎเชถเซ€เชจเชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชธเซเชฒเชญ เชฌเซ‡ 32-เชฌเซ€เชŸ เชฐเชœเชฟเชธเซเชŸเชฐ เชนเชคเชพ, เชเช• เชธเช‚เชšเชฏเช• A เช…เชจเซ‡ เชˆเชจเซเชกเซ‡เช•เซเชธ เชฐเชœเซ€เชธเซเชŸเชฐ X, 64 เชฌเชพเช‡เชŸเซเชธ เชฎเซ‡เชฎเชฐเซ€ (16 เชถเชฌเซเชฆเซ‹), เชฒเซ‡เช–เชจ เช…เชจเซ‡ เช…เชจเซเช—เชพเชฎเซ€ เชตเชพเช‚เชšเชจ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡, เช…เชจเซ‡ เช† เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถเซ‹เชจเซ€ เชเช• เชจเชพเชจเซ€ เชธเชฟเชธเซเชŸเชฎ. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚ เชถเชฐเชคเซ€ เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเช“ เชฒเชพเช—เซ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชชเชฃ เช‰เชชเชฒเชฌเซเชง เชนเชคเซ€, เชชเชฐเช‚เชคเซ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เชธเชฎเชฏเชธเชฐ เชชเซ‚เชฐเซเชฃเชคเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡, เช•เซ‚เชฆเช•เชพ เชฎเชพเชคเซเชฐ เช†เช—เชณ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฒเซ‚เชชเซเชธ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเชจเชพเชˆ เชนเชคเซ€.

เชฎเชถเซ€เชจ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชฏเซ‹เชœเชจเชพ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฎเชพเชŸเซ‡ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช•เชฐเซเชจเชฒ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ (เชœเซ‡เชฎ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ), เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡เชŸเชฒเชพเช•เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช‡เชตเซ‡เชจเซเชŸ เชœเชจเชฐเซ‡เชŸเชฐ เชชเชฐ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช‡เชตเซ‡เชจเซเชŸ เช เชจเซ‡เชŸเชตเชฐเซเช• เช•เชพเชฐเซเชก เชชเชฐเชจเชพ เช†เช—เชฒเชพ เชชเซ‡เช•เซ‡เชŸเชจเซเช‚ เช†เช—เชฎเชจ เช›เซ‡). เชœเซเชฏเชพเชฐเซ‡ เช•เซ‹เชˆ เช˜เชŸเชจเชพ เชฌเชจเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เช•เชฐเซเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเซ‡ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฆเซเชญเชพเชทเชฟเชฏเชพเชฎเชพเช‚), เช…เชจเซ‡ เชฎเชถเซ€เชจ เชฎเซ‡เชฎเชฐเซ€เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช•เซ‡เชŸเชฒเชพเช•เชจเซ‡ เช•เชฐเซเชจเชฒ เชฎเซ‡เชฎเชฐเซ€ เชชเซเชฐเชฆเซ‡เชถ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช‡เชจเช•เชฎเชฟเช‚เช— เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชกเซ‡เชŸเชพ).

เช‰เชชเชฐเซ‹เช•เซเชค เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชœเซ‹เชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชนเชถเซ‡: เช…เชฎเซ‡ เชธเชฟเชธเซเชŸเชฎ เช…เชจเซ‡ เช•เชฎเชพเชจเซเชก เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชธเชพเชฅเซ‡ เชœเชฐเซ‚เชฐเซ€ เชคเชฐเซ€เช•เซ‡ เชชเชฐเชฟเชšเชฟเชค เชฅเชˆเชถเซเช‚. เชœเซ‹ เชคเชฎเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ€ เช•เชฎเชพเชจเซเชก เชธเชฟเชธเซเชŸเชฎเชจเซ‹ เชคเชพเชคเซเช•เชพเชฒเชฟเช• เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชคเชฎเชพเชฎ เช•เซเชทเชฎเชคเชพเช“ เชตเชฟเชถเซ‡ เชœเชพเชฃเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ เชคเชฎเซ‡ เชฎเซ‚เชณ เชฒเซ‡เช– เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹. BSD เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐ เช…เชจเซ‡/เช…เชฅเชตเชพ เชซเชพเช‡เชฒเชจเซ‹ เชชเซเชฐเชฅเชฎ เช…เชฐเซเชง เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ/networking/filter.txt เช•เชฐเซเชจเชฒ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชฎเชพเช‚เชฅเซ€. เชตเชงเซเชฎเชพเช‚, เชคเชฎเซ‡ เชชเซเชฐเชธเซเชคเซเชคเชฟเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ libpcap: เชชเซ‡เช•เซ‡เชŸ เช•เซ‡เชชเซเชšเชฐ เชฎเชพเชŸเซ‡ เชเช• เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช…เชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชชเชฆเซเชงเชคเชฟ, เชœเซ‡เชฎเชพเช‚ BPF เชจเชพ เชฒเซ‡เช–เช•เซ‹ เชชเซˆเช•เซ€เชจเชพ เชเช• McCanne, เชธเชฐเซเชœเชจเชจเชพ เช‡เชคเชฟเชนเชพเชธ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ‡ เช›เซ‡ libpcap.

เช…เชฎเซ‡ Linux เชชเชฐ เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เชคเชฎเชพเชฎ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพ เช†เช—เชณ เชตเชงเซ€เช เช›เซ€เช: tcpdump (libpcap), seccomp, xt_bpf, cls_bpf.

tcpdump

BPF เชจเซ‹ เชตเชฟเช•เชพเชธ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชซเซเชฐเชจเซเชŸเชเชจเซเชกเชจเชพ เชตเชฟเช•เชพเชธ เชธเชพเชฅเซ‡ เชธเชฎเชพเช‚เชคเชฐ เชฐเซ€เชคเซ‡ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ - เชเช• เชœเชพเชฃเซ€เชคเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ tcpdump. เช…เชจเซ‡, เช˜เชฃเชพ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซเชธ เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เช† เชธเซŒเชฅเซ€ เชœเซ‚เชจเซเช‚ เช…เชจเซ‡ เชธเซŒเชฅเซ€ เชชเซเชฐเช–เซเชฏเชพเชค เช‰เชฆเชพเชนเชฐเชฃ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€เชจเซ‹ เช…เชฎเชพเชฐเซ‹ เช…เชญเซเชฏเชพเชธ เชถเชฐเซ‚ เช•เชฐเซ€เชถเซเช‚.

(เชฎเซ‡เช‚ เช† เชฒเซ‡เช–เชจเชพ เชคเชฎเชพเชฎ เช‰เชฆเชพเชนเชฐเชฃเซ‹ Linux เชชเชฐ เชšเชฒเชพเชตเซเชฏเชพ เช›เซ‡ 5.6.0-rc6. เช•เซ‡เชŸเชฒเชพเช• เช†เชฆเซ‡เชถเซ‹เชจเซเช‚ เช†เช‰เชŸเชชเซเชŸ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เชคเซ‡ เชฎเชพเชŸเซ‡ เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡.)

เช‰เชฆเชพเชนเชฐเชฃ: IPv6 เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซเช‚ เช…เชตเชฒเซ‹เช•เชจ

เชšเชพเชฒเซ‹ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ€เช เช•เซ‡ เช†เชชเชฃเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐเชจเชพ เชคเชฎเชพเชฎ IPv6 เชชเซ‡เช•เซ‡เชŸเซ‹ เชœเซ‹เชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช eth0. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเซ€ เชถเช•เซ€เช เช›เซ€เช tcpdump เชธเชฐเชณ เชซเชฟเชฒเซเชŸเชฐ เชธเชพเชฅเซ‡ ip6:

$ sudo tcpdump -i eth0 ip6

เช†เชฎ tcpdump เชซเชฟเชฒเซเชŸเชฐ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ‡ เช›เซ‡ ip6 BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฌเชพเชฏเชŸเซ‡เช•เซ‹เชกเชฎเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒ เชชเชฐ เชฎเซ‹เช•เชฒเซ‹ (เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชตเชฟเช—เชคเซ‹ เชœเซเช“ Tcpdump: เชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡). เชฒเซ‹เชก เช•เชฐเซ‡เชฒ เชซเชฟเชฒเซเชŸเชฐ เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชคเชพ เชฆเชฐเซ‡เช• เชชเซ‡เช•เซ‡เชŸ เชฎเชพเชŸเซ‡ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ eth0. เชœเซ‹ เชซเชฟเชฒเซเชŸเชฐ เชฌเชฟเชจ-เชถเซ‚เชจเซเชฏ เชฎเซ‚เชฒเซเชฏ เช†เชชเซ‡ เช›เซ‡ n, เชชเช›เซ€ เชธเซเชงเซ€ n เชชเซ‡เช•เซ‡เชŸเชจเชพ เชฌเชพเชˆเชŸ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เช•เซ‹เชชเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‡ เช†เช‰เชŸเชชเซเชŸเชฎเชพเช‚ เชœเซ‹เชˆเชถเซเช‚ tcpdump.

เชจเชพเชจเชพเช“ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชถเซ‚เชจเซเชฏ: เช•เซเชฒเชพเชธเชฟเช• BPF

เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เช†เชชเชฃเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชถเซ‹เชงเซ€ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เช•เชฐเซเชจเชฒ เชชเชฐ เช•เชฏเซ‹ เชฌเชพเชฏเชŸเซ‡เช•เซ‹เชก เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ tcpdump เชจเซ€ เชฎเชฆเชฆ เชธเชพเชฅเซ‡ tcpdump, เชœเซ‹ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‡ เชตเชฟเช•เชฒเซเชช เชธเชพเชฅเซ‡ เชšเชฒเชพเชตเซ€เช -d:

$ sudo tcpdump -i eth0 -d ip6
(000) ldh      [12]
(001) jeq      #0x86dd          jt 2    jf 3
(002) ret      #262144
(003) ret      #0

เชถเซ‚เชจเซเชฏ เชฒเชพเช‡เชจ เชชเชฐ เช†เชชเชฃเซ‡ เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเซ€เช เช›เซ€เช ldh [12], เชœเซ‡ "เชฒเซ‹เชก เช‡เชจ เชฐเชœเซ€เชธเซเชŸเชฐ" เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡ A เช…เชกเชงเซ‹ เชถเชฌเซเชฆ (16 เชฌเชฟเชŸเซเชธ) เชธเชฐเชจเชพเชฎเชพเช‚ 12 เชชเชฐ เชธเซเชฅเชฟเชค เช›เซ‡โ€ เช…เชจเซ‡ เชเช•เชฎเชพเชคเซเชฐ เชชเซเชฐเชถเซเชจ เช เช›เซ‡ เช•เซ‡ เช†เชชเชฃเซ‡ เช•เชฏเชพ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชฎเซ‡เชฎเชฐเซ€เชจเซ‡ เชธเช‚เชฌเซ‹เชงเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช? เชœเชตเชพเชฌ เช›เซ‡ เช•เซ‡ เชฎเซ x เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡ (x+1)เชตเชฟเชถเซเชฒเซ‡เชทเชฟเชค เชจเซ‡เชŸเชตเชฐเซเช• เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชฎเซ€ เชฌเชพเชˆเชŸ. เช…เชฎเซ‡ เชˆเชฅเชฐเชจเซ‡เชŸ เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชชเซ‡เช•เซ‡เชŸเซ‹ เชตเชพเช‚เชšเซ€เช เช›เซ€เช eth0, เช…เชจเซ‡ เช† เช…เชฐเซเชฅเช•เซ‡ เชชเซ‡เช•เซ‡เชŸ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ (เชธเชฐเชณเชคเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชงเชพเชฐเซ€เช เช›เซ€เช เช•เซ‡ เชชเซ‡เช•เซ‡เชŸเชฎเชพเช‚ เช•เซ‹เชˆ VLAN เชŸเซ…เช—เซเชธ เชจเชฅเซ€):

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

เชคเซ‡เชฅเซ€ เช†เชฆเซ‡เชถเชจเซ‹ เช…เชฎเชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€ ldh [12] เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ A เชเช• เช•เซเชทเซ‡เชคเซเชฐ เชนเชถเซ‡ Ether Type โ€” เช† เชˆเชฅเชฐเชจเซ‡เชŸ เชซเซเชฐเซ‡เชฎเชฎเชพเช‚ เชชเซเชฐเชธเชพเชฐเชฟเชค เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชชเซเชฐเช•เชพเชฐ. เชฒเซ€เชŸเซ€ 1 เชชเชฐ เช…เชฎเซ‡ เชฐเชœเซ€เชธเซเชŸเชฐเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ€เช เช›เซ€เช A (เชชเซ‡เช•เซ‡เชœ เชชเซเชฐเช•เชพเชฐ) c 0x86dd, เช…เชจเซ‡ เช† เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เช›เซ‡ เช…เชฎเชจเซ‡ เชœเซ‡ เชชเซเชฐเช•เชพเชฐเชฎเชพเช‚ เชฐเซเชšเชฟ เช›เซ‡ เชคเซ‡ IPv6 เช›เซ‡. เชฒเชพเช‡เชจ 1 เชชเชฐ, เชธเชฐเช–เชพเชฎเชฃเซ€ เช†เชฆเซ‡เชถ เช‰เชชเชฐเชพเช‚เชค, เชคเซเชฏเชพเช‚ เชตเชงเซ เชฌเซ‡ เช•เซ‰เชฒเชฎ เช›เซ‡ - jt 2 ะธ jf 3 - เชœเซ‹ เชธเชฐเช–เชพเชฎเชฃเซ€ เชธเชซเชณ เชฅเชพเชฏ เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เชœเซ‡ เชšเชฟเชนเซเชจเซ‹ เชชเชฐ เชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (A == 0x86dd) เช…เชจเซ‡ เช…เชธเชซเชณ. เชคเซ‡เชฅเซ€, เชธเชซเชณ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ (IPv6) เช†เชชเชฃเซ‡ เชฒเชพเช‡เชจ 2 เชชเชฐ เชœเชˆเช เช›เซ€เช, เช…เชจเซ‡ เช…เชธเชซเชณ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ - เชฒเชพเช‡เชจ 3 เชชเชฐ. เชฒเชพเช‡เชจ 3 เชชเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‹เชก 0 เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡ (เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชจเช•เชฒ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚), เชฒเชพเช‡เชจ 2 เชชเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‹เชก เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. 262144 (เชฎเชจเซ‡ เชฎเชนเชคเซเชคเชฎ 256 เช•เชฟเชฒเซ‹เชฌเชพเช‡เชŸ เชชเซ‡เช•เซ‡เชœเชจเซ€ เชจเช•เชฒ เช•เชฐเซ‹).

เชตเชงเซ เชœเชŸเชฟเชฒ เช‰เชฆเชพเชนเชฐเชฃ: เช…เชฎเซ‡ เช—เช‚เชคเชตเซเชฏ เชชเซ‹เชฐเซเชŸ เชฆเซเชตเชพเชฐเชพ TCP เชชเซ‡เช•เซ‡เชŸเซ‹ เชœเซ‹เชˆเช เช›เซ€เช

เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เชœเซ‡ เชคเชฎเชพเชฎ TCP เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เช—เช‚เชคเชตเซเชฏ เชชเซ‹เชฐเซเชŸ 666 เชธเชพเชฅเซ‡ เชจเช•เชฒ เช•เชฐเซ‡ เช›เซ‡. เช…เชฎเซ‡ IPv4 เช•เซ‡เชธเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเชถเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ IPv6 เช•เซ‡เชธ เชธเชฐเชณ เช›เซ‡. เช† เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชคเชฎเซ‡ เชเช• เช•เชธเชฐเชค เชคเชฐเซ€เช•เซ‡ เชœเชพเชคเซ‡ IPv6 เชซเชฟเชฒเซเชŸเชฐเชจเซเช‚ เช…เชจเซเชตเซ‡เชทเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ (ip6 and tcp dst port 666) เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช•เซ‡เชธ เชฎเชพเชŸเซ‡ เชซเชฟเชฒเซเชŸเชฐ (tcp dst port 666). เชคเซ‡เชฅเซ€, เช…เชฎเชจเซ‡ เชœเซ‡ เชซเชฟเชฒเซเชŸเชฐเชฎเชพเช‚ เชฐเชธ เช›เซ‡ เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh      [12]
(001) jeq      #0x800           jt 2    jf 10
(002) ldb      [23]
(003) jeq      #0x6             jt 4    jf 10
(004) ldh      [20]
(005) jset     #0x1fff          jt 10   jf 6
(006) ldxb     4*([14]&0xf)
(007) ldh      [x + 16]
(008) jeq      #0x29a           jt 9    jf 10
(009) ret      #262144
(010) ret      #0

เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เชฒเซ€เชŸเซ€เช“ 0 เช…เชจเซ‡ 1 เชถเซเช‚ เช•เชฐเซ‡ เช›เซ‡. เชฒเชพเช‡เชจ 2 เชชเชฐ เช…เชฎเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชคเชชเชพเชธ เช•เชฐเซ€ เช›เซ‡ เช•เซ‡ เช† IPv4 เชชเซ‡เช•เซ‡เชŸ เช›เซ‡ (เช‡เชฅเชฐ เชชเซเชฐเช•เชพเชฐ = 0x800) เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฐเชœเซ€เชธเซเชŸเชฐเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‹ A เชชเซ‡เช•เซ‡เชŸเชจเซ‹ 24เชฎเซ‹ เชฌเชพเชˆเชŸ. เช…เชฎเชพเชฐเซเช‚ เชชเซ‡เช•เซ‡เชœ เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡

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

เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เช†เชชเชฃเซ‡ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ€เช เช›เซ€เช A IP เชนเซ‡เชกเชฐเชจเซเช‚ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช•เซเชทเซ‡เชคเซเชฐ, เชœเซ‡ เชคเชพเชฐเซเช•เชฟเช• เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช†เชชเชฃเซ‡ เชซเช•เซเชค TCP เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช. เช…เชฎเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเชพเชฅเซ‡ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเซ€เช เช›เซ€เช 0x6 (IPPROTO_TCP) เชฒเชพเช‡เชจ 3 เชชเชฐ.

4 เช…เชจเซ‡ 5 เชฒเซ€เชŸเซ€เช“ เชชเชฐ เช†เชชเชฃเซ‡ เชเชกเซเชฐเซ‡เชธ 20 เชชเชฐ เชธเซเชฅเชฟเชค เชนเชพเชซเชตเชฐเซเชกเซเชธ เชฒเซ‹เชก เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช jset เชคเซเชฐเชฃเชฎเชพเช‚เชฅเซ€ เชเช• เชธเซ‡เชŸ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ‹ เชงเซเชตเชœ - เชœเชพเชฐเซ€ เช•เชฐเชพเชฏเซ‡เชฒ เชฎเชพเชธเซเช• เชชเชนเซ‡เชฐเซ€เชจเซ‡ jset เชคเซเชฐเชฃ เชธเซŒเชฅเซ€ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฌเชฟเชŸเซเชธ เชธเชพเชซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซเชฐเชฃเชฎเชพเช‚เชฅเซ€ เชฌเซ‡ เชฌเชฟเชŸเซเชธ เช…เชฎเชจเซ‡ เชœเชฃเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชถเซเช‚ เชชเซ‡เช•เซ‡เชŸ เช–เช‚เชกเชฟเชค IP เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชญเชพเช— เช›เซ‡, เช…เชจเซ‡ เชœเซ‹ เชเชฎ เชนเซ‹เชฏ เชคเซ‹, เชถเซเช‚ เชคเซ‡ เช›เซ‡เชฒเซเชฒเซ‹ เชŸเซเช•เชกเซ‹ เช›เซ‡. เชคเซเชฐเซ€เชœเซ‹ เชฌเซ€เชŸ เช†เชฐเช•เซเชทเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชถเซ‚เชจเซเชฏ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช. เช…เชฎเซ‡ เช…เชชเซ‚เชฐเซเชฃ เช…เชฅเชตเชพ เชคเซ‚เชŸเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชคเชชเชพเชธเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชคเซเชฐเชฃเซ‡เชฏ เชฌเชฟเชŸเซเชธ เชคเชชเชพเชธเซ€เช เช›เซ€เช.

เช† เชธเซ‚เชšเชฟเชฎเชพเช‚ เชฒเชพเช‡เชจ 6 เชธเซŒเชฅเซ€ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡. เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ ldxb 4*([14]&0xf) เชเชŸเชฒเซ‡ เช•เซ‡ เช…เชฎเซ‡ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ€เช เช›เซ€เช X 4 เชตเชกเซ‡ เช—เซเชฃเชพเช•เชพเชฐ เช•เชฐเซ‡เชฒ เชชเซ‡เช•เซ‡เชŸเชจเชพ เชชเช‚เชฆเชฐเชฎเชพ เชฌเชพเชˆเชŸเชจเชพ เชธเซŒเชฅเซ€ เช“เช›เชพ เชฎเชนเชคเซเชตเชจเชพ เชšเชพเชฐ เชฌเชฟเชŸเซเชธ. เชชเช‚เชฆเชฐเชฎเชพ เชฌเชพเชˆเชŸเชจเชพ เชธเซŒเชฅเซ€ เช“เช›เชพ เชฎเชนเชคเซเชตเชจเชพ เชšเชพเชฐ เชฌเชฟเชŸเซเชธ เช เชซเซ€เชฒเซเชก เช›เซ‡ เชˆเชจเซเชŸเชฐเชจเซ‡เชŸ เชนเซ‡เชกเชฐเชจเซ€ เชฒเช‚เชฌเชพเชˆ IPv4 เชนเซ‡เชกเชฐ, เชœเซ‡ เชนเซ‡เชกเชฐเชจเซ€ เชฒเช‚เชฌเชพเชˆเชจเซ‡ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เชชเช›เซ€ 4 เชตเชกเซ‡ เช—เซเชฃเชพเช•เชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฐเชธเชชเซเชฐเชฆ เชฐเซ€เชคเซ‡, เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ 4*([14]&0xf) เช–เชพเชธ เชเชกเซเชฐเซ‡เชธเชฟเช‚เช— เชธเซเช•เซ€เชฎ เชฎเชพเชŸเซ‡เชจเซ‹ เชนเซ‹เชฆเซเชฆเซ‹ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชซเช•เซเชค เช† เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชฐเชœเชฟเชธเซเชŸเชฐ เชฎเชพเชŸเซ‡ เชœ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡ X, เชเชŸเชฒเซ‡ เช•เซ‡ เช…เชฎเซ‡ เชชเชฃ เช•เชนเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ ldb 4*([14]&0xf) เชจ เชคเซ‹ ldxb 5*([14]&0xf) (เช…เชฎเซ‡ เชฎเชพเชคเซเชฐ เชเช• เช…เชฒเช— เช‘เชซเชธเซ‡เชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, ldxb 4*([16]&0xf)). เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เช† เชธเช‚เชฌเซ‹เชงเชจ เชฏเซ‹เชœเชจเชพ BPF เชฎเชพเช‚ เชšเซ‹เช•เซเช•เชธ เชฐเซ€เชคเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ X (เช‡เชจเซเชกเซ‡เช•เซเชธ เชฐเชœเชฟเชธเซเชŸเชฐ) IPv4 เชนเซ‡เชกเชฐเชจเซ€ เชฒเช‚เชฌเชพเชˆ.

เชคเซ‡เชฅเซ€ เชฒเซ€เชŸเซ€ 7 เชชเชฐ เช†เชชเชฃเซ‡ เช…เชกเชงเชพ เชถเชฌเซเชฆเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช เช›เซ€เช (X+16). เชฏเชพเชฆ เชฐเชพเช–เชตเซเช‚ เช•เซ‡ 14 เชฌเชพเช‡เชŸเซเชธ เช‡เชฅเชฐเชจเซ‡เชŸ เชนเซ‡เชกเชฐ เชฆเซเชตเชพเชฐเชพ เช•เชฌเชœเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ X IPv4 เชนเซ‡เชกเชฐเชจเซ€ เชฒเช‚เชฌเชพเชˆ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช…เชฎเซ‡ เชธเชฎเชœเซ€เช เช›เซ€เช เช•เซ‡ เชฎเชพเช‚ A TCP เช—เช‚เชคเชตเซเชฏ เชชเซ‹เชฐเซเชŸ เชฒเซ‹เชก เชฅเชฏเซ‡เชฒ เช›เซ‡:

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

เช›เซ‡เชฒเซเชฒเซ‡, เชฒเซ€เชŸเซ€ 8 เชชเชฐ เช†เชชเชฃเซ‡ เช—เช‚เชคเชตเซเชฏ เชชเซ‹เชฐเซเชŸเชจเซ‡ เช‡เชšเซเช›เชฟเชค เชฎเซ‚เชฒเซเชฏ เชธเชพเชฅเซ‡ เชธเชฐเช–เชพเชตเซ€เช เช›เซ€เช เช…เชจเซ‡ 9 เช•เซ‡ 10 เชฒเซ€เชŸเซ€ เชชเชฐ เช†เชชเชฃเซ‡ เชชเชฐเชฟเชฃเชพเชฎ เชชเชฐเชค เช•เชฐเซ€เช เช›เซ€เช - เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชจเช•เชฒ เช•เชฐเชตเซ€ เช•เซ‡ เชจเชนเซ€เช‚.

Tcpdump: เชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช…เช—เชพเช‰เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚, เช…เชฎเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช— เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ BPF เชฌเชพเช‡เชŸเช•เซ‹เชก เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเซ‹เชก เช•เชฐเซ€เช เช›เซ€เช เชคเซ‡เชจเชพ เชชเชฐ เชตเชฟเช—เชคเชตเชพเชฐ เชงเซเชฏเชพเชจ เช†เชชเซเชฏเซเช‚ เชจเชฅเซ€. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เชนเซ€เช เชคเซ‹, tcpdump เช˜เชฃเซ€ เชธเชฟเชธเซเชŸเชฎเซ‹ เชชเชฐ เชชเซ‹เชฐเซเชŸเซ‡เชก เช…เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ tcpdump เชชเซเชธเซเชคเช•เชพเชฒเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ libpcap. เชธเช‚เช•เซเชทเชฟเชชเซเชคเชฎเชพเช‚, เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชซเชฟเชฒเซเชŸเชฐ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡ libpcap, เชคเชฎเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเชพ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  • เชเช• เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‹ pcap_t เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชจเชพเชฎ เชชเชฐเชฅเซ€: pcap_create,
  • เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชธเช•เซเชฐเชฟเชฏ เช•เชฐเซ‹: pcap_activate,
  • เช•เชฎเซเชชเชพเช‡เชฒ เชซเชฟเชฒเซเชŸเชฐ: pcap_compile,
  • เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ‹: pcap_setfilter.

เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ pcap_setfilter Linux เชฎเชพเช‚ เช…เชฎเชฒเชฎเชพเช‚, เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช strace (เช•เซ‡เชŸเชฒเซ€เช• เชฒเซ€เชŸเซ€เช“ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡):

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

เช†เช‰เชŸเชชเซเชŸเชจเซ€ เชชเซเชฐเชฅเชฎ เชฌเซ‡ เชฒเซ€เชŸเซ€เช“ เชชเชฐ เช†เชชเชฃเซ‡ เชฌเชจเชพเชตเซ€เช เช›เซ€เช เช•เชพเชšเซ‹ เชธเซ‹เช•เซ‡เชŸ เชคเชฎเชพเชฎ เชˆเชฅเชฐเชจเซ‡เชŸ เชซเซเชฐเซ‡เชฎ เชตเชพเช‚เชšเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชตเชพ เชฎเชพเชŸเซ‡ eth0. เชฅเซ€ เช…เชฎเชพเชฐเซเช‚ เชชเซเชฐเชฅเชฎ เช‰เชฆเชพเชนเชฐเชฃ เช†เชชเชฃเซ‡ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เชซเชฟเชฒเซเชŸเชฐ 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 เชฎเชพเช‚ Linux เชฎเชพเช‚ เชธเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชคเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชตเชฐเซเช•เชนเซ‹เชฐเซเชธ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ libpcap เช•เซ‹เชˆเชชเชฃ เช–เชพเชธ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชตเชฟเชจเชพ (เชฒเชฟเชจเช•เซเชธ-เชตเชฟเชถเชฟเชทเซเชŸ เชซเซ‡เชฐเชซเชพเชฐเซ‹, เช…เชฒเชฌเชคเซเชค, เชคเซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เช“เช เชตเซˆเชถเซเชตเชฟเช• เชšเชฟเชคเซเชฐ เชฌเชฆเชฒเซเชฏเซเช‚ เชจเชฅเซ€). เชชเซเชฐเชฅเชฎ เช—เช‚เชญเซ€เชฐ เชธเช‚เช•เซ‡เชคเซ‹ เช•เซ‡ BPF เชตเชฟเช•เชธเชฟเชค เชฅเชถเซ‡ 2011 เชฎเชพเช‚, เชœเซเชฏเชพเชฐเซ‡ เชเชฐเชฟเช• เชกเซเชฎเชพเชเซ‡เชŸเซ‡ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซ‚เช•เซเชฏเซ‹ เชชเซ‡เชš, เชœเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชœเชธเซเชŸ เชˆเชจ เชŸเชพเชˆเชฎ เช•เชฎเซเชชเชพเชˆเชฒเชฐ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡ - BPF เชฌเชพเชˆเชŸเช•เซ‹เชกเชจเซ‡ เชฎเซ‚เชณเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช…เชจเซเชตเชพเชฆเช• x86_64 เช•เซ‹เชก

JIT เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เชธเชพเช‚เช•เชณเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เชนเชคเซเช‚: 2012 เชฎเชพเช‚ เชฆเซ‡เช–เชพเชฏเชพ เชฎเชพเชŸเซ‡ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฒเช–เชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชธเซ‡เช•เชฎเซเชช, BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชœเชพเชจเซเชฏเซเช†เชฐเซ€ 2013 เชฎเชพเช‚ เชนเชคเซ‹ เช‰เชฎเซ‡เชฐเซเชฏเซเช‚ เชฎเซ‹เชกเซเชฏเซเชฒ xt_bpf, เชœเซ‡ เชคเชฎเชจเซ‡ เชจเชฟเชฏเชฎเซ‹ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ iptables BPF เชจเซ€ เชฎเชฆเชฆ เชธเชพเชฅเซ‡, เช…เชจเซ‡ เช“เช•เซเชŸเซ‹เชฌเชฐ 2013 เชฎเชพเช‚ เชนเชคเซ€ เช‰เชฎเซ‡เชฐเซเชฏเซเช‚ เชเช• เชฎเซ‹เชกเซเชฏเซเชฒ เชชเชฃ cls_bpf, เชœเซ‡ เชคเชฎเชจเซ‡ BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเชพเชซเชฟเช• เชตเชฐเซเช—เซ€เช•เชฐเชฃ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡.

เช…เชฎเซ‡ เช† เชคเชฎเชพเชฎ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‡ เชŸเซ‚เช‚เช• เชธเชฎเชฏเชฎเชพเช‚ เชตเชงเซ เชตเชฟเช—เชคเชฎเชพเช‚ เชœเซ‹เชˆเชถเซเช‚, เชชเชฐเช‚เชคเซ เชชเซเชฐเชฅเชฎ เชคเซ‡ เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ BPF เชฎเชพเชŸเซ‡ เชฎเชจเชธเซเชตเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ เช…เชจเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเชตเชพ เชคเซ‡ เชถเซ€เช–เชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เช•เซเชทเชฎเชคเชพเช“ libpcap เชฎเชฐเซเชฏเชพเชฆเชฟเชค (เชธเชฐเชณ เช‰เชฆเชพเชนเชฐเชฃ: เชซเชฟเชฒเซเชŸเชฐ เชœเชจเชฐเซ‡เชŸ libpcap เชซเช•เซเชค เชฌเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเชฐเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ - 0 เช…เชฅเชตเชพ 0x40000) เช…เชฅเชตเชพ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชœเซ‡เชฎ เช•เซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชชเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฒเชพเช—เซ เชชเชกเชคเซเช‚ เชจเชฅเซ€.

เช†เชชเชฃเชพ เชชเซ‹เชคเชพเชจเชพ เชนเชพเชฅเชฅเซ€ 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))

เชฎเชถเซ€เชจ เช•เซ‹เชกเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชตเชพ เช เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชคเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชกเชฟเชฌเช—เซ€เช‚เช— เชฎเชพเชŸเซ‡, เชเช•เชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ, เชนเซ‡เชฌเซเชฐเซ‡ เชชเชฐ เชฒเซ‡เช–เซ‹ เชฒเช–เชตเชพ เชตเช—เซ‡เชฐเซ‡). เชธเช—เชตเชก เชฎเชพเชŸเซ‡, เชซเชพเช‡เชฒเชฎเชพเช‚ <linux/filter.h> เชนเซ‡เชฒเซเชชเชฐ เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ - เช‰เชชเชฐเซ‹เช•เซเชค เชธเชฎเชพเชจ เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€ เชถเช•เชพเชฏ เช›เซ‡

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

เชœเซ‹ เช•เซ‡, เช† เชตเชฟเช•เชฒเซเชช เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เชจเชฅเซ€. เช† เชคเซ‡ เช›เซ‡ เชœเซ‡ Linux เช•เชฐเซเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเซ‹เช เชคเชฐเซเช• เช†เชชเซเชฏเซ‹ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ 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, เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เช† เชตเชฟเชญเชพเช—เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เช•เชฐเซเชฏเซเช‚ เชนเชคเซเช‚.

Linux เช…เชจเซ‡ netsniff-ng เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ

เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค BPF เช‰เชชเชฐเชพเช‚เชค, Linux เช…เชจเซ‡ tools/bpf/bpf_asm เช†เชงเชพเชฐ เช…เชจเซ‡ เชฌเชฟเชจ-เชฎเชพเชจเช• เชธเชฎเซ‚เชน. เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เชธเซ‚เชšเชจเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเชพเชณเช–เชพเชจเชพ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ struct sk_buff, เชœเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชจเซ‡เชŸเชตเชฐเซเช• เชชเซ‡เช•เซ‡เชŸเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เช…เชจเซเชฏ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชธเชนเชพเชฏเช• เชธเซ‚เชšเชจเชพเช“ เชชเชฃ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ ldw cpu เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชถเซ‡ A เช•เชฐเซเชจเชฒ เชซเช‚เช•เซเชถเชจ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ raw_smp_processor_id(). (BPF เชจเชพ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚, เชฎเซ‡เชฎเชฐเซ€, เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เช…เชจเซ‡ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒ เชธเชนเชพเชฏเช•เซ‹เชจเชพ เชธเชฎเซ‚เชน เชธเชพเชฅเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชฌเชฟเชจ-เชฎเชพเชจเช• เชเช•เซเชธเซเชŸเซ‡เชจเซเชถเชจเซเชธเชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡.) เช…เชนเซ€เช‚ เชซเชฟเชฒเซเชŸเชฐเชจเซเช‚ เชเช• เชฐเชธเชชเซเชฐเชฆ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชซเช•เซเชค เช•เซ‹เชชเซ€ เช•เชฐเซ€เช เช›เซ€เช. เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชœเช—เซเชฏเชพเชฎเชพเช‚ เชชเซ‡เช•เซ‡เชŸ เชนเซ‡เชกเชฐเซ‹ poff, เชชเซ‡เชฒเซ‹เชก เช“เชซเชธเซ‡เชŸ:

ld poff
ret a

BPF เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€ tcpdump, เชชเชฐเช‚เชคเซ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชชเซ‡เช•เซ‡เชœเชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชตเชพเชจเซเช‚ เช† เชเช• เชธเชพเชฐเซเช‚ เช•เชพเชฐเชฃ เช›เซ‡ netsniff-ng, เชœเซ‡, เช…เชจเซเชฏ เชตเชธเซเชคเซเช“เชจเซ€ เชธเชพเชฅเซ‡, เชเช• เช…เชฆเซเชฏเชคเชจ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชงเชฐเชพเชตเซ‡ เช›เซ‡ netsniff-ng, เชœเซ‡, BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพ เช‰เชชเชฐเชพเช‚เชค, เช…เชธเชฐเช•เชพเชฐเช• เชŸเซเชฐเชพเชซเชฟเช• เชœเชจเชฐเซ‡เชŸเชฐ เชชเชฃ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชจเชพ เช•เชฐเชคเชพ เชตเชงเซ เช…เชฆเซเชฏเชคเชจ tools/bpf/bpf_asm, เชเช• BPF เชเชธเซ‡เชฎเซเชฌเชฒเชฐเชจเซ‡ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ bpfc. เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚ เช–เซ‚เชฌ เชตเชฟเช—เชคเชตเชพเชฐ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹ เช›เซ‡, เชฒเซ‡เช–เชจเชพ เช…เช‚เชคเซ‡ เชฒเชฟเช‚เช•เซเชธ เชชเชฃ เชœเซเช“.

เชธเซ‡เช•เชฎเซเชช

เชคเซ‡เชฅเซ€, เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เชฎเชจเชธเซเชตเซ€ เชœเชŸเชฟเชฒเชคเชพเชจเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ เช…เชจเซ‡ เชจเชตเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ€เช, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชฅเชฎ เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€ เช›เซ‡, เชœเซ‡ BPF เชซเชฟเชฒเซเชŸเชฐเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เช‰เชชเชฒเชฌเซเชง เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชฆเชฒเซ€เชฒเซ‹เชจเชพ เชธเซ‡เชŸ เช…เชจเซ‡ เชธเซ‡เชŸเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เช†เชชเซ‡เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชตเช‚เชถเชœเซ‹.

seccomp เชจเซเช‚ เชชเซเชฐเชฅเชฎ เชธเช‚เชธเซเช•เชฐเชฃ 2005 เชฎเชพเช‚ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชคเซ‡ เช–เซ‚เชฌ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชจ เชนเชคเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชซเช•เซเชค เชเช• เชœ เชตเชฟเช•เชฒเซเชช เชชเซ‚เชฐเซ‹ เชชเชพเชกเซ‡ เช›เซ‡ - เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเชพ เชธเซ‡เชŸเชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเชตเชพ: read, write, exit ะธ sigreturn, เช…เชจเซ‡ เชจเชฟเชฏเชฎเซ‹เชจเซเช‚ เช‰เชฒเซเชฒเช‚เช˜เชจ เช•เชฐเชคเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชนเชคเซเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ SIGKILL. เชœเซ‹ เช•เซ‡, 2012 เชฎเชพเช‚, seccomp เช BPF เชซเชฟเชฒเซเชŸเชฐเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช‰เชฎเซ‡เชฐเซ€, เชœเซ‡เชจเชพเชฅเซ€ เชคเชฎเซ‡ เชฎเชพเชจเซเชฏ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเชพ เชธเชฎเซ‚เชนเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชฆเชฒเซ€เชฒเซ‹ เชชเชฐ เชคเชชเชพเชธ เชชเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. (เชฐเชธเชชเซเชฐเชฆ เชตเชพเชค เช เช›เซ‡ เช•เซ‡, เช•เซเชฐเซ‹เชฎ เช† เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเชพ เชชเซเชฐเชฅเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชฎเชพเช‚เชจเซเช‚ เชเช• เชนเชคเซเช‚, เช…เชจเซ‡ เช•เซเชฐเซ‹เชฎ เชฒเซ‹เช•เซ‹ เชนเชพเชฒเชฎเชพเช‚ BPF เชจเชพ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃ เชชเชฐ เช†เชงเชพเชฐเชฟเชค KRSI เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ เชตเชฟเช•เชธเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡ เช…เชจเซ‡ Linux เชธเซเชฐเช•เซเชทเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซเชธเชจเซ‡ เช•เชธเซเชŸเชฎเชพเช‡เช เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.) เชตเชงเชพเชฐเชพเชจเชพ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เชจเซ€ เชฒเชฟเช‚เช•เซเชธ เช…เช‚เชคเซ‡ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡. เชฒเซ‡เช–เชจเชพ.

เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชนเชฌ เชชเชฐ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชฒเซ‡เช–เซ‹ เช›เซ‡, เช•เชฆเชพเชš เช•เซ‹เชˆ เชคเซ‡เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชชเซ‡เชŸเชพเชตเชฟเชญเชพเช—เซ‹ เชตเชพเช‚เชšเชคเชพ เชชเชนเซ‡เชฒเชพ (เช…เชฅเชตเชพ เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡) เชตเชพเช‚เชšเชตเชพ เชฎเชพเช‚เช—เชถเซ‡. เชฒเซ‡เช–เชฎเชพเช‚ เช•เชจเซเชŸเซ‡เชจเชฐ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ: seccomp seccomp เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชชเซ‚เชฐเชพ เชชเชพเชกเซ‡ เช›เซ‡, เชฌเช‚เชจเซ‡ 2007 เชธเช‚เชธเซเช•เชฐเชฃ เช…เชจเซ‡ BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเช‚เชธเซเช•เชฐเชฃ (เชซเชฟเชฒเซเชŸเชฐเซเชธ libseccomp เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชจเชฐเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡), เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡ seccomp เชจเชพ เชœเซ‹เชกเชพเชฃ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เช˜เชฃเซ€ เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชฟเช‚เช•เซเชธ เชชเชฃ เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. เชฒเซ‡เช–เชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎเซเชก เชธเชพเชฅเซ‡ เชกเชฟเชฎเชจเซเชธเชจเซ‡ เช…เชฒเช— เช•เชฐเชตเซเช‚ เช…เชฅเชตเชพ "เชคเชฎเชจเซ‡ เช† เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€!" เชคเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเซเชฒเซ‡เช•เชฒเชฟเชธเซเชŸเซเชธ เช…เชฅเชตเชพ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเซ€ เชตเซเชนเชพเช‡เชŸเชฒเชฟเชธเซเชŸเซเชธ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒ เชกเชฟเชฎเชจ เชฎเชพเชŸเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‰เชฎเซ‡เชฐเชตเซ€.

เช†เช—เชณ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเชถเซเช‚ เช•เซ‡ เชซเชฟเชฒเซเชŸเชฐเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพ seccomp เชเช•เชฆเชฎ เชธเซ€เชฎเชพเช‚ เช…เชจเซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ libseccomp เช…เชจเซ‡ เชฆเชฐเซ‡เช• เชตเชฟเช•เชฒเซเชชเชจเชพ เชซเชพเชฏเชฆเชพ เช…เชจเซ‡ เช—เซ‡เชฐเชซเชพเชฏเชฆเชพ เชถเซเช‚ เช›เซ‡, เช…เชจเซ‡ เช…เช‚เชคเซ‡, เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชธเซ‡เช•เช•เซ‹เชฎเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ strace.

เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชฎเชพเชŸเซ‡ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฒเช–เชตเซเช‚ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเซเช‚

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ เชคเซ‡ เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชœเชพเชฃเซ€เช เช›เซ€เช, เชคเซ‹ เชšเชพเชฒเซ‹ เชชเชนเซ‡เชฒเชพ seccomp เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชœเซ‹เชˆเช. เชคเชฎเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเซเชคเชฐ เชชเชฐ เชซเชฟเชฒเซเชŸเชฐ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชจเซ‡ เชคเชฎเชพเชฎ เชฌเชพเชณ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชชเซเชฐเชคเชฟเชฌเช‚เชงเซ‹ เชตเชพเชฐเชธเชพเชฎเชพเช‚ เชฎเซ‡เชณเชตเชถเซ‡. เช† เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

เชœเซเชฏเชพเช‚ &filter - เช† เช…เชฎเชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเชฐเชฟเชšเชฟเชค เชฎเชพเชณเช–เซเช‚ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เช›เซ‡ struct sock_fprog, เชเชŸเชฒเซ‡ เช•เซ‡ BPF เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ.

เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชฎเชพเชŸเซ‡เชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชธเซ‹เช•เซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡เชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฅเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชฒเช— เชชเชกเซ‡ เช›เซ‡? เชชเซเชฐเชธเชพเชฐเชฟเชค เชธเช‚เชฆเชฐเซเชญ. เชธเซ‹เช•เซ‡เชŸเซเชธเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชฎเชจเซ‡ เชชเซ‡เช•เซ‡เชŸ เชงเชฐเชพเชตเชคเซ‹ เชฎเซ‡เชฎเชฐเซ€ เชตเชฟเชธเซเชคเชพเชฐ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เช…เชจเซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชชเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเชจเซ‡ เชเช• เชฎเชพเชณเช–เซเช‚ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เชœเซ‡เชฎ เช•เซ‡

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

เชคเซ‡ nr เชฒเซ‹เช‚เชš เชฅเชจเชพเชฐ เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒเชจเซ‹ เชจเช‚เชฌเชฐ เช›เซ‡, arch - เชตเชฐเซเชคเชฎเชพเชจ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ (เชจเซ€เชšเซ‡ เช†เชจเชพ เชชเชฐ เชตเชงเซ), args - เช› เชธเซเชงเซ€ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชฆเชฒเซ€เชฒเซ‹, เช…เชจเซ‡ instruction_pointer เช เชฏเซเชเชฐ เชธเซเชชเซ‡เชธ เชธเซ‚เชšเชจเชพ เชฎเชพเชŸเซ‡ เชเช• เชจเชฟเชฐเซเชฆเซ‡เชถเช• เช›เซ‡ เชœเซ‡เชฃเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒ เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹. เช†เชฎ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชจเช‚เชฌเชฐ เชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ A เช†เชชเชฃเซ‡ เช•เชนเซ‡เชตเซเช‚ เชชเชกเชถเซ‡

ldw [0]

เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฎเชพเชŸเซ‡ เช…เชจเซเชฏ เชธเซเชตเชฟเชงเชพเช“ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชธเช‚เชฆเชฐเซเชญ เชซเช•เซเชค 32-เชฌเซ€เชŸ เช—เซ‹เช เชตเชฃเซ€ เชฆเซเชตเชพเชฐเชพ เชœ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเซ‡ เช…เชกเชงเซ‹ เชถเชฌเซเชฆ เช…เชฅเชตเชพ เชฌเชพเชˆเชŸ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ - เชœเซเชฏเชพเชฐเซ‡ เชซเชฟเชฒเซเชŸเชฐ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชฏ ldh [0] เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ seccomp เชชเชพเช›เชพ เช†เชตเชธเซ‡ EINVAL. เชซเช‚เช•เซเชถเชจ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเชพ เชซเชฟเชฒเซเชŸเชฐเซเชธเชจเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡ seccomp_check_filter() เช•เชฐเซเชจเชฒเซ‹ (เชฎเชœเชพเชจเซ€ เชตเชพเชค เช เช›เซ‡ เช•เซ‡, เชฎเซ‚เชณ เช•เชฎเชฟเชŸเชฎเชพเช‚ เชœเซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชช เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡, เชคเซ‡เช“ เช† เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชธเซ‚เชšเชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เช—เชฏเชพ เชนเชคเชพ. mod (เชตเชฟเชญเชพเช— เชถเซ‡เชท) เช…เชจเซ‡ เชนเชตเซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชช BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฎเชพเชŸเซ‡ เช…เชจเซเชชเชฒเชฌเซเชง เช›เซ‡, เชคเซเชฏเชพเชฐเชฅเซ€ เชคเซ‡เชจเชพ เช‰เชฎเซ‡เชฐเชพเชฅเซ€ เชคเซ‚เชŸเซ€ เชœเชถเซ‡ ABI.)

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เช†เชชเชฃเซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เชตเชพ เช…เชจเซ‡ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชฌเชงเซเช‚ เชœเชพเชฃเซ€เช เช›เซ€เช. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชœเชฟเช• เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเซ€ เชธเชซเซ‡เชฆ เช…เชฅเชตเชพ เช•เชพเชณเซ€ เชธเซ‚เชšเชฟ เชคเชฐเซ€เช•เซ‡ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ

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 Linux เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเชพ เชตเชฐเซเชคเชจเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เช…เชจเชฟเชตเชพเชฐเซเชฏ เชธเชพเชงเชจ เช›เซ‡. เชœเซ‹ เช•เซ‡, เช˜เชฃเชพเช เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชชเชฃ เชธเชพเช‚เชญเชณเซเชฏเซเช‚ เช›เซ‡ เชชเซเชฐเชญเชพเชต เชฎเซเชฆเซเชฆเชพเช“ เช† เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡. เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ strace เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ ptrace(2), เช…เชจเซ‡ เช† เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชฎเชพเช‚ เช†เชชเชฃเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเชพ เช•เชฏเชพ เชธเซ‡เชŸ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชฐเซ‹เช•เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€, เชเชŸเชฒเซ‡ เช•เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช†เชฆเซ‡เชถเซ‹

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

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

ะธ

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

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

เชฒเช—เชญเช— เชคเซ‡ เชœ เชธเชฎเชฏเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‹ เช•เซ‡ เชฌเซ€เชœเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเซ‡ เชซเช•เซเชค เชเช• เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‡ เชŸเซเชฐเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช.

เชจเชตเซ‹ เชตเชฟเช•เชฒเซเชช --seccomp-bpf, เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ strace เชธเช‚เชธเซเช•เชฐเชฃ 5.3, เชคเชฎเชจเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช˜เชฃเซ€ เชตเช–เชค เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชเช• เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเชพ เชŸเซเชฐเซ‡เชธ เชนเซ‡เช เชณ เชธเซเชŸเชพเชฐเซเชŸเช…เชชเชจเซ‹ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชจเชฟเชฏเชฎเชฟเชค เชธเซเชŸเชพเชฐเซเชŸเช…เชชเชจเชพ เชธเชฎเชฏ เชธเชพเชฅเซ‡ เชคเซเชฒเชจเชพเชคเซเชฎเช• เช›เซ‡:

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

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

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

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

(เช…เชนเซ€เช‚, เช…เชฒเชฌเชคเซเชค, เชคเซเชฏเชพเช‚ เชฅเซ‹เชกเซ€ เช›เซ‡เชคเชฐเชชเชฟเช‚เชกเซ€ เช›เซ‡ เช•เซ‡ เช…เชฎเซ‡ เช† เช†เชฆเซ‡เชถเชจเชพ เชฎเซเช–เซเชฏ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‡ เชŸเซเชฐเซ‡เชธ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เชจเชฅเซ€. เชœเซ‹ เช†เชชเชฃเซ‡ เชŸเซเชฐเซ‡เชธ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชค, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, newfsstatเชชเช›เซ€ strace เชคเซ‡เชŸเชฒเซเช‚ เชœ เชธเช–เชค เชฌเซเชฐเซ‡เช• เชฎเชพเชฐเชถเซ‡ --seccomp-bpf.)

เช† เชตเชฟเช•เชฒเซเชช เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡? เชคเซ‡เชจเชพ เชตเชฟเชจเชพ strace เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡ PTRACE_SYSCALL. เชœเซเชฏเชพเชฐเซ‡ เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ (เช•เซ‹เชˆเชชเชฃ) เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เช‡เชถเซเชฏเซ‚ เช•เชฐเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฃเชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ strace, เชœเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ€ เชฆเชฒเซ€เชฒเซ‹ เชœเซเช เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชšเชพเชฒเซ‡ เช›เซ‡ PTRACE_SYSCALL. เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€, เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชซเชฐเซ€เชฅเซ€ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡ strace, เชœเซ‡ เชตเชณเชคเชฐ เชฎเซ‚เชฒเซเชฏเซ‹ เชœเซเช เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡ PTRACE_SYSCALL, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ.

เชจเชพเชจเชพเช“ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชถเซ‚เชจเซเชฏ: เช•เซเชฒเชพเชธเชฟเช• BPF

เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชธเชพเชฅเซ‡, เชœเซ‹ เช•เซ‡, เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช†เชชเชฃเซ‡ เช‡เชšเซเช›เซ€เช เชคเซ‡ เชฐเซ€เชคเซ‡ เชฌเชฐเชพเชฌเชฐ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเซ‡เชฎ เช•เซ‡, เชœเซ‹ เช†เชชเชฃเซ‡ เชซเช•เซเชค เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‡ เชœเซ‹เชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช 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 เช†เชœเซ‡ เชชเชฃ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชฏ เช›เซ‡.

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"

IP เชนเซ‡เชกเชฐเชจเชพ 32 เชฌเชฟเชŸเซเชธ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เชชเซ‡เชกเชฟเช‚เช— 6 เชฅเซ€ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชชเชฐ เชฎเชพเชธเซเช• เชฒเชพเช—เซ เช•เชฐเซ‡ เช›เซ‡ 0xFF (เชฒเซ‹ เชฌเชพเชˆเชŸ เชฒเซ‹). เช† เช•เซเชทเซ‡เชคเซเชฐ protocol IP เชนเซ‡เชกเชฐ เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ 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 เช‰เชชเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชœเชŸเชฟเชฒ เชซเชฟเชฒเซเชŸเชฐเซเชธเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ Cloudfare เชจเชพ เชตเชพเชธเซเชคเชตเชฟเช• เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชœเซ‹เชˆเช. เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชธเซเชงเซ€ เชคเซ‡เช“ เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชนเชคเชพ xt_bpf DDoS เชนเซเชฎเชฒเชพเช“ เชธเชพเชฎเซ‡ เชฐเช•เซเชทเชฃ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡. เชฒเซ‡เช–เชฎเชพเช‚ BPF เชŸเซ‚เชฒเซเชธเชจเซ‹ เชชเชฐเชฟเชšเชฏ เชคเซ‡เช“ เชธเชฎเชœเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡เช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ (เช…เชจเซ‡ เชถเชพ เชฎเชพเชŸเซ‡) BPF เชซเชฟเชฒเซเชŸเชฐเซเชธ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช†เชตเชพ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เชธเชฎเซ‚เชนเชจเซ€ เชฒเชฟเช‚เช•เซเชธ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ bpfgen เชคเชฎเซ‡ เชจเชพเชฎ เชฎเชพเชŸเซ‡ DNS เช•เซเชตเซ‡เชฐเซ€ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชคเซ‹ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ 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 เชฒเชฟเชจเช•เซเชธเชฎเชพเช‚ เชŸเซเชฐเชพเชซเชฟเช• เช•เช‚เชŸเซเชฐเซ‹เชฒ เชธเชฌเชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡, 2013เชจเชพ เช…เช‚เชคเชฎเชพเช‚ เชฒเชฟเชจเช•เซเชธเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชตเซˆเชšเชพเชฐเชฟเช• เชฐเซ€เชคเซ‡ เชชเซเชฐเชพเชšเซ€เชจเชจเซ‡ เชฌเชฆเชฒเซ€เชจเซ‡ cls_u32.

เชœเซ‹ เช•เซ‡, เช…เชฎเซ‡ เชนเชตเซ‡ เช•เชพเชฐเซเชฏเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถเซเช‚ เชจเชนเซ€เช‚ cls_bpf, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซเชฒเชพเชธเชฟเช• BPF เชตเชฟเชถเซ‡เชจเชพ เชœเซเชžเชพเชจเชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€ เช† เช…เชฎเชจเซ‡ เช•เช‚เชˆเชชเชฃ เช†เชชเชถเซ‡ เชจเชนเซ€เช‚ - เช…เชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฌเชงเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชˆ เช—เชฏเชพ เช›เซ€เช. เชตเชงเซเชฎเชพเช‚, เชตเชฟเชธเซเชคเซƒเชค BPF เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชคเชพ เช…เชจเซเช—เชพเชฎเซ€ เชฒเซ‡เช–เซ‹เชฎเชพเช‚, เช…เชฎเซ‡ เช† เชตเชฐเซเช—เซ€เช•เชฐเชฃเช•เชฐเซเชคเชพเชจเซ‡ เชเช• เช•เชฐเชคเชพ เชตเชงเซ เชตเชพเชฐ เชฎเชณเซ€เชถเซเช‚.

เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เชจ เช•เชฐเชตเชพเชจเซเช‚ เชฌเซ€เชœเซเช‚ เช•เชพเชฐเชฃ c cls_bpf เชธเชฎเชธเซเชฏเชพ เช เช›เซ‡ เช•เซ‡, เชตเชฟเชธเซเชคเซƒเชค BPF เชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชฒเชพเช—เซ เชฅเชตเชพเชจเซ‹ เช…เชตเช•เชพเชถ เชงเชฐเชฎเซ‚เชณเชฅเซ€ เชธเช‚เช•เซเชšเชฟเชค เช›เซ‡: เช•เซเชฒเชพเชธเชฟเช•เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‡ เชฌเชฆเชฒเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช…เชจเซ‡ เช•เซ‰เชฒเซเชธ เชตเชšเซเชšเซ‡ เชธเซเชฅเชฟเชคเชฟ เชธเชพเชšเชตเซ€ เชถเช•เชคเชพ เชจเชฅเซ€.

เชคเซ‡เชฅเซ€ เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ‡ เช…เชฒเชตเชฟเชฆเชพ เช•เชนเซ‡เชตเชพเชจเซ‹ เช…เชจเซ‡ เชญเชตเชฟเชทเซเชฏ เชคเชฐเชซ เชงเซเชฏเชพเชจ เช†เชชเชตเชพเชจเซ‹ เช† เชธเชฎเชฏ เช›เซ‡.

เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ‡ เชตเชฟเชฆเชพเชฏ

เช…เชฎเซ‡ เชœเซ‹เชฏเซเช‚ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชจเซ‡เชตเซเช‚เชจเชพ เชฆเชพเชฏเช•เชพเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชตเชฟเช•เชธเชฟเชค เชฅเชฏเซ‡เชฒ BPF เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€, เชเช• เชธเชฆเซ€เชจเชพ เชเช• เช•เซเชตเชพเชฐเซเชŸเชฐ เชธเซเชงเซ€ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชœเซ€เชตเซ€ เช…เชจเซ‡ เช…เช‚เชค เชธเซเชงเซ€ เชจเชตเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชณเซ€. เชœเซ‹ เช•เซ‡, เชธเซเชŸเซ‡เช• เชฎเชถเซ€เชจเซ‹เชฅเซ€ RISC เชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃเชจเซ€ เชœเซ‡เชฎ, เชœเซ‡ เช•เซเชฒเชพเชธเชฟเช• BPF เชจเชพ เชตเชฟเช•เชพเชธ เชฎเชพเชŸเซ‡ เชชเซเชฐเซ‹เชคเซเชธเชพเชนเชจ เชคเชฐเซ€เช•เซ‡ เชธเซ‡เชตเชพ เช†เชชเซ€ เชนเชคเซ€, 32 เชจเชพ เชฆเชพเชฏเช•เชพเชฎเชพเช‚ 64-bit เชฅเซ€ XNUMX-bit เชฎเชถเซ€เชจเซ‹เชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ เชฅเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เช•เซเชฒเชพเชธเชฟเช• BPF เช…เชชเซเชฐเชšเชฒเชฟเชค เชฅเชตเชพ เชฒเชพเช—เซเชฏเซเช‚ เชนเชคเซเช‚. เชตเชงเซเชฎเชพเช‚, เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ€ เช•เซเชทเชฎเชคเชพเช“ เช–เซ‚เชฌ เชœ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช›เซ‡, เช…เชจเซ‡ เชœเซ‚เชจเชพ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช‰เชชเชฐเชพเช‚เชค - เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชชเชฐเชจเชพ เช•เซ‰เชฒเซเชธ เชตเชšเซเชšเซ‡ เชฐเชพเชœเซเชฏ เชฌเชšเชพเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชจเชฅเซ€, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เชธเซ€เชงเซ€ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเซ€ เช•เซ‹เชˆ เชถเช•เซเชฏเชคเชพ เชจเชฅเซ€, เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเซ€ เช•เซ‹เชˆ เชถเช•เซเชฏเชคเชพ เชจเชฅเซ€. เช•เชฐเซเชจเชฒ เชธเชพเชฅเซ‡, เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชซเซ€เชฒเซเชกเซเชธ เชตเชพเช‚เชšเชตเชพ เชธเชฟเชตเชพเชฏ sk_buff เช…เชจเซ‡ เชธเซŒเชฅเซ€ เชธเชฐเชณ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเซเชธ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชฌเชฆเชฒเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€.

เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เชนเชพเชฒเชฎเชพเช‚ Linux เชฎเชพเช‚ เช•เซเชฒเชพเชธเชฟเช• BPF เชจเชพ เชฌเชพเช•เซ€ เชฐเชนเซ‡เชฒ เชคเชฎเชพเชฎ API เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช›เซ‡, เช…เชจเซ‡ เช•เชฐเซเชจเชฒเชจเซ€ เช…เช‚เชฆเชฐ เชคเชฎเชพเชฎ เช•เซเชฒเชพเชธเชฟเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ, เชชเช›เซ€ เชญเชฒเซ‡ เชคเซ‡ เชธเซ‹เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชนเซ‹เชฏ เช•เซ‡ seccomp เชซเชฟเชฒเซเชŸเชฐเซเชธ, เชเช• เชจเชตเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸ, เชตเชฟเชธเซเชคเซƒเชค BPFเชฎเชพเช‚ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชจเซเชตเชพเชฆเชฟเชค เชฅเชพเชฏ เช›เซ‡. (เช† เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชตเชฟเชถเซ‡ เช…เชฎเซ‡ เช†เช—เชฒเชพ เชฒเซ‡เช–เชฎเชพเช‚ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚.)

เชจเชตเชพ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ 2013 เชฎเชพเช‚ เชถเชฐเซ‚ เชฅเชฏเซเช‚, เชœเซเชฏเชพเชฐเซ‡ เชเชฒเซ‡เช•เซเชธเซ€ เชธเซเชŸเชพเชฐเซ‹เชตเซ‹เช‡เชŸเซ‹เชตเซ‡ BPF เช…เชชเชกเซ‡เชŸ เชธเซเช•เซ€เชฎเชจเซ‹ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซ‚เช•เซเชฏเซ‹. 2014 เชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เชชเซ‡เชšเซ‹ เชฆเซ‡เช–เชพเชตเชพ เชฒเชพเช—เซเชฏเชพ เช•เซ‹เชฐ เชฎเชพเช‚. เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชนเซเช‚ เชธเชฎเชœเซเช‚ เช›เซเช‚, เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชฏเซ‹เชœเชจเชพ เชซเช•เซเชค เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช…เชจเซ‡ JIT เช•เชฎเซเชชเชพเชˆเชฒเชฐเชจเซ‡ 64-เชฌเซ€เชŸ เชฎเชถเซ€เชจเซ‹ เชชเชฐ เชตเชงเซ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพเชจเซ€ เชนเชคเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เช† เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเซเชธเซ‡ Linux เชตเชฟเช•เชพเชธเชฎเชพเช‚ เชจเชตเชพ เชชเซเชฐเช•เชฐเชฃเชจเซ€ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€.

เช† เชถเซเชฐเซ‡เชฃเซ€เชจเชพ เช†เช—เชณเชจเชพ เชฒเซ‡เช–เซ‹ เชจเชตเซ€ เชŸเซ‡เช•เชจเซ‹เชฒเซ‹เชœเซ€เชจเชพ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช…เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡เชถเซ‡, เชœเซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เช†เช‚เชคเชฐเชฟเช• 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. เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชตเชฟเชนเช‚เช—เชพเชตเชฒเซ‹เช•เชจ: https://lwn.net/Articles/656307/
  9. https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
  10. habr: เช•เชจเซเชŸเซ‡เชจเชฐ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ: seccomp
  11. habr: systemd เชธเชพเชฅเซ‡ เชกเชฟเชฎเชจเซเชธเชจเซ‡ เช…เชฒเช— เช•เชฐเชตเซเช‚ เช…เชฅเชตเชพ "เชคเชฎเชจเซ‡ เช† เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€!"
  12. เชชเซŒเชฒ เชšเซˆเช—เชจเชจ, "เชธเซเชŸเซเชฐเซ‡เชธ --เชธเซ‡เช•เช•เซ‹เชฎเซเชช-เชฌเซ€เชชเซ€เชเชซ: เช… เชฒเซ‚เช• เช…เชจเซเชกเชฐ เชง เชนเซ‚เชก", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹