เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจœเจผเฉ€เจฐเฉ‹: เจ•เจฒเจพเจธเจฟเจ• BPF

เจฌเจฐเจ•เจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐเจธ (BPF) เจ‡เฉฑเจ• เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจนเฉˆ เจœเฉ‹ เจชเจฟเจ›เจฒเฉ‡ เจ•เจˆ เจธเจพเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€-เจญเจพเจธเจผเจพ เจฆเฉ‡ เจคเจ•เจจเฉ€เจ•เฉ€ เจชเฉเจฐเจ•เจพเจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจชเฉฐเจจเจฟเจ†เจ‚ 'เจคเฉ‡ เจนเฉˆเฅค เจ•เจพเจจเจซเจฐเฉฐเจธเจพเจ‚ เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ…เจคเฉ‡ เจตเจฟเจ•เจพเจธ เจฌเจพเจฐเฉ‡ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจจเจพเจฒ เจญเจฐเฉ€เจ†เจ‚ เจนเฉ‹เจˆเจ†เจ‚ เจนเจจเฅค เจกเฉ‡เจตเจฟเจก เจฎเจฟเจฒเจฐ, เจฒเฉ€เจจเจ•เจธ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเจฌ-เจธเจฟเจธเจŸเจฎ เจฎเฉ‡เจจเจŸเฉ‡เจจเจฐ, เจฒเฉ€เจจเจ•เจธ เจชเจฒเฉฐเจฌเจฐเจœเจผ 2018 'เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจญเจพเจธเจผเจฃ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ "เจ‡เจน เจ—เฉฑเจฒเจฌเจพเจค XDP เจฌเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚ เจนเฉˆ" (XDP BPF เจฒเจˆ เจ‡เฉฑเจ• เจตเจฐเจคเฉ‹เจ‚ เจฆเจพ เจ•เฉ‡เจธ เจนเฉˆ)เฅค เจฌเฉเจฐเฉˆเจ‚เจกเจจ เจ—เฉเจฐเฉ‡เจ— เจจเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจตเจพเจฒเฉ‡ เจญเจพเจธเจผเจฃ เจฆเจฟเฉฑเจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจฌเฉ€เจชเฉ€เจเจซ เจธเฉเจชเจฐเจชเจพเจตเจฐเจœเจผ. เจŸเฉ‹เจ• เจนเฉ‹เจ‡เจฒเฉˆเจ‚เจก-เจœเฉ‹เจฐเจ—เจจเจธเจจ เจนเฉฑเจธเจฆเจพ เจนเฉˆเจ•เจฟ เจ•เจฐเจจเจฒ เจนเฉเจฃ เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจ•เจฐเจจเฉ‡เจฒ เจนเฉˆเฅค เจฅเจพเจฎเจธ เจ—เฉเจฐเจพเจซเจผ เจ‡เจธ เจตเจฟเจšเจพเจฐ เจจเฉ‚เฉฐ เจ‰เจคเจธเจผเจพเจนเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ BPF เจ•เจฐเจจเจฒ เจฒเจˆ เจœเจพเจตเจพเจธเจ•เฉเจฐเจฟเจชเจŸ เจนเฉˆ.

Habrรฉ 'เจคเฉ‡ BPF เจฆเจพ เจ…เจœเฉ‡ เจตเฉ€ เจ•เฉ‹เจˆ เจตเจฟเจตเจธเจฅเจฟเจค เจตเจฐเจฃเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจพเจ‚เจ—เจพ, เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ…เจคเฉ‡ เจตเจฟเจ•เจพเจธ เจธเจพเจงเจจเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เจพ, เจ…เจคเฉ‡ BPF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจ•เจพเจฐเจœ เจ…เจคเฉ‡ เจ…เจญเจฟเจ†เจธ เจฆเฉ‡ เจ–เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ€ เจฐเฉ‚เจชเจฐเฉ‡เจ–เจพ เจฌเจฃเจพเจตเจพเจ‚เจ—เจพเฅค เจ‡เจน เจฒเฉ‡เจ–, เจœเจผเฉ€เจฐเฉ‹, เจฒเฉœเฉ€ เจตเจฟเฉฑเจš, เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจ…เจคเฉ‡ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจจเฉ‚เฉฐ เจฆเฉฑเจธเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ เจฆเฉ‡ เจญเฉ‡เจฆ เจตเฉ€ เจชเฉเจฐเจ—เจŸ เจ•เจฐเจฆเจพ เจนเฉˆเฅค tcpdump, seccomp, strace, เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจฌเจนเฉเจค เจ•เฉเจเฅค

เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจจเฉ‚เฉฐ เจฒเฉ€เจจเจ•เจธ เจจเฉˆเจŸเจตเจฐเจ•เจฟเฉฐเจ— เจ•เจฎเจฟเจŠเจจเจฟเจŸเฉ€ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€เจ†เจ‚ เจฎเฉเฉฑเจ– เจฎเฉŒเจœเฉ‚เจฆเจพ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉˆเจŸเจตเจฐเจ• เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจนเจจ เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ, เจ‡เจœเจพเจœเจผเจค เจจเจพเจฒ @eucariot, เจฎเฉˆเจ‚ เจฎเจนเจพเจจ เจฒเฉœเฉ€ เจฆเฉ‡ เจธเจจเจฎเจพเจจ เจตเจฟเฉฑเจš เจฒเฉœเฉ€ เจจเฉ‚เฉฐ "เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF" เจ•เจฟเจนเจพ "เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ เจจเฉˆเฉฑเจŸเจตเจฐเจ•".

เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจ•เฉ‹เจฐเจธ (c)

เจ†เจงเฉเจจเจฟเจ• BPF เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจ‰เจธเฉ‡ เจจเจพเจฎ เจจเจพเจฒ เจชเฉเจฐเจพเจฃเฉ€ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเจพ เจ‡เฉฑเจ• เจธเฉเจงเจพเจฐเจฟเจ† เจ…เจคเฉ‡ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจฐเฉ‚เจช เจนเฉˆ, เจœเจฟเจธเจจเฉ‚เฉฐ เจนเฉเจฃ เจ‰เจฒเจเจฃ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจฒเจˆ เจ•เจฒเจพเจธเจฟเจ• BPF เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจ‡เฉฑเจ• เจฎเจธเจผเจนเฉ‚เจฐ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฌเจฃเจพเจˆ เจ—เจˆ เจธเฉ€ tcpdump, เจตเจฟเจงเฉ€ seccomp, เจจเจพเจฒ เจนเฉ€ เจ˜เฉฑเจŸ เจœเจพเจฃเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ xt_bpf เจจเฉ‚เฉฐ iptables เจ…เจคเฉ‡ เจตเจฐเจ—เฉ€เจ•เจฐเจฃเจ•เจพเจฐ cls_bpf. เจ†เจงเฉเจจเจฟเจ• เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš, เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเจพ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจจเจตเฉ‡เจ‚ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚, เจเจชเฉ€เจ†เจˆ เจ•เจพเจ‡เจฎ เจนเฉˆ เจ…เจคเฉ‡ เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจ‰เจชเจฏเฉ‹เจ—, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡, เจ…เจœเฉ‡ เจตเฉ€ เจฒเฉฑเจญเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจเฅค เจ‡เจธ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡, เจ…เจคเฉ‡ เจ‡เจน เจตเฉ€ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจ•เจฒเจพเจธเฉ€เจ•เจฒ เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ เจ•เจฟ เจ‡เจน เจ‡เจธเจฆเฉ‡ เจ†เจงเฉเจจเจฟเจ• เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ•เจฟเจตเฉ‡เจ‚ เจ…เจคเฉ‡ เจ•เจฟเจ‰เจ‚ เจตเจฟเจ•เจธเจค เจนเฉ‹เจ‡เจ†, เจฎเฉˆเจ‚ เจ•เจฒเจพเจธเฉ€เจ•เจฒ เจฌเฉ€เจชเฉ€เจเจซ เจฌเจพเจฐเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‡เจ– เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพเฅค

เจชเจฟเจ›เจฒเฉ€ เจธเจฆเฉ€ เจฆเฉ‡ เจ…เฉฑเจธเฉ€เจตเจฟเจ†เจ‚ เจฆเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจฎเจธเจผเจนเฉ‚เจฐ เจฒเจพเจฐเฉˆเจ‚เจธ เจฌเจฐเจ•เจฒเฉ‡ เจฒเฉˆเจฌเจพเจฐเจŸเจฐเฉ€ เจฆเฉ‡ เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐ เจ‡เจธ เจธเจตเจพเจฒ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจธเจจ เจ•เจฟ เจชเจฟเจ›เจฒเฉ€ เจธเจฆเฉ€ เจฆเฉ‡ เจ…เฉฑเจธเฉ€เจตเจฟเจ†เจ‚ เจฆเฉ‡ เจ…เจ–เฉ€เจฐ เจตเจฟเฉฑเจš เจ†เจงเฉเจจเจฟเจ• เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจ‰เฉฑเจคเฉ‡ เจจเฉˆเจŸเจตเจฐเจ• เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจฆเจพ เจฎเฉ‚เจฒ เจตเจฟเจšเจพเจฐ, เจ…เจธเจฒ เจตเจฟเฉฑเจš CSPF (CMU/เจธเจŸเฉˆเจจเจซเฉ‹เจฐเจก เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ) เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจฌเฉ‡เจฒเฉ‹เฉœเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจœเจฟเฉฐเจจเฉ€ เจœเจฒเจฆเฉ€ เจนเฉ‹ เจธเจ•เฉ‡ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจเจพ เจธเฉ€, เจฏเจพเจจเฉ€. เจ•เจฐเจจเจฒ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจฏเฉ‚เจœเจผเจฐ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจฌเฉ‡เจฒเฉ‹เฉœเฉ‡ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจšเจฆเจพ เจนเฉˆเฅค เจ•เจฐเจจเจฒ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจฏเฉ‚เจœเจผเจฐ เจ•เฉ‹เจก เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฐเจจเจŸเจพเจˆเจฎ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธเจก เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจตเจฐเจคเฉ€ เจ—เจˆ เจธเฉ€เฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฎเฉŒเจœเฉ‚เจฆเจพ เจซเจฟเจฒเจŸเจฐเจพเจ‚ เจฒเจˆ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจเจพเจ‚ เจธเจŸเฉˆเจ•-เจ…เจงเจพเจฐเจฟเจค เจฎเจธเจผเฉ€เจจเจพเจ‚ 'เจคเฉ‡ เจšเฉฑเจฒเจฃ เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจ เจ…เจคเฉ‡ เจจเจตเฉ€เจ†เจ‚ RISC เจฎเจธเจผเฉ€เจจเจพเจ‚ 'เจคเฉ‡ เจ•เฉเจธเจผเจฒเจคเจพ เจจเจพเจฒ เจจเจนเฉ€เจ‚ เจšเฉฑเจฒเจฆเฉ€เจ†เจ‚ เจธเจจเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจฌเจฐเจ•เจฒเฉ‡ เจฒเฉˆเจฌเจœเจผ เจฆเฉ‡ เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐเจพเจ‚ เจฆเฉ‡ เจฏเจคเจจเจพเจ‚ เจฆเฉเจ†เจฐเจพ, เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจฌเฉ€เจชเฉ€เจเจซ (เจฌเจฐเจ•เจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ) เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€, เจœเจฟเจธเจฆเจพ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฎเฉ‹เจŸเฉ‹เจฐเฉ‹เจฒเจพ 6502 เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ - เจ…เจœเจฟเจนเฉ‡ เจฎเจธเจผเจนเฉ‚เจฐ เจ‰เจคเจชเจพเจฆเจพเจ‚ เจฆเจพ เจตเจฐเจ• เจนเจพเจฐเจธ เจเจชเจฒ II เจœ NES. เจจเจตเฉ€เจ‚ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจจเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจนเฉฑเจฒเจพเจ‚ เจฆเฉ‡ เจฎเฉเจ•เจพเจฌเจฒเฉ‡ เจซเจฟเจฒเจŸเจฐ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจˆ เจ—เฉเจฃเจพ เจตเจงเจพ เจฆเจฟเฉฑเจคเจพ เจนเฉˆเฅค

เจฌเฉ€เจชเฉ€เจเจซ เจฎเจธเจผเฉ€เจจ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ

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

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

เจ‰เจชเจฐเฉ‹เจ•เจค เจธเจพเจกเฉ‡ เจฒเจˆ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ: เจ…เจธเฉ€เจ‚ เจฒเฉ‹เฉœ เจ…เจจเฉเจธเจพเจฐ เจธเจฟเจธเจŸเจฎ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจซเจพเจฐเจฎเฉˆเจŸ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเฉ‹เจตเจพเจ‚เจ—เฉ‡เฅค เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเฉ‡ เจ•เจฎเจพเจ‚เจก เจธเจฟเจธเจŸเจฎ เจฆเจพ เจคเฉเจฐเฉฐเจค เจ…เจงเจฟเจเจจ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจœเจพเจฃเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ…เจธเจฒ เจฒเฉ‡เจ– เจชเฉœเฉเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹ BSD เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ เจ…เจคเฉ‡/เจœเจพเจ‚ เจซเจพเจˆเจฒ เจฆเจพ เจชเจนเจฟเจฒเจพ เจ…เฉฑเจง Documentation/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 (เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ เจ•เจฟเจธเจฎ) c 0x86dd, เจ…เจคเฉ‡ เจ‡เจน เจ…เจคเฉ‡ เจ‰เฉฑเจฅเฉ‡ เจนเฉˆ เจ‰เจน เจ•เจฟเจธเจฎ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚ IPv6 เจนเฉˆเฅค เจฒเจพเจˆเจจ 1 'เจคเฉ‡, เจคเฉเจฒเจจเจพ เจ•เจฎเจพเจ‚เจก เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจฆเฉ‹ เจนเฉ‹เจฐ เจ•เจพเจฒเจฎ เจนเจจ - jt 2 ะธ jf 3 - เจœเฉ‡เจ•เจฐ เจคเฉเจฒเจจเจพ เจธเจซเจฒ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจœเจพเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ (A == 0x86dd) เจ…เจคเฉ‡ เจ…เจธเจซเจฒเฅค เจ‡เจธ เจฒเจˆ, เจ‡เฉฑเจ• เจธเจซเจฒ เจ•เฉ‡เจธ (IPv6) เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฒเจพเจˆเจจ 2 เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ…เจธเจซเจฒ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš - เจฒเจพเจˆเจจ 3 เจคเฉ‡เฅค เจฒเจพเจˆเจจ 3 เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เฉ‹เจก 0 เจจเจพเจฒ เจธเจฎเจพเจชเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ (เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ€ เจจเจ•เจฒ เจจเจพ เจ•เจฐเฉ‹), เจฒเจพเจˆเจจ 2 เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เฉ‹เจก เจจเจพเจฒ เจธเจฎเจพเจชเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค 262144 (เจฎเฉˆเจจเฉ‚เฉฐ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง 256 เจ•เจฟเจฒเฉ‹เจฌเจพเจˆเจŸ เจชเฉˆเจ•เฉ‡เจœ เจ•เจพเจชเฉ€ เจ•เจฐเฉ‹)เฅค

เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ‰เจฆเจพเจนเจฐเจจ: เจ…เจธเฉ€เจ‚ เจŸเฉ€เจธเฉ€เจชเฉ€ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจฎเฉฐเจœเจผเจฟเจฒ เจชเฉ‹เจฐเจŸ เจฆเฉเจ†เจฐเจพ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚

เจ†เจ‰ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจ•เจฟเจนเฉ‹ เจœเจฟเจนเจพ เจฆเจฟเจธเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ•เจฟ เจฎเฉฐเจœเจผเจฟเจฒ เจชเฉ‹เจฐเจŸ 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 IP เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเจพ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจ–เฉ‡เจคเจฐ, เจœเฉ‹ เจ•เจฟ เจฒเจพเจœเจผเฉ€เจ•เจฒ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ TCP เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ 0x6 (IPPROTO_TCP) เจฒเจพเจˆเจจ 3 'เจคเฉ‡.

เจฒเจพเจˆเจจเจพเจ‚ 4 เจ…เจคเฉ‡ 5 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจเจกเจฐเฉˆเฉฑเจธ 20 'เจคเฉ‡ เจธเจฅเจฟเจค เจ…เฉฑเจงเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ jset เจœเจพเจ‚เจš เจ•เจฐเฉ‹ เจ•เจฟ เจ•เฉ€ เจคเจฟเฉฐเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจนเฉˆ เจเฉฐเจกเฉ‡ - เจœเจพเจฐเฉ€ เจ•เฉ€เจคเจพ เจฎเจพเจธเจ• เจชเจนเจฟเจจเจฃเจพ jset เจคเจฟเฉฐเจจ เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจฌเจฟเฉฑเจŸ เจธเจพเจซเจผ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจเฅค เจคเจฟเฉฐเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฆเฉ‹ เจฌเจฟเฉฑเจŸ เจธเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจฆเฉ‡ เจนเจจ เจ•เจฟ เจ•เฉ€ เจชเฉˆเจ•เฉ‡เจŸ เจ‡เฉฑเจ• เจ–เฉฐเจกเจฟเจค IP เจชเฉˆเจ•เฉ‡เจŸ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจ…เจœเจฟเจนเจพ เจนเฉˆ, เจคเจพเจ‚ เจ•เฉ€ เจ‡เจน เจ†เจ–เจฐเฉ€ เจŸเฉเจ•เฉœเจพ เจนเฉˆเฅค เจคเฉ€เจœเจพ เจฌเจฟเฉฑเจŸ เจฐเจพเจ–เจตเจพเจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจœเจผเฉ€เจฐเฉ‹ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ…เจงเฉ‚เจฐเฉ‡ เจœเจพเจ‚ เจŸเฉเฉฑเจŸเฉ‡ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡, เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ‡ เจคเจฟเฉฐเจจ เจฌเจฟเฉฑเจŸเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจฒเจพเจˆเจจ 6 เจ‡เจธ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจธเจญ เจคเฉ‹เจ‚ เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ. เจธเจฎเฉ€เจ•เจฐเจจ ldxb 4*([14]&0xf) เจญเจพเจต เจ…เจธเฉ€เจ‚ เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ X เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจชเฉฐเจฆเจฐเฉเจนเจตเฉ‡เจ‚ เจฌเจพเจˆเจŸ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจšเจพเจฐ เจฌเจฟเฉฑเจŸเจพเจ‚ เจจเฉ‚เฉฐ 4 เจจเจพเจฒ เจ—เฉเจฃเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจชเฉฐเจฆเจฐเจตเฉ‡เจ‚ เจฌเจพเจˆเจŸ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจšเจพเจฐ เจฌเจฟเฉฑเจŸ เจ–เฉ‡เจคเจฐ เจนเฉˆ เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ IPv4 เจนเฉˆเจกเจฐ, เจœเฉ‹ เจนเฉˆเจกเจฐ เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ เจจเฉ‚เฉฐ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจซเจฟเจฐ 4 เจจเจพเจฒ เจ—เฉเจฃเจพ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ เจธเจฎเฉ€เจ•เจฐเจจ 4*([14]&0xf) เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจเจกเจฐเฉˆเจธเจฟเฉฐเจ— เจธเจ•เฉ€เจฎ เจฒเจˆ เจ‡เฉฑเจ• เจ…เจนเฉเจฆเจพ เจนเฉˆ เจœเฉ‹ เจธเจฟเจฐเจซเจผ เจ‡เจธ เจซเจพเจฐเจฎ เจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจฐเจœเจฟเจธเจŸเจฐ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ X, i.e. เจ…เจธเฉ€เจ‚ เจตเฉ€ เจจเจนเฉ€เจ‚ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ ldb 4*([14]&0xf) เจจเจพ เจนเฉ€ ldxb 5*([14]&0xf) (เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจ†เจซเจธเฉˆเฉฑเจŸ เจนเฉ€ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, ldxb 4*([16]&0xf)). เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ เจ‡เจธ เจเจกเจฐเฉˆเจธเจฟเฉฐเจ— เจธเจ•เฉ€เจฎ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ BPF เจตเจฟเฉฑเจš เจฌเจฟเจฒเจ•เฉเจฒ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจธเฉ€ X (เจ‡เฉฐเจกเฉˆเจ•เจธ เจฐเจœเจฟเจธเจŸเจฐ) IPv4 เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆเฅค

เจ‡เจธ เจฒเจˆ เจฒเจพเจˆเจจ 7 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ…เฉฑเจงเฉ‡ เจธเจผเจฌเจฆ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ (X+16). เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจ•เจฟ 14 เจฌเจพเจˆเจŸ เจˆเจฅเจฐเจจเฉˆเฉฑเจŸ เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉเจ†เจฐเจพ เจ•เจฌเจœเจผเฉ‡ เจตเจฟเฉฑเจš เจนเจจ, เจ…เจคเฉ‡ 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 เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚ 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 (เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจ›เฉฑเจกเฉ‹), เจธเจพเจ•เจŸ เจจเฉ‚เฉฐ เจจเจพเจจ-เจฌเจฒเจพเจ•เจฟเฉฐเจ— เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจชเจฟเจ›เจฒเฉ‡ เจซเจฟเจฒเจŸเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจฐเจนเจฟ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ•เฉเจฒ เจฎเจฟเจฒเจพ เจ•เฉ‡, เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฒเฉ€เจจเจ•เจธ เจ‰เฉฑเจคเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ struct sock_fprog เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ–เฉเฉฑเจฒเจพ เจธเจพเจ•เจŸ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจพเจ•เจŸ เจจเจพเจฒ เจœเฉ‹เฉœเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ setsockopt.

เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจพเจ•เจŸ เจจเจพเจฒ เจœเฉ‹เฉœเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจจเจพ เจ•เจฟ เจธเจฟเจฐเจซ เจ•เฉฑเจšเจพ. เจ‡เจฅเฉ‡ เจ‰เจฆเจพเจนเจฐเจจ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจœเฉ‹ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจธเจพเจฐเฉ‡ UDP เจกเฉ‡เจŸเจพเจ—เฉเจฐเจพเจฎเจพเจ‚ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเฉ‡ เจฆเฉ‹ เจฌเจพเจˆเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ เจธเจญ เจจเฉ‚เฉฐ เจ•เฉฑเจŸเจฆเจพ เจนเฉˆเฅค (เจฎเฉˆเจ‚ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจนเจจ เจคเจพเจ‚ เจœเฉ‹ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ—เฉœเจฌเฉœ เจจเจพ เจนเฉ‹เจตเฉ‡เฅค)

เจตเจฐเจคเฉ‹เจ‚ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเฉ‡ setsockopt เจซเจฟเจฒเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจฒเจˆ, เจตเฉ‡เจ–เฉ‹ เจธเจพเจ•เจŸ(7), เจชเจฐ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจซเจฟเจฒเจŸเจฐ เจฒเจฟเจ–เจฃ เจฌเจพเจฐเฉ‡ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ struct sock_fprog เจฎเจฆเจฆ เจฆเฉ‡ เจฌเจ—เฉˆเจฐ tcpdump เจ…เจธเฉ€เจ‚ เจญเจพเจ— เจตเจฟเฉฑเจš เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจธเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ เจนเฉฑเจฅเจพเจ‚ เจจเจพเจฒ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—.

เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจ…เจคเฉ‡ 21เจตเฉ€เจ‚ เจธเจฆเฉ€

เจฌเฉ€เจชเฉ€เจเจซ เจจเฉ‚เฉฐ 1997 เจตเจฟเฉฑเจš เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจฐเจ• เจนเจพเจฐเจธ เจฐเจฟเจนเจพ เจนเฉˆ libpcap เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ (เจฒเฉ€เจจเจ•เจธ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚, เจฌเฉ‡เจธเจผเจ•, เจ‡เจน เจธเฉ€, เจชเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‡ เจ—เจฒเฉ‹เจฌเจฒ เจคเจธเจตเฉ€เจฐ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฟเจ†)เฅค เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจ—เฉฐเจญเฉ€เจฐ เจธเฉฐเจ•เฉ‡เจค 2011 เจตเจฟเฉฑเจš เจ†เจ เจธเจจ, เจœเจฆเฉ‹เจ‚ เจเจฐเจฟเจ• เจกเฉ‚เจฎเจพเจœเจผเฉ‡เจŸ เจจเฉ‡ เจชเฉเจฐเจธเจคเจพเจตเจฟเจค เจ•เฉ€เจคเจพ เจธเฉ€เฅค เจชเฉˆเจš, เจœเฉ‹ เจ•เจฟ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจœเจธเจŸ เจ‡เจจ เจŸเจพเจˆเจฎ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆ - เจฌเฉ€เจชเฉ€เจเจซ เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจจเฉ‚เฉฐ เจฎเฉ‚เจฒ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ…เจจเฉเจตเจพเจฆเจ• x86_64 เจ•เฉ‹เจกเฅค

JIT เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ€ เจฒเฉœเฉ€ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพ เจธเฉ€: 2012 เจตเจฟเฉฑเจš เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจ‡เจ† เจฒเจˆ เจซเจฟเจฒเจŸเจฐ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจธเจ•เจฟเฉฐเจŸเจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจœเจจเจตเจฐเฉ€ 2013 เจตเจฟเฉฑเจš เจธเฉ€ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจฎเฉ‹เจกเฉ€ .เจฒ xt_bpf, เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเจˆ เจจเจฟเจฏเจฎ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ iptables เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจฎเจฆเจฆ เจจเจพเจฒ, เจ…เจคเฉ‡ เจ…เจ•เจคเฉ‚เจฌเจฐ 2013 เจตเจฟเฉฑเจš เจธเฉ€ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ‡เฉฑเจ• เจฎเฉ‹เจกเฉ€เจŠเจฒ เจตเฉ€ cls_bpf, เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ BPF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจตเจฐเจ—เฉ€เจ•เจฐเจฃ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจ…เจธเฉ€เจ‚ เจ‡เจนเจจเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจœเจฒเจฆเฉ€ เจนเฉ€ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡, เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจน เจธเจพเจกเฉ‡ เจฒเจˆ เจ‡เจน เจธเจฟเฉฑเจ–เจฃเจพ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ BPF เจฒเจˆ เจ†เจฐเจฌเจฟเจŸเจฐเฉ‡เจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเจพ เจ…เจคเฉ‡ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจจเจพ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ libpcap เจธเฉ€เจฎเจฟเจค (เจธเจงเจพเจฐเจจ เจ‰เจฆเจพเจนเจฐเจจ: เจซเจฟเจฒเจŸเจฐ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ libpcap เจธเจฟเจฐเจซ เจฆเฉ‹ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจ - 0 เจœเจพเจ‚ 0x40000) เจœเจพเจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ seccomp เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจฒเจพเจ—เฉ‚ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค

เจธเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ เจนเฉฑเจฅเจพเจ‚ เจจเจพเจฒ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจ†เจ“ 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> helper macros เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ - เจ‰เจชเจฐเฉ‹เจ•เจค เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‰เจนเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ

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

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจตเจฟเจ•เจฒเจช เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจจเจนเฉ€เจ‚ เจนเฉˆ. เจ‡เจน เจ‰เจน เจนเฉˆ เจœเฉ‹ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจจเฉ‡ เจคเจฐเจ• เจ•เฉ€เจคเจพ, เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš tools/bpf เจ•เจฐเจจเจฒ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฒเจพเจธเจฟเจ• BPF เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจ…เจคเฉ‡ เจกเฉ€เจฌเจ—เจฐ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจญเจพเจธเจผเจพ เจกเฉ€เจฌเฉฑเจ— เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉˆ tcpdump, เจชเจฐ เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจคเฉ€เจ• เจฒเฉ‡เจฌเจฒ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจนเฉˆ เจœเฉ‹ TCP/IPv4 เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจธเฉเฉฑเจŸเจฆเจพ เจนเฉˆ:

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

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ <ะบะพะปะธั‡ะตัั‚ะฒะพ ะธะฝัั‚ั€ัƒะบั†ะธะน>,<code1> <jt1> <jf1> <k1>,..., TCP เจจเจพเจฒ เจธเจพเจกเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ เจ‡เจน เจนเฉ‹เจตเฉ‡เจ—เจพ

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

C เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐเจพเจ‚ เจฆเฉ€ เจธเจนเฉ‚เจฒเจค เจฒเจˆ, เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ:

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

เจ‡เจธ เจŸเฉˆเจ•เจธเจŸ เจจเฉ‚เฉฐ เจŸเจพเจˆเจช เจธเจŸเฉเจฐเจ•เจšเจฐ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจ•เจพเจชเฉ€ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ struct sock_filter, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจญเจพเจ— เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจธเฉ€เฅค

Linux เจ…เจคเฉ‡ netsniff-ng เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ

เจธเจŸเฉˆเจ‚เจกเจฐเจก เจฌเฉ€เจชเฉ€เจเจซ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจฒเฉ€เจจเจ•เจธ เจ…เจคเฉ‡ tools/bpf/bpf_asm เจธเจนเจฟเจฏเฉ‹เจ— เจ…เจคเฉ‡ เจ—เฉˆเจฐ-เจฎเจฟเจ†เจฐเฉ€ เจธเฉˆเฉฑเจŸ. เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจ–เฉ‡เจคเจฐเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ struct sk_buff, เจœเฉ‹ เจ•เจฟ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจชเฉˆเจ•เฉ‡เจŸ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจนเจพเจ‡เจ• เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจนเฉ‹เจฐ เจ•เจฟเจธเจฎเจพเจ‚ เจตเฉ€ เจนเจจ ldw cpu เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเฉ‡เจ—เจพ A เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเจพ เจจเจคเฉ€เจœเจพ raw_smp_processor_id(). (BPF เจฆเฉ‡ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš, เจ‡เจนเจจเจพเจ‚ เจ—เฉˆเจฐ-เจฎเจฟเจ†เจฐเฉ€ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉˆเจฎเฉ‹เจฐเฉ€, เจขเจพเจ‚เจšเจฟเจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจคเจชเฉฐเจจ เจ˜เจŸเจจเจพเจตเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ•เจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจจเจพเจฒ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจตเจงเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆเฅค) เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจฆเฉ€ เจ‡เฉฑเจ• เจฆเจฟเจฒเจšเจธเจช เจ‰เจฆเจพเจนเจฐเจจ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจ•เจพเจชเฉ€ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฏเฉ‚เจœเจผเจฐ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจชเฉˆเจ•เฉ‡เจŸ เจนเฉˆเจกเจฐ poff, เจชเฉ‡เจฒเฉ‹เจก เจ†เจซเจธเฉˆเฉฑเจŸ:

ld poff
ret a

เจตเจฟเฉฑเจš BPF เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ tcpdump, เจชเจฐ เจ‡เจน เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจชเฉˆเจ•เฉ‡เจœ เจจเจพเจฒ เจœเจพเจฃเฉ‚ เจนเฉ‹เจฃ เจฆเจพ เจ‡เฉฑเจ• เจšเฉฐเจ—เจพ เจ•เจพเจฐเจจ เจนเฉˆ netsniff-ng, เจœเจฟเจธ เจตเจฟเฉฑเจš, เจนเฉ‹เจฐ เจšเฉ€เจœเจผเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจ‡เฉฑเจ• เจ‰เฉฑเจจเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจธเจผเจพเจฎเจฒ เจนเฉˆ netsniff-ng, เจœเจฟเจธ เจตเจฟเฉฑเจš, BPF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เฉฑเจ• เจชเฉเจฐเจญเจพเจตเฉ€ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจœเจจเจฐเฉ‡เจŸเจฐ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ‰เฉฑเจจเจค tools/bpf/bpf_asm, เจ‡เฉฑเจ• BPF เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† เจ—เจฟเจ† bpfc. เจชเฉˆเจ•เฉ‡เจœ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจนเจจ, เจฒเฉ‡เจ– เจฆเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฒเจฟเฉฐเจ• เจตเฉ€ เจตเฉ‡เจ–เฉ‹.

เจธเจ•เจฟเฉฐเจŸ

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

seccomp เจฆเจพ เจชเจนเจฟเจฒเจพ เจธเฉฐเจธเจ•เจฐเจฃ 2005 เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจฌเจนเฉเจค เจฎเจธเจผเจนเฉ‚เจฐ เจจเจนเฉ€เจ‚ เจธเฉ€, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจธเจจเฉ‡ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจช เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเจพ เจธเฉ€ - เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฒเจˆ เจ‰เจชเจฒเจฌเจง เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจฆเฉ‡ เจธเฉˆเฉฑเจŸ เจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจคเฉฑเจ• เจธเฉ€เจฎเจค เจ•เจฐเจจ เจฒเจˆ: read, write, exit ะธ sigreturn, เจ…เจคเฉ‡ เจจเจฟเจฏเจฎเจพเจ‚ เจฆเฉ€ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฎเจพเจฐเจฟเจ† เจ—เจฟเจ† เจธเฉ€ SIGKILL. เจนเจพเจฒเจพเจ‚เจ•เจฟ, 2012 เจตเจฟเฉฑเจš, seccomp เจจเฉ‡ BPF เจซเจฟเจฒเจŸเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฟเจ†, เจœเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจฎเจจเจœเจผเฉ‚เจฐเจธเจผเฉเจฆเจพ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจฆเจฒเฉ€เจฒเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจตเฉ€ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค (เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ, เจ•เฉเจฐเฉ‹เจฎ เจ‡เจธ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเฉ€, เจ…เจคเฉ‡ Chrome เจฒเฉ‹เจ• เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš BPF เจฆเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจ‡เฉฑเจ• KRSI เจตเจฟเจงเฉ€ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐ เจฐเจนเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเฉ‡ เจฐเจนเฉ‡ เจนเจจเฅค) เจตเจพเจงเฉ‚ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ‡ เจฒเจฟเฉฐเจ• เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฒเฉฑเจญเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจ เจฒเฉ‡เจ– เจฆเฉ‡.

เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ seccomp เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจนเฉฑเจฌ 'เจคเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฒเฉ‡เจ– เจนเจจ, เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ‹เจˆ เจตเจฟเจ…เจ•เจคเฉ€ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ‰เจช-เจญเจพเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ (เจœเจพเจ‚ เจ‡เจธ เจฆเฉ€ เจฌเจœเจพเจ) เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจเจพ เจšเจพเจนเฉ‡เจ—เจพเฅค เจฒเฉ‡เจ– เจตเจฟเจš เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ†: seccomp seccomp เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, 2007 เจตเจฐเจœเจจ เจ…เจคเฉ‡ BPF (เจซเจฟเจฒเจŸเจฐ libseccomp เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ), เจกเฉŒเจ•เจฐ เจจเจพเจฒ seccomp เจฆเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ•เจˆ เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจฒเจฟเฉฐเจ• เจตเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฒเฉ‡เจ– เจตเจฟเจš เจธเจฟเจธเจŸเจฎเจก เจœเจพเจ‚ "เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฒเจˆ เจกเฉŒเจ•เจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ!" เจจเจพเจฒ เจกเฉˆเจฎเจจ เจจเฉ‚เฉฐ เจ…เจฒเฉฑเจ— เจ•เจฐเจจเจพ เจ‡เจน เจ•เจตเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจธเจฟเจธเจŸเจฎเจก เจšเฉฑเจฒ เจฐเจนเฉ‡ เจกเฉˆเจฎเจจ เจฒเจˆ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจฌเจฒเฉˆเจ•เจฒเจฟเจธเจŸเจพเจ‚ เจœเจพเจ‚ เจตเจพเจˆเจŸเจฒเจฟเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจเจพ เจนเฉˆเฅค

เจ…เฉฑเจ—เฉ‡ เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ เจซเจฟเจฒเจŸเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเฉ‡ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐเจจเฉ‡ เจนเจจ seccomp เจฌเฉ‡เจ…เจฐ C เจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ libseccomp เจ…เจคเฉ‡ เจนเจฐเฉ‡เจ• เจตเจฟเจ•เจฒเจช เจฆเฉ‡ เจซเจพเจ‡เจฆเฉ‡ เจ…เจคเฉ‡ เจจเฉเจ•เจธเจพเจจ เจ•เฉ€ เจนเจจ, เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉเจ†เจฐเจพ seccomp เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ strace.

seccomp เจฒเจˆ เจซเจฟเจฒเจŸเจฐ เจฒเจฟเจ–เจฃเจพ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐเจจเจพ

เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจœเจพเจฃเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเฉ‡ เจนเจจ, เจ‡เจธ เจฒเจˆ เจ†เจ“ เจชเจนเจฟเจฒเจพเจ‚ seccomp เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจเฅค เจคเฉเจธเฉ€เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจธเฉˆเจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ…เจคเฉ‡ เจธเจพเจฐเฉ€เจ†เจ‚ เจฌเจพเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจ—เฉ€เจ†เจ‚เฅค เจ‡เจน เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

เจœเจฟเฉฑเจฅเฉ‡ &filter - เจ‡เจน เจธเจพเจกเฉ‡ เจฒเจˆ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจฌเจฃเจคเจฐ เจฆเจพ เจธเฉฐเจ•เฉ‡เจค เจนเฉˆ struct sock_fprog, i.e. เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ.

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 เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฆเฉ‚เจœเจพ, เจ•เฉ‹เจˆ เจธเฉฐเจญเจพเจตเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ เจจเจพ เจšเจพเจˆเจฒเจก เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เฉ‹, เจ•เจฟเจ‰เจ‚เจ•เจฟ seccomp เจซเจฟเจฒเจŸเจฐ เจ‡เจธ เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจฌเจพเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจตเจฟเจฐเจพเจธเจค เจตเจฟเฉฑเจš เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค

เจฌเจฟเจฒเจ•เฉเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเฉ‡ strace เจจเจพเจฒ เจ•เฉฐเจฎ seccomp เจคเฉ‹เจ‚ เจฒเฉฑเจญเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจคเจพเจœเจผเจพ เจฐเจฟเจชเฉ‹เจฐเจŸ. เจธเจพเจกเฉ‡ เจฒเจˆ, เจธเจญ เจคเฉ‹เจ‚ เจฆเจฟเจฒเจšเจธเจช เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ 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. เจ•เฉ‹เจˆ เจตเฉ€ เจœเจฟเจธเจจเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจนเฉเจฃ เจคเฉฑเจ• เจชเฉœเฉเจนเจฟเจ† เจนเฉˆ เจ‰เจธเจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจ•เจพเจฐเจœ เจฆเฉ‡ เจธเจฟเจงเจพเจ‚เจค เจฌเจพเจฐเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ: BPF เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจจเฉ‚เฉฐ iptables เจจเจฟเจฏเจฎเจพเจ‚ เจตเจœเฉ‹เจ‚ เจšเจฒเจพเจ“เฅค เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจจเจฟเจฏเจฎ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚:

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

เจ‡เฉฑเจฅเฉ‡ <ะฑะฐะนั‚ะบะพะด> - เจ‡เจน เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจนเฉˆ bpf_asm เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ,

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

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

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

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ‡ UDP เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค เจ‡เฉฑเจ• เจฎเฉ‹เจกเฉ€เจŠเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจˆ เจธเฉฐเจฆเจฐเจญ xt_bpf, เจฌเฉ‡เจธเจผเฉฑเจ•, เจชเฉˆเจ•เฉ‡เจŸ เจกเฉ‡เจŸเจพ เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจฆเจพ เจนเฉˆ, iptables เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, IPv4 เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจตเฉฑเจฒเฅค BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจตเจพเจชเจธเฉ€ เจฎเฉเฉฑเจฒ เจฌเฉเจฒเฉ€เจ…เจจเจ•เจฟเฉฑเจฅเฉ‡ false เจฎเจคเจฒเจฌ เจชเฉˆเจ•เฉ‡เจŸ เจฎเฉ‡เจฒ เจจเจนเฉ€เจ‚ เจ–เจพเจ‚เจฆเจพเฅค

เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ เจฎเฉ‹เจกเฉ€เจŠเจฒ xt_bpf เจ‰เจชเจฐเฉ‹เจ•เจค เจ‰เจฆเจพเจนเจฐเจจ เจจเจพเจฒเฉ‹เจ‚ เจตเจงเฉ‡เจฐเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจซเจฟเจฒเจŸเจฐเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ†เจ‰ เจ•เจฒเจพเจ‰เจกเจซเฉ‡เจ…เจฐ เจคเฉ‹เจ‚ เจ…เจธเจฒ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจเฅค เจนเจพเจฒ เจนเฉ€ เจคเฉฑเจ• เจ‰เจน เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจธเจจ 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,
...

เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš Cloudfare เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจฐเจนเฉ€ เจนเฉˆ xt_bpf, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน XDP เจตเจฟเฉฑเจš เจšเจฒเฉ‡ เจ—เจ เจนเจจ - BPF เจฆเฉ‡ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ•, เจตเฉ‡เจ–เฉ‹เฅค L4Drop: XDP DDoS เจฎเจฟเจŸเฉ€เจ—เฉ‡เจธเจผเจจ.

cls_bpf

เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ–เจฐเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจ•เจฒเจพเจธเฉ€เจซเจพเจ‡เจฐ เจนเฉˆ cls_bpf เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจŸเฉเจฐเฉˆเจซเจฟเจ• เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจ‰เจช-เจธเจฟเจธเจŸเจฎ เจฒเจˆ, 2013 เจฆเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจ…เจคเฉ‡ เจธเฉฐเจ•เจฒเจชเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจชเฉเจฐเจพเจšเฉ€เจจ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฟเจ† เจ—เจฟเจ†เฅค cls_u32.

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจ•เฉฐเจฎ เจฆเจพ เจตเจฐเจฃเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡ cls_bpf, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฌเจพเจฐเฉ‡ เจ—เจฟเจ†เจจ เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚ เจ‡เจน เจธเจพเจจเฉ‚เฉฐ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจตเฉ‡เจ—เจพ - เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพเจตเจพเจ‚ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเฉ‹ เจ—เจ เจนเจพเจ‚เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจตเจฟเจธเจคเฉเจฐเจฟเจค เจฌเฉ€เจชเฉ€เจเจซ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจ…เจ—เจฒเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เจธ เจตเจฐเจ—เฉ€เจซเจพเจ‡เจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจง เจตเจพเจฐ เจฎเจฟเจฒเจพเจ‚เจ—เฉ‡เฅค

เจ•เจฒเจพเจธเจฟเจ• BPF c เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจจเจพ เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ•เจพเจฐเจจ cls_bpf เจธเจฎเฉฑเจธเจฟเจ† เจ‡เจน เจนเฉˆ เจ•เจฟ, เจตเจฟเจธเจคเฉเจฐเจฟเจค เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจคเฉเจฒเจจเจพ เจตเจฟเฉฑเจš, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจนเฉ‹เจฃ เจฆเจพ เจฆเจพเจ‡เจฐเจพ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเฉฐเจ•เฉเจšเจฟเจค เจนเฉˆ: เจ•เจฒเจพเจธเฉ€เจ•เจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒ เจธเจ•เจฆเฉ‡ เจ…เจคเฉ‡ เจ•เจพเจฒเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ‡เจธ เจฒเจˆ เจ‡เจน เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจจเฉ‚เฉฐ เจ…เจฒเจตเจฟเจฆเจพ เจ•เจนเจฟเจฃ เจ…เจคเฉ‡ เจญเจตเจฟเฉฑเจ– เจตเฉฑเจฒ เจฆเฉ‡เจ–เจฃ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆเฅค

เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจจเฉ‚เฉฐ เจ…เจฒเจตเจฟเจฆเจพ

เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฟเจ† เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ BPF เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€, เจจเฉฑเจฌเฉ‡ เจฆเฉ‡ เจฆเจนเจพเจ•เฉ‡ เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจตเจฟเจ•เจธเจค เจนเฉ‹เจˆ, เจ‡เฉฑเจ• เจธเจฆเฉ€ เจฆเฉ‡ เจ‡เฉฑเจ• เจšเฉŒเจฅเจพเจˆ เจนเจฟเฉฑเจธเฉ‡ เจคเฉฑเจ• เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจœเจฟเจ‰เจ‚เจฆเฉ€ เจฐเจนเฉ€ เจ…เจคเฉ‡ เจ…เฉฐเจค เจคเฉฑเจ• เจจเจตเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเฉฑเจญเฉ€เจ†เจ‚เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจธเจŸเฉˆเจ• เจฎเจธเจผเฉ€เจจเจพเจ‚ เจคเฉ‹เจ‚ เจ†เจฐเจ†เจˆเจเจธเจธเฉ€ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€ เจฆเฉ‡ เจธเจฎเจพเจจ, เจœเจฟเจธเจจเฉ‡ เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‡เจฐเจฃเจพ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ, 32 เจฆเฉ‡ เจฆเจนเจพเจ•เฉ‡ เจตเจฟเฉฑเจš 64-เจฌเจฟเฉฑเจŸ เจคเฉ‹เจ‚ XNUMX-เจฌเจฟเฉฑเจŸ เจฎเจธเจผเฉ€เจจเจพเจ‚ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€ เจนเฉ‹เจˆ เจ…เจคเฉ‡ เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเจพเจฃเจพ เจนเฉ‹เจฃเจพ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจ—เจฟเจ†เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฌเจนเฉเจค เจธเฉ€เจฎเจค เจนเจจ, เจ…เจคเฉ‡ เจชเฉเจฐเจพเจฃเฉ€ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ - เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฒเจˆ เจ•เจพเจฒเจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจฐเจพเจœ เจจเฉ‚เฉฐ เจฌเจšเจพเจ‰เจฃ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจธเจฟเฉฑเจงเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจธเฉฐเจญเจพเจตเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจธเฉฐเจญเจพเจตเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ. เจ•เจฐเจจเจฒ เจฆเฉ‡ เจจเจพเจฒ, เจขเจพเจ‚เจšเจพ เจ–เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ€เจฎเจค เจ—เจฟเจฃเจคเฉ€ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ sk_buff เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจธเจฐเจฒ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจฌเจฆเจฒ เจจเจนเฉ€เจ‚ เจธเจ•เจฆเฉ‡ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡เฅค

เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจฌเจšเฉ‡ เจนเฉ‹เจ เจธเจพเจฐเฉ‡ เจเจชเฉ€เจ†เจˆ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจนเจจ, เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจธเจพเจฐเฉ‡ เจ•เจฒเจพเจธเจฟเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ, เจญเจพเจตเฉ‡เจ‚ เจ‡เจน เจธเจพเจ•เจŸ เจซเจฟเจฒเจŸเจฐ เจœเจพเจ‚ เจธเฉˆเจ•เฉŒเจ‚เจช เจซเจฟเจฒเจŸเจฐ เจนเฉ‹เจฃ, เจ†เจชเจฃเฉ‡ เจ†เจช เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจตเจฟเจธเจคเฉเจฐเจฟเจค เจฌเฉ€เจชเฉ€เจเจซเฅค (เจ…เจธเฉ€เจ‚ เจ…เจ—เจฒเฉ‡ เจฒเฉ‡เจ– เจตเจฟเจš เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค)

เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€ 2013 เจตเจฟเฉฑเจš เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจˆ, เจœเจฆเฉ‹เจ‚ เจ…เจฒเฉˆเจ•เจธเฉ€ เจธเจŸเจพเจฐเฉ‹เจตเฉ‹เจ‡เจŸเฉ‹เจต เจจเฉ‡ เจ‡เฉฑเจ• BPF เจ…เจชเจกเฉ‡เจŸ เจธเจ•เฉ€เจฎ เจฆเจพ เจชเฉเจฐเจธเจคเจพเจต เจ•เฉ€เจคเจพเฅค 2014 เจตเจฟเฉฑเจš เจ…เจจเฉเจธเจพเจฐเฉ€ เจชเฉˆเจš เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃ เจฒเฉฑเจ—เจพ เจ•เฉ‹เจฐ เจตเจฟเฉฑเจš. เจœเจฟเฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจฎเฉˆเจ‚ เจธเจฎเจเจฆเจพ เจนเจพเจ‚, เจ…เจธเจฒ เจฏเฉ‹เจœเจจเจพ เจธเจฟเจฐเจซ 64-เจฌเจฟเฉฑเจŸ เจฎเจธเจผเฉ€เจจเจพเจ‚ 'เจคเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจ•เฉเจธเจผเจฒเจคเจพ เจจเจพเจฒ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ…เจคเฉ‡ เจœเฉ‡เจ†เจˆเจŸเฉ€ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจธเฉ€, เจชเจฐ เจ‡เจธ เจฆเฉ€ เจฌเจœเจพเจ เจ‡เจนเจจเจพเจ‚ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพเจตเจพเจ‚ เจจเฉ‡ เจฒเฉ€เจจเจ•เจธ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจ…เจงเจฟเจ†เจ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เฉ€เจคเฉ€เฅค

เจ‡เจธ เจฒเฉœเฉ€ เจฆเฉ‡ เจนเฉ‹เจฐ เจฒเฉ‡เจ– เจจเจตเฉ€เจ‚ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเฉ‡ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจตเจฐ เจ•เจฐเจจเจ—เฉ‡, เจœเจฟเจธ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ 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. เจนเฉˆเจฌเจฐ: เจธเจฟเจธเจŸเจฎเจก เจจเจพเจฒ เจกเฉˆเจฎเจจ เจจเฉ‚เฉฐ เจ…เจฒเฉฑเจ— เจ•เจฐเจจเจพ เจœเจพเจ‚ "เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฒเจˆ เจกเฉŒเจ•เจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ!"
  12. เจชเฉŒเจฒ เจšเฉˆเจ—เจจเจจ, "เจธเจŸเจฐเฉ‡เจธ --เจธเฉ‡เจ•เฉŒเจ‚เจช-เจฌเฉ€เจชเฉ€เจเจซ: เจนเฉเฉฑเจก เจฆเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจ‡เฉฑเจ• เจจเจœเจผเจฐ", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹