Berkeley Packet Filters (BPF) เปเบเบฑเบเปเบเบเปเบเปเบฅเบเบต kernel Linux เบเบตเปเปเบเปเบขเบนเปเปเบเบซเบเปเบฒเบเปเบฒเบเบซเบเปเบฒเบเบญเบเบชเบดเปเบเบเบดเบกเปเบเบฑเบเปเบเปเบฅเบขเบตเบเบฒเบชเบฒเบญเบฑเบเบเบดเบเบชเปเบฒเบฅเบฑเบเปเบงเบฅเบฒเบซเบผเบฒเบเบเบตเปเบฅเปเบง. เบเบญเบเบเบฐเบเบธเบกเปเบกเปเบเปเบเบฑเบกเปเบเบเปเบงเบเบเบปเบเบฅเบฒเบเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเปเบฒเปเบเปเปเบฅเบฐเบเบฒเบเบเบฑเบเบเบฐเบเบฒ BPF. David Miller, เบเบนเปเบฎเบฑเบเบชเบฒเบฅเบฐเบเบปเบเบเปเบญเบเปเบเบทเบญเบเปเบฒเบ Linux, เปเบเบซเบฒเบเบฒเบเบชเบปเบเบเบฐเบเบฒเบเบญเบเบฅเบฒเบงเบขเบนเปเบเบตเป Linux Plumbers 2018
เบเบฑเบเบเปเปเบเบฑเบเบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบตเปเปเบเบฑเบเบฅเบฐเบเบปเบเบเบญเบ BPF เปเบHabrรฉ, เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเปเบเบเบธเบเบเบญเบเบเบปเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบเบฐเบเบฒเบเบฒเบกเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบฐเบซเบงเบฑเบเบชเบฒเบเบเบญเบเปเบเบฑเบเปเบเปเบฅเบขเบต, เบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบฅเบฐเปเบเบทเปเบญเบเบกเบทเบเบฒเบเบเบฑเบเบเบฐเบเบฒ, เปเบฅเบฐเบเปเบฒเบเบปเบเบเบญเบเปเบเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเปเปเบฅเบฐเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเปเบฒเปเบเป BPF. เบเบปเบเบเบฝเบเบเบตเป, เบชเบนเบ, เปเบเบเบธเบ, เบเบญเบเบเบฐเบซเบงเบฑเบเบชเบฒเบเปเบฅเบฐเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบเบญเบ BPF เบเบฅเบฒเบชเบชเบดเบ, เปเบฅเบฐเบเบฑเบเปเบเบตเบเปเบเบตเบเบเบงเบฒเบกเบฅเบฑเบเบเบญเบเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบญเบเบกเบฑเบ. tcpdump
, seccomp
, strace
, เปเบฅเบฐเบญเบทเปเบเปเบญเบตเบ.
เบเบฒเบเบเบฑเบเบเบฐเบเบฒ BPF เปเบกเปเบเบเบงเบเบเบธเบกเปเบเบเบเบธเบกเบเบปเบเปเบเบทเบญเบเปเบฒเบ Linux, เบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบตเปเบกเบตเบขเบนเปเบเบปเปเบเบเปเบเบญเบ BPF เปเบกเปเบเบเปเบฝเบงเบเปเบญเบเบเบฑเบเปเบเบทเบญเบเปเบฒเบเปเบฅเบฐเบเบฑเปเบเบเบฑเปเบ, เปเบเปเบฎเบฑเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบ.
เบซเบผเบฑเบเบชเบนเบเปเบฅเบเบฐเบชเบฑเปเบเปเบเบเบฐเบซเบงเบฑเบเบชเบฒเบเบเบญเบ BPF (c)
เปเบเบฑเบเปเบเปเบฅเบขเบต BPF เบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเปเบกเปเบเบเบฒเบเบเบฑเบเบเบธเบเปเบฅเบฐเบเบฐเบซเบเบฒเบเบเบญเบเปเบเบฑเบเปเบเปเบฅเบขเบตเปเบเบปเปเบฒเบเบตเปเบกเบตเบเบทเปเบเบฝเบงเบเบฑเบ, เปเบเบเบฑเบเบเบธเบเบฑเบเปเบญเบตเปเบเบงเปเบฒ BPF เบเบฅเบฒเบชเบชเบดเบเปเบเบทเปเบญเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเบชเบฑเบเบชเบปเบ. เบเบปเบเบเบฐเปเบซเบเบเบเบตเปเบกเบตเบเบทเปเบชเบฝเบเปเบเปเบเบทเบเบชเปเบฒเบเบเบทเปเบเปเบเบเบญเบตเบเปเบชเป BPF เบเบฅเบฒเบชเบชเบดเบ tcpdump
, เบเบปเบเปเบ seccomp
, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเปเบกเบเบนเบเบเบตเปเบฎเบนเปเบเบฑเบเบซเบเปเบญเบ xt_bpf
เบเบฒเบ iptables
เปเบฅเบฐเบเบฒเบเบเบฑเบเบเบฐเปเบเบ cls_bpf
. เปเบ Linux เบเบตเปเบเบฑเบเบชเบฐเปเบซเบก, เปเบเบเบเบฒเบ BPF เบเบฅเบฒเบชเบชเบดเบเบเบทเบเปเบเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบเบฎเบนเบเปเบเบเปเบซเบกเป, เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบญเบเบเบนเปเปเบเป, API เบเบฑเบเบเบปเบเบขเบนเปเปเบเบชเบฐเบเบฒเบเบเบตเปเปเบฅเบฐเบเบฒเบเบเปเบฒเปเบเปเปเบซเบกเปเบชเปเบฒเบฅเบฑเบ BPF เบเบฅเบฒเบชเบชเบดเบ, เบเบฑเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบซเบฑเบเปเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เบเบฑเบเบเบทเบเบเบปเบเปเบซเบฑเบ. เบชเปเบฒเบฅเบฑเบเปเบซเบเบเบปเบเบเบตเป, เปเบฅเบฐเบเปเบญเบเบงเปเบฒเบเบฐเบเบดเบเบฑเบเบเบฒเบกเบเบฐเบซเบงเบฑเบเบชเบฒเบเบเบญเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒ BPF เบเบฅเบฒเบชเบชเบดเบเปเบ Linux, เบกเบฑเบเบเบฐเบเบฒเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเบเบงเปเบฒเบงเบดเบเบตเบเบฒเบเปเบฅเบฐเปเบซเบเบเบปเบเบเบตเปเบกเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบเบชเบนเปเบฎเบนเบเปเบเบเบเบตเปเบเบฑเบเบชเบฐเปเบซเบก, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบเบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบ BPF เบเบฅเบฒเบชเบชเบดเบ.
เปเบเบเบญเบเบเปเบฒเบเบเบญเบเปเบเบเบชเบดเบเบเบญเบเบชเบฐเบเบฐเบงเบฑเบเบเบตเปเบเปเบฒเบเบกเบฒ, เบงเบดเบชเบฐเบงเบฐเบเบญเบเบเบฒเบเบซเปเบญเบเบเบปเบเบฅเบญเบ Lawrence Berkeley เบเบตเปเบกเบตเบเบทเปเบชเบฝเบเปเบเปเบกเบตเบเบงเบฒเบกเบชเบปเบเปเบเปเบเบเปเบฒเบเบฒเบกเบเปเบฝเบงเบเบฑเบเบงเบดเบเบตเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเปเบเบทเบญเบเปเบฒเบเบขเปเบฒเบเบเบทเบเบเปเบญเบเบเปเบฝเบงเบเบฑเบเบฎเบฒเบเปเบงเบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเปเบเบเปเบฒเบเบชเบฐเบเบฐเบงเบฑเบเบเบตเปเปเบเบเบชเบดเบเบเบญเบเบชเบฐเบเบฐเบงเบฑเบเบเบตเปเบเปเบฒเบเบกเบฒ. เปเบเบงเบเบงเบฒเบกเบเบดเบเบเบทเปเบเบเบฒเบเบเบญเบเบเบฒเบเบเบฑเปเบเบเบญเบ, เปเบเปเบเบทเปเบญเบเบเบปเปเบเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเปเบเบฑเบเปเบเปเบฅเบขเบต CSPF (CMU / Stanford Packet Filter), เปเบกเปเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเบเบตเปเบเปเปเบเปเบฒเปเบเบฑเบเปเบงเปเบเบปเปเบฒเบเบตเปเบเบฐเปเบงเปเบเป, i.e. เปเบเบเบทเปเบเบเบตเป kernel, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบตเปเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเบเบฑเบเบฅเบญเบเบเปเปเบกเบนเบเบเบตเปเบเปเปเบเปเบฒเปเบเบฑเบเปเบเบปเปเบฒเปเบเปเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป. เปเบเบทเปเบญเบชเบฐเบซเบเบญเบเบเบงเบฒเบกเบเบญเบเปเบ runtime เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฅเปเบเบฅเบฐเบซเบฑเบเบเบนเปเปเบเปเบขเบนเปเปเบเบเบทเปเบเบเบตเปเปเบเปเบ, เปเบเบทเปเบญเบเบเบฑเบ virtual sandboxed เปเบเปเบเบทเบเบเปเบฒเปเบเป.
เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบทเปเบญเบเบเบฑเบ virtual เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเบเบตเปเบกเบตเบขเบนเปเปเบฅเปเบงเปเบเปเบเบทเบเบญเบญเบเปเบเบเปเบเบทเปเบญเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเปเบเบทเปเบญเบเบเบฑเบ stack-based เปเบฅเบฐเบเปเปเปเบเปเบเปเบฒเปเบเบตเบเบเบฒเบเบขเปเบฒเบเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเปเบเปเบเบทเปเบญเบ RISC เบฎเบธเปเบเปเบซเบกเป. เบเบฑเปเบเบเบฑเปเบ, เปเบเบเบเปเบฒเบเบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบเบญเบเบงเบดเบชเบฐเบงเบฐเบเบญเบเบเบฒเบ Berkeley Labs, เปเบเบฑเบเปเบเปเบฅเบขเบต BPF (Berkeley Packet Filters) เปเบซเบกเปเปเบเปเบเบทเบเบเบฑเบเบเบฐเบเบฒ, เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ virtual เบเบญเบเปเบเบทเปเบญเบเบเบฑเบเบเบตเปเบเบทเบเบญเบญเบเปเบเบเปเบเบเบญเบตเบเปเบชเปเปเบเปเบเบเปเบเบต Motorola 6502 - workhorse เบเบญเบเบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบเบตเปเบกเบตเบเบทเปเบชเบฝเบเปเบเบฑเปเบ:
เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบเบทเปเบญเบ BPF
เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเปเบฎเบนเปเบเบฑเบเบเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเปเบเบงเบดเบเบตเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ, เบเบฒเบเบงเบดเปเบเบฒเบฐเบเบปเบงเบขเปเบฒเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบทเปเบญเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ, เปเบซเปเปเบงเบปเปเบฒเบงเปเบฒเปเบเบทเปเบญเบเบเบฑเบเบกเบตเบชเบญเบเบเบฐเบเบฝเบ 32-bit เบเบตเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบนเปเปเบเปเปเบเป, เปเบเบทเปเบญเบเบชเบฐเบชเบปเบก. A
เปเบฅเบฐเบเบฐเบเบฝเบเบเบฑเบเบชเบฐเบเบต X
, 64 bytes เบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ (16 เบเปเบฒ), เบกเบตเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฝเบเปเบฅเบฐเบเบฒเบเบญเปเบฒเบเบเปเปเบกเบฒ, เปเบฅเบฐเบฅเบฐเบเบปเบเบเบฐเบซเบเบฒเบเบเปเบญเบเบเบญเบเบเปเบฒเบชเบฑเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบงเบฑเบเบเบธเปเบซเบผเบปเปเบฒเบเบตเป. เบเปเบฒเปเบเบฐเบเปเบฒเบเบฒเบเปเบเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเบเบฒเบกเปเบเบทเปเบญเบเปเบเบเปเปเบกเบตเบขเบนเปเปเบเปเบเบเบเบฒเบ, เปเบเปเปเบเบทเปเบญเบฎเบฑเบเบเบฐเบเบฑเบเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบฒเบกเปเบงเบฅเบฒเบเบญเบเปเบเบเบเบฒเบ, เบเบฒเบเบเบฐเปเบเบเบเบฝเบเปเบเปเบชเบฒเบกเบฒเบเบเปเบฒเบงเปเบเบเปเบฒเบเบซเบเปเบฒ, i.e. เปเบเบเบชเบฐเปเบเบฒเบฐ, เบกเบฑเบเบเบทเบเบซเปเบฒเบกเบเปเปเปเบซเปเบชเปเบฒเบ loops.
เปเบเบเบเบฒเบเบเบปเปเบงเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเปเบเบทเปเบญเบเปเบกเปเบเบเบฑเปเบเบเปเปเปเบเบเบตเป. เบเบนเปเปเบเปเบชเปเบฒเบเปเบเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ BPF เปเบฅเบฐ, เบเบฒเบเบเปเบฒเปเบเป เบเบฒเบ เบเบปเบเปเบ kernel (เปเบเบฑเปเบ: เบเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบ), เปเบซเบผเบเปเบฅเบฐเปเบเบทเปเบญเบกเบเปเปเปเบเบเบเบฒเบเบเบฑเบ เบเบฑเบเบเบฒเบ เปเบเบซเบฒเบเบปเบงเบชเปเบฒเบเปเบซเบเบเบฒเบเปเบ kernel (เบเบปเบงเบขเปเบฒเบ, เปเบซเบเบเบฒเบเปเบกเปเบเบเบฒเบเบกเบฒเบฎเบญเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเบเปเปเปเบเปเบเบเบฑเบเปเบเบทเบญเบเปเบฒเบ). เปเบกเบทเปเบญเปเบซเบเบเบฒเบเปเบเบตเบเบเบถเปเบ, kernel เบเปเบฒเปเบเบตเบเปเบเบเบเบฒเบ (เบเบปเบงเบขเปเบฒเบ, เปเบเบเบปเบงเปเบ), เปเบฅเบฐเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบญเบเปเบเบทเปเบญเบเบเบฑเบเบเบฐเบเบปเบเบเบฑเบ. เบเบฑเบเบเบฒเบ เบเบฒเบเบเบทเปเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ kernel (เบเบปเบงเบขเปเบฒเบ, เบเปเปเบกเบนเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเบเบตเปเปเบเบปเปเบฒเบกเบฒ).
เบเปเบฒเบเปเบเบดเบเบเบฐเบเบฝเบเบเปเบชเปเบฒเบฅเบฑเบเบเบงเบเปเบฎเบปเบฒเบเบตเปเบเบฐเปเบฅเบตเปเบกเบเบปเปเบเปเบเบดเปเบเบเบปเบงเบขเปเบฒเบ: เบเบงเบเปเบฎเบปเบฒเบเบฐเบฎเบนเปเบเบฑเบเบเบฑเบเบฅเบฐเบเบปเบเปเบฅเบฐเบฎเบนเบเปเบเบเบเปเบฒเบชเบฑเปเบเบเบฒเบกเบเบงเบฒเบกเบเปเบฒเปเบเบฑเบ. เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเบชเบถเบเบชเบฒเบฅเบฐเบเบปเบเบเปเบฒเบชเบฑเปเบเบเบญเบเปเบเบทเปเบญเบ virtual เบเบฑเบเบเบตเปเบฅเบฐเบฎเบฝเบเบฎเบนเปเบเปเบฝเบงเบเบฑเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบเบกเบฑเบเบเบฑเบเบซเบกเบปเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบญเปเบฒเบเบเบปเบเบเบงเบฒเบกเบเบปเปเบเบชเบฐเบเบฑเบ. libpcap
: เปเบเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ เปเบฅเบฐเบงเบดเบเบตเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเปเบเบฑเบเปเบเบฑเบlibpcap
.
เบเบงเบเปเบฎเบปเบฒเบชเบทเบเบเปเปเบเบดเบเบฒเบฅเบฐเบเบฒเบเบปเบงเบขเปเบฒเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบฑเบเบซเบกเบปเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเป BPF เบเบฅเบฒเบชเบชเบดเบเปเบ Linux: tcpdump
(libpcap
), seccomp, xt_bpf
, cls_bpf
.
tcpdump
เบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ BPF เปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเบเบฐเบซเบเบฒเบเบเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ frontend เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเบเบญเบ - เบเบปเบเบเบฐเปเบซเบเบเบเบตเปเบกเบตเบเบทเปเบชเบฝเบ. tcpdump
. เปเบฅเบฐ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบตเปเปเบเบปเปเบฒเปเบเปเบเบตเปเบชเบธเบเปเบฅเบฐเบกเบตเบเบทเปเบชเบฝเบเบเบตเปเบชเบธเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเป BPF เบเบฅเบฒเบชเบชเบดเบ, เบเบตเปเบกเบตเบขเบนเปเปเบเบซเบผเบฒเบเปเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเบชเบถเบเบชเบฒเปเบเบฑเบเปเบเปเบฅเบขเบตเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบกเบฑเบ.
(เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบฅเปเบเบเบปเบงเบขเปเบฒเบเบเบฑเบเบซเบกเบปเบเปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเปเบฝเบงเบเบฑเบ Linux 5.6.0-rc6
. เบเบปเบเปเบเปเบฎเบฑเบเบเบญเบเบเบฒเบเบเปเบฒเบชเบฑเปเบเปเบเปเบเบทเบเบเบฑเบเปเบเปเปเบเบทเปเบญเปเบซเปเบชเบฒเบกเบฒเบเบญเปเบฒเบเปเบเปเบเบตเบเบถเปเบ.)
เบเบปเบงเบขเปเบฒเบ: เบเบฒเบเบชเบฑเบเปเบเบเปเบเบฑเบเปเบเบฑเบ IPv6
เปเบซเปเบเบดเบเบเบฐเบเบฒเบเบฒเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบเบดเปเบเบเบธเบ IPv6 เบเบฑเบเบซเบกเบปเบเปเบเบเบฒเบเปเบเปเบเบญเบ eth0
. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบเบเบฒเบ tcpdump
เบเปเบงเบเบเบปเบงเบเบญเบเบเบตเปเบเปเบฒเบเบเบฒเบ ip6
:
$ sudo tcpdump -i eth0 ip6
เบเบฑเปเบเบเบฑเปเบเบเบถเปเบ tcpdump
เบฅเบงเบเบฅเบงเบกเบเบปเบงเบเบญเบ ip6
เปเบเบปเปเบฒเปเบเปเบ bytecode เบชเบฐเบเบฒเบเบฑเบเบเบฐ BPF เปเบฅเบฐเบชเบปเปเบเบกเบฑเบเปเบเบซเบฒ kernel (เปเบเบดเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบเบฒเบ eth0
. เบเปเบฒเบเบปเบงเบเบญเบเบชเบปเปเบเบเบทเบเบเปเบฒเบเบตเปเบเปเปเปเบกเปเบเบชเบนเบ n
, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบดเบ n
bytes เบเบญเบเปเบเบฑเบเปเบเบฑเบเบเบฐเบเบทเบเบเบฑเบเบฅเบญเบเปเบชเปเบเบทเปเบเบเบตเปเบเบนเปเปเบเปเปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบซเบฑเบเบกเบฑเบเบขเบนเปเปเบเบเบปเบเบเบฐเบฅเบดเบ tcpdump
.
เบกเบฑเบ turns เปเบซเป เปเบซเบฑเบ เบงเปเบฒ เบเบงเบ เปเบฎเบปเบฒ เปเบเป เบขเปเบฒเบ เบเปเบฒเบ เบเบฒเบ เบชเบฒ เบกเบฒเบ เบเบญเบ เบซเบฒ เบเบตเป bytecode เบเบทเบ เบชเบปเปเบ เปเบ เบซเบฒ kernel tcpdump
เบเปเบงเบเบเบฒเบเบเปเบงเบเปเบซเบผเบทเบญเบเบญเบ tcpdump
, เบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฑเบเบเบฒเบเปเบฅเบทเบญเบ -d
:
$ sudo tcpdump -i eth0 -d ip6
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 3
(002) ret #262144
(003) ret #0
เปเบเปเบชเบฑเปเบเบชเบนเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบชเบฑเปเบ ldh [12]
, เปเบเบดเปเบเบซเบเปเปเบกเบฒเบเบฒเบ "เปเบซเบผเบเปเบเบปเปเบฒเปเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบ A
เปเบเบดเปเบเบซเบเบถเปเบเบเบญเบเบเปเบฒ (16 เบเบดเบ) เบเบตเปเบขเบนเป 12โ เปเบฅเบฐเบเปเบฒเบเบฒเบกเบเบฝเบงเปเบกเปเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเบปเบเบเปเบฒเบเบฐเปเบเบเปเบ? เบเปเบฒเบเบญเบเปเบกเปเบเบขเบนเปเบเบตเป x
เปเบฅเบตเปเบกเบเบปเปเบ (x+1)
th byte เบเบญเบเปเบเบฑเบเปเบเบฑเบเปเบเบทเบญเบเปเบฒเบเบงเบดเปเบเบฒเบฐ. เบเบงเบเปเบฎเบปเบฒเบญเปเบฒเบเปเบเบฑเบเปเบเบฑเบเบเบฒเบเบญเบดเบเปเบเบตเปเบเบเบญเบตเปเบเบตเปเบเบฑเบ eth0
เปเบฅเบฐเบเบตเป
6 6 2
|Destination MAC|Source MAC|Ether Type|...|
เบเบฑเปเบเบเบฑเปเบเบซเบผเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเปเบฒเบชเบฑเปเบ ldh [12]
เบขเบนเปเปเบเบเบฐเบเบฝเบ A
เบเบฐเบกเบตเบเบฒเบเบชเบฐเบซเบเบฒเบก Ether Type
โ เบเบฐโเปเบเบโเบเบญเบโเบเบญเบโเบชเบปเปเบโเปเบโเบเบญเบ Ethernet เบเบตเปโ. เปเบเปเบเบงเบเบต 1 เบเบงเบเปเบฎเบปเบฒเบเบฝเบเบเบฝเบเปเบเบทเปเบญเปเบเบเบญเบเบเบฐเบเบฝเบ A
(เบเบฐเปเบเบเบเบธเบ) เบ 0x86dd
เปเบฅเบฐเบเบตเป jt 2
ะธ jf 3
โ เปเบเบทเปเบญเบโเบซเบกเบฒเบโเบเบตเปโเบเปเบฒเบโเบเปเบฒโเปเบเบฑเบโเบเปเบญเบโเปเบโเบเปเบฒโเบซเบฒเบโเบงเปเบฒโเบเบฒเบโเบเบฝเบโเบเบฝเบโเบชเบปเบโเบเบปเบโเบชเปเบฒโเปเบฅเบฑเบ (A == 0x86dd
) เปเบฅเบฐโเบเปเปโเบชเปเบฒโเปเบฅเบฑเบโ. เบเบฑเปเบเบเบฑเปเบ, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบชเปเบฒเปเบฅเบฑเบเบเบปเบ (IPv6) เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบง 2, เปเบฅเบฐเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเปเปเบชเปเบฒเปเบฅเบฑเบ - เปเบเปเบเบง 3. เปเบเปเบเบงเบเบต 3 เปเบเบฃเปเบเบฃเบกเบชเบดเปเบเบชเบธเบเบฅเบปเบเบเปเบงเบเบฅเบฐเบซเบฑเบ 0 (เบขเปเบฒเบเบฑเบเบฅเบญเบเปเบเบฑเบเปเบเบฑเบ), เปเบเปเบเบงเบเบต 2 เปเบเบฃเปเบเบฃเบกเบเบฐเบชเบดเปเบเบชเบธเบเบเปเบงเบเบฅเบฐเบซเบฑเบ. 262144 (เบเบฑเบเบฅเบญเบเบเปเบญเบเบชเบนเบเบชเบธเบเบเบญเบเปเบเบฑเบเปเบเบฑเบ 256 เบเบดเปเบฅเปเบ).
เบเบปเบงเบขเปเบฒเบเบเบตเปเบชเบฑเบเบชเบปเบเบเบงเปเบฒ: เบเบงเบเปเบฎเบปเบฒเปเบเบดเปเบเปเบเบฑเบเปเบเบฑเบ TCP เปเบเบเบเบญเบเบเบฒเบเบเบฒเบ
เบเปเปเบซเปเปเบเบดเปเบเบงเปเบฒเบเบปเบงเบเบญเบเบกเบตเบฅเบฑเบเบชเบฐเบเบฐเปเบเบเบตเปเบเบฑเบเบฅเบญเบเบเบธเบ TCP เบเบฑเบเบซเบกเบปเบเบเบตเปเบกเบตเบเบญเบเบเบฒเบเบเบฒเบ 666. เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบดเบเบฒเบฅเบฐเบเบฒเบเปเบฅเบฐเบเบต IPv4, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเปเบฅเบฐเบเบต IPv6 เปเบกเปเบเบเปเบฒเบเบเบฒเบเบเบงเปเบฒ. เบซเบผเบฑเบเบเบฒเบเบเบฒเบเบชเบถเบเบชเบฒเบเบปเบงเบขเปเบฒเบเบเบตเป, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบปเปเบเบซเบฒเบเบปเบงเบเบญเบ IPv6 เบเบปเบงเบเปเบฒเบเปเบญเบเปเบเบฑเบเบเบฒเบเบญเบญเบเบเปเบฒเบฅเบฑเบเบเบฒเบ (ip6 and tcp dst port 666
) เปเบฅเบฐเบเบฒเบเบเบฑเปเบเบเบญเบเบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเบเบปเปเบงเปเบ (tcp dst port 666
). เบเบฑเปเบเบเบฑเปเบ, เบเบฒเบเบเบฑเปเบเบเบญเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบปเบเปเบเปเบเบดเปเบเบเบทเบเบฑเปเบเบเบตเป:
$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 10
(002) ldb [23]
(003) jeq #0x6 jt 4 jf 10
(004) ldh [20]
(005) jset #0x1fff jt 10 jf 6
(006) ldxb 4*([14]&0xf)
(007) ldh [x + 16]
(008) jeq #0x29a jt 9 jf 10
(009) ret #262144
(010) ret #0
เบเบงเบเปเบฎเบปเบฒเบฎเบนเปเปเบฅเปเบงเบงเปเบฒเบชเบฒเบ 0 เปเบฅเบฐ 1 เปเบฎเบฑเบเบซเบเบฑเบเปเบเป. เปเบเปเบเบงเบเบต 2 เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบงเบเปเบเบดเปเบเปเบฅเปเบงเบงเปเบฒเบเบตเปเปเบกเปเบเบเบธเบ IPv4 (Ether Type = 0x800
) เปเบฅเบฐโเปเบซเบผเบโเบกเบฑเบโเปเบเบปเปเบฒโเปเบโเปเบโเบเบฒเบโเบเบปเบโเบเบฐโเบเบฝเบโ A
24 byte เบเบญเบเปเบเบฑเบเปเบเบฑเบ. เบเบธเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเบดเปเบเบเบทเบงเปเบฒ
14 8 1 1
|ethernet header|ip fields|ttl|protocol|...|
เบเบถเปเบเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบเบเบฐเบเบฝเบ A
เบเบฒเบเบชเบฐเบซเบเบฒเบก Protocol เบเบญเบเบซเบปเบง IP, เบเบตเปเบกเบตเปเบซเบเบเบปเบ, เปเบเบฒเบฐเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบฑเบเบฅเบญเบเบเบฝเบเปเบเปเปเบเบฑเบเปเบเบฑเบ TCP. เบเบงเบเปเบฎเบปเบฒเบเบฝเบเบเบฝเบเบญเบฐเบเบธเบชเบฑเบเบเบฒเบเบฑเบ 0x6
(IPPROTO_TCP
เปเบเปเบเบงเบเบต 4 เปเบฅเบฐ 5 เบเบงเบเปเบฎเบปเบฒเปเบซเบฅเบ halfwords เบเบตเปเบเบฑเปเบเบขเบนเปเบเบตเปเบขเบนเป 20 เปเบฅเบฐเปเบเปเบเปเบฒเบชเบฑเปเบ jset
เบเบงเบเปเบเบดเปเบเบงเปเบฒเบซเบเบถเปเบเปเบเบชเบฒเบกเปเบกเปเบเบเบทเบเบเปเบฒเบเบปเบ jset
เบชเบฒเบก bits เบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบเปเบกเปเบเปเบเปเบเบทเบเปเบเบฑเบเบเบนเป. เบชเบญเบเปเบเบชเบฒเบกเบเบดเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบงเปเบฒเปเบเบฑเบเปเบเบฑเบเปเบกเปเบเบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบเบธเบ IP เบเบตเปเปเบเบเปเบเบ, เปเบฅเบฐเบเปเบฒเปเบเบฑเบเบเบฑเปเบเบเบฑเปเบ, เบเปเปเบงเปเบฒเบเบฐเปเบเบฑเบเบเบดเปเบเบชเบธเบเบเปเบฒเบ. เบเบดเบเบเบตเบชเบฒเบกเบเบทเบเบชเบฐเบซเบเบงเบเปเบงเป เปเบฅเบฐเบเปเบญเบเปเบเบฑเบเบชเบนเบ. เบเบงเบโเปเบฎเบปเบฒโเบเปเปโเบเปเบญเบโเบเบฒเบโเบเบตเปโเบเบฐโเบเบงเบโเบชเบญเบโเบเบฑเบโเบซเบกเบปเบโเบเปเปโเบเบปเบโเบเปเบงเบโเบซเบผเบทโเปเบเบโ, เบเบฑเปเบโเบเบฑเปเบโเบเบงเบโเปเบฎเบปเบฒโเบเบงเบโเบชเบญเบโเบเบฑเบโเบชเบฒเบก bitsโ.
เปเบเบงเบเบต 6 เปเบกเปเบเบซเบเปเบฒเบชเบปเบเปเบเบเบตเปเบชเบธเบเปเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบตเป. เบเบฒเบเบชเบฐเปเบเบเบญเบญเบ ldxb 4*([14]&0xf)
เบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบเบเบฐเบเบฝเบ X
เบชเบตเปเบเบดเบเบเบตเปเบชเบณเบเบฑเบเปเปเบญเบเบชเบธเบเบเบญเบเบชเบดเบเบซเปเบฒเปเบเบเปเบเบญเบเปเบเบฑเบเปเบเบฑเบเบเบนเบเบเปเบงเบ 4. เบชเบตเปเบเบดเบเบเบตเปเบชเบณเบเบฑเบเปเปเบญเบเบชเบธเบเบเบญเบเปเบเบชเบดเบเบซเปเบฒเปเบกเปเบเบเปเบญเบเบเปเปเบกเบนเบ 4*([14]&0xf)
เปเบกเปเบเบเบฒเบเบเปเบฒเบเบปเบเบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบเบเบตเปเบขเบนเปเบเบดเปเบชเบเบเบตเปเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเปเบเปเปเบเบฎเบนเบเปเบเบเบเบตเปเปเบฅเบฐเบเบฝเบเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบ X
, i.e. เบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเปเบงเบปเปเบฒเปเบเป ldb 4*([14]&0xf)
neither 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 bytecode เปเบเบปเปเบฒเปเบเปเบ kernel เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบ packet. เปเบงเบปเปเบฒเปเบเบเบเบปเปเบงเปเบ, tcpdump
ported เบเบฑเบเบซเบผเบฒเบเบฅเบฐเบเบปเบเปเบฅเบฐเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบ 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? เบกเบฑเบ turns เปเบซเป เปเบซเบฑเบ เบงเปเบฒ เบเบตเป libpcap
เปเบเบดเปเบเปเบเบเบเบงเบเปเบฎเบปเบฒ - เปเบเบทเปเบญเปเบซเปเบเบปเบเบเบฐเบฅเบดเบเบเบญเบเบเบฒเบเบเบฑเปเบเบเบญเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเปเปเบฅเบงเบกเปเบญเบปเบฒเบเบธเบเบเบตเปเบเปเปเบเปเปเบเบเบฑเบเบกเบฑเบ, เบซเปเบญเบเบชเบฐเบซเบกเบธเบ ret #0
(เบเบดเปเบกเปเบเบฑเบเปเบเบฑเบเบเบฑเบเปเบปเบ), เบชเบฐเบซเบผเบฑเบเบเบฑเบญเบเปเบเบฑเบเปเบเบฑเบเปเปเบเบเปเปเบเบดเบเบเบฑเปเบ เปเบฅเบฐเบเบฐเบเบฒเบเบฒเบกเบฅเบปเบเปเบเบฑเบเปเบเบฑเบเบเบฑเบเปเบปเบเบเบตเปเบชเบฒเบกเบฒเบเบเบปเบเบขเบนเปเบเบฒเบเบเบปเบงเบเบญเบเบเปเบญเบเปเปเบฒ.
เปเบเบเปเบฒเบเบงเบเบเบฑเบเบซเบกเบปเบ, เปเบเบทเปเบญเบเบฒเบเบเบฑเปเบเบเบญเบเบเบธเบเปเบ Linux เปเบเบเปเบเป BPF เบเบฅเบฒเบชเบชเบดเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบกเบตเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฎเบนเบเปเบเบเบเบญเบเปเบเบเบชเปเบฒเบเปเบเบฑเปเบ: struct sock_fprog
เปเบฅเบฐเปเบเบปเปเบฒเบชเบฝเบเปเบเบตเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบปเบงเบเบญเบเบชเบฒเบกเบฒเบเบเบดเบเบเบฑเบเปเบเบปเปเบฒเบฎเบฑเบเปเบเบเปเบเปเบเบฒเบเปเบเบฅเบฐเบเบปเบ setsockopt
.
เบซเบเปเบฒเบชเบปเบเปเบ, เบเบฒเบเบเบฑเปเบเบเบญเบเบชเบฒเบกเบฒเบเบเบดเบเบเบฑเบเปเบเบปเปเบฒเบชเบฝเบเปเบเป, เบเปเปเบเบฝเบเปเบเปเบงเบฑเบเบเบธเบเบดเบ. เบเบตเปเบเบตเป
เบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเปเบฒเปเบเป setsockopt
เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบปเบงเบเบญเบ, เปเบเบดเปเบ struct sock_fprog
เปเบเบเบเปเปเบกเบตเบเบฒเบเบเปเบงเบเปเบซเบผเบทเบญ tcpdump
เบเบงเบเปเบฎเบปเบฒเบเบฐเบชเบปเบเบเบฐเบเบฒเปเบเบเบฒเบ
BPF เบเบฅเบฒเบชเบชเบดเบเปเบฅเบฐเบชเบฐเบเบฐเบงเบฑเบเบเบต 21st
BPF เปเบเปเบฅเบงเบกเบขเบนเปเปเบ Linux เปเบเบเบต 1997 เปเบฅเบฐเบเบฑเบเบเบปเบเปเบเบฑเบ workhorse เปเบเบฑเบเปเบงเบฅเบฒเบเบปเบ libpcap
เปเบเบเบเปเปเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเบเบดเปเบชเบเปเบเป (เบเบฒเบเบเปเบฝเบเปเบเบเบชเบฐเปเบเบฒเบฐ Linux, เปเบเปเบเบญเบ, x86_64
เบฅเบฐเบซเบฑเบ.
JIT compiler เปเบกเปเบเบเบฑเปเบเบเปเบฒเบญเบดเบเปเบเบฅเบฐเบเบปเบเบเปเบญเบเปเบชเปเบเบฒเบเบเปเบฝเบเปเบเบ: เปเบเบเบต 2012 xt_bpf
, เปเบเบดเปเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฒเบเบเบฝเบเบเบปเบเบฅเบฐเบเบฝเบเบชเปเบฒเบฅเบฑเบ iptables
เบเปเบงเบเบเบฒเบเบเปเบงเบเปเบซเบผเบทเบญเบเบญเบ BPF, เปเบฅเบฐเปเบเปเบเบทเบญเบเบเบธเบฅเบฒ 2013 เปเบกเปเบ cls_bpf
, เปเบเบดเปเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฒเบเบเบฝเบเบเบฒเบเบเบฑเบเบเบฐเปเบเบเบเบฒเบเบเบฐเบฅเบฒเบเบญเบเปเบเบเปเบเป BPF.
เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบดเปเบเบเบปเบงเบขเปเบฒเบเบเบฑเบเบซเบกเบปเบเปเบซเบผเบปเปเบฒเบเบตเปเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเปเบเปเบงเปเบเบตเป, เปเบเปเบเปเบฒเบญเบดเบเบกเบฑเบเบเบฐเปเบเบฑเบเบเบฐเปเบซเบเบเบชเปเบฒเบฅเบฑเบเบเบงเบเปเบฎเบปเบฒเบเบตเปเบเบฐเบฎเบฝเบเบฎเบนเปเบงเบดเบเบตเบเบฒเบเบเบฝเบเปเบฅเบฐเบฅเบงเบเบฅเบงเบกเบเบฑเบเบเบฒเปเบเบเบเบฒเบ arbitrary เบชเปเบฒเบฅเบฑเบ BPF, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบชเบฐเบซเบเบญเบเปเบซเปเปเบเบเบซเปเบญเบเบชเบฐเบซเบกเบธเบ. libpcap
เบเปเบฒเบเบฑเบ (เบเบปเบงเบขเปเบฒเบเบเปเบฒเบเป: เบเบฒเบเบเบฑเปเบเบเบญเบเบเบตเปเบชเปเบฒเบเบเบถเปเบ libpcap
เบชเบฒเบกเบฒเบเบชเบปเปเบเบเบทเบเบเบฝเบเปเบเปเบชเบญเบเบเปเบฒ - 0 เบซเบผเบท 0x40000) เบซเบผเบทเปเบเบเบเบปเปเบงเปเบ, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเปเบฅเบฐเบเบตเบเบญเบ seccomp, เปเบกเปเบเบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบเป.
เบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบก BPF เบเปเบงเบเบกเบทเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบญเบ
เปเบซเปเบเบงเบเปเบฎเบปเบฒเบฎเบนเปเบเบฑเบเบเบฑเบเบฎเบนเบเปเบเบเบเบนเปเบเบญเบเบเปเบฒเปเบเบฐเบเปเบฒ BPF, เบกเบฑเบเบเปเบฒเบเบเบฒเบเบซเบผเบฒเบ:
16 8 8 32
| code | jt | jf | k |
เปเบเปเบฅเบฐเบเปเบฒเปเบเบฐเบเปเบฒเบเบญเบเบเบญเบ 64 เบเบดเบ, เปเบเบดเปเบ 16 เบเบดเบเบเปเบฒเบญเบดเบเปเบกเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเปเบเบฐเบเปเบฒ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบกเบตเบชเบญเบเบซเบเปเปเบซเบเปเบฒเปเบเบเบเบดเบ, jt
ะธ jf
, เปเบฅเบฐ 32 bits เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเปเบเบฝเบ 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;
}
เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบกเปเบเปเปเบฅเปเบง (เบเบปเบงเบขเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบฎเบนเปเบฅเบฐเบซเบฑเบเบเปเบฒเปเบเบฐเบเปเบฒเบเบฒเบ 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))
เบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเปเบเบฎเบนเบเปเบเบเบเบญเบเบฅเบฐเบซเบฑเบเปเบเบทเปเบญเบเบเบฑเบเปเบกเปเบเบเปเปเบชเบฐเบเบงเบเบซเบผเบฒเบ, เปเบเปเบเบฒเบเบเบฑเปเบเบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบ (เบเบปเบงเบขเปเบฒเบเปเบเบฑเปเบ: เบชเปเบฒเบฅเบฑเบ debugging, เบเบฒเบเบชเปเบฒเบเบเบฒเบเบเบปเบเบชเบญเบเบซเบเปเบงเบเบเบฒเบ, เบเบฒเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบHabre, เปเบฅเบฐเบญเบทเปเบเป). เปเบเบทเปเบญเบเบงเบฒเบกเบชเบฐเบเบงเบ, เปเบเปเบเบฅเป <linux/filter.h>
macro เบเบนเปเบเปเบงเบเปเบกเปเบเบเบทเบเบเปเบฒเบเบปเบ - เบเบปเบงเบขเปเบฒเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเปเบฒเบเปเบเบดเบเบชเบฒเบกเบฒเบเบเบทเบเบเบฝเบเบเบทเบเปเบซเบกเปเปเบเบฑเบ
struct sock_filter code[] = {
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
BPF_STMT(BPF_RET|BPF_K, 0x00040000),
BPF_STMT(BPF_RET|BPF_K, 0),
}
เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบฒเบเปเบฅเบทเบญเบเบเบตเปเปเบกเปเบเบเปเปเบชเบฐเบเบงเบเบซเบผเบฒเบ. เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเบฑเบเบเบฝเบเปเบเบฅเปเบเบฅเบก Linux kernel เบชเบปเบกเปเบซเบเบชเบปเบกเบเบปเบ, เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบขเบนเปเปเบเปเบเปเบฅเบเบฐเบเปเบฅเบต tools/bpf
เบเบฒโเบชเบฒโเบชเบฐโเบเบฒโเปเบซเปเบโเปเบกเปเบโเบเปเบฒเบโเบเบทโเบเบฑเบโเบซเบผเบฒเบโเบเบฑเบ debug outputโ tcpdump
, เปเบเปเบเบญเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบฅเบฐเบเบธเบเปเบฒเบเบชเบฑเบเบเบฒเบฅเบฑเบ. เบเบปเบงเบขเปเบฒเบ, เบเบตเปเปเบกเปเบเปเบเบฃเปเบเบฃเบกเบเบตเปเบเบดเปเบกเปเบเบฑเบเปเบเบฑเบเบเบฑเบเปเบปเบเบเบปเบเปเบงเบฑเปเบ TCP/IPv4:
$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0
เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ, เบเบปเบงเบเบฐเบเบญเบเบชเปเบฒเบเบฅเบฐเบซเบฑเบเปเบเบฎเบนเบเปเบเบ <ะบะพะปะธัะตััะฒะพ ะธะฝััััะบัะธะน>,<code1> <jt1> <jf1> <k1>,...
, เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบ TCP เบกเบฑเบเบเบฐเปเบเบฑเบ
$ tools/bpf/bpf_asm /tmp/tcp-over-ipv4.bpf
6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 6,6 0 0 4294967295,6 0 0 0,
เปเบเบทเปเบญเบเบงเบฒเบกเบชเบฐเบเบงเบเบชเบฐเบเบฒเบเบเบญเบเบเบฑเบเบเบฝเบเปเบเบฅเปเบเบฅเบก C, เบฎเบนเบเปเบเบเบเบปเบเบเบฐเบฅเบดเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเป:
$ tools/bpf/bpf_asm -c /tmp/tcp-over-ipv4.bpf
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 0, 1, 0x00000006 },
{ 0x06, 0, 0, 0xffffffff },
{ 0x06, 0, 0, 0000000000 },
เบเปเปเบเบงเบฒเบกเบเบตเปเบชเบฒเบกเบฒเบเบเบทเบเบเบฑเบเบฅเบญเบเปเบเบปเปเบฒเปเบเปเบเบเปเบฒเบเบดเบเบฒเบกเปเบเบเบชเปเบฒเบเบเบฐเปเบเบ struct sock_filter
เบเบฑเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเปเบฎเบฑเบเปเบเบเบญเบเบเบปเปเบเบเบญเบเบเบฒเบเบเบตเป.
เบชเปเบงเบเบเบฐเบซเบเบฒเบ Linux เปเบฅเบฐ netsniff-ng
เบเบญเบเปเบซเบเบทเบญเปเบเบเบฒเบเบกเบฒเบเบเบฐเบเบฒเบ BPF, Linux เปเบฅเบฐ tools/bpf/bpf_asm
เบชเบฐโเบซเบเบฑเบโเบชเบฐโเบซเบเบนเบโเปเบฅเบฐโ struct sk_buff
, เปเบเบดเปเบเบญเบฐเบเบดเบเบฒเบเบเบธเบเปเบเบทเบญเบเปเบฒเบเปเบ kernel. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบฑเบเบกเบตเบเปเบฒเปเบเบฐเบเปเบฒเบเบญเบเบเบนเปเบเปเบงเบเบเบฐเปเบเบเบญเบทเปเบเป, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ ldw cpu
เบเบฐเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบเบเบฐเบเบฝเบ A
เบเบปเบเปเบเปเบฎเบฑเบเบเบญเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบ kernel raw_smp_processor_id()
. (เปเบเบชเบฐเบเบฑเบเปเบซเบกเปเบเบญเบ BPF, เบเบฒเบเบเบฐเบซเบเบฒเบเบเบตเปเบเปเปเปเบกเปเบเบกเบฒเบเบเบฐเบเบฒเบเปเบซเบผเบปเปเบฒเบเบตเปเปเบเปเบเบทเบเบเบฐเบซเบเบฒเบเบญเบญเบเปเบเบทเปเบญเปเบซเปเปเบเบเบเบฒเบเบเบตเปเบกเบตเบเบธเบเบเบญเบเบเบปเบงเบเปเบงเบ kernel เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ, เปเบเบเบชเปเบฒเบ, เปเบฅเบฐเบเบฒเบเบชเปเบฒเบเปเบซเบเบเบฒเบ.) เบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบเบเบญเบเบเบปเบงเบเบญเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบฅเบญเบเบเบฝเบเปเบเปเบเบปเบงเบเบญเบ packet headers เปเบเบปเปเบฒเปเบเปเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเปเปเบเบเปเบเปเบชเปเบงเบเบเบฐเบซเบเบฒเบ poff
, เบเปเบฒเบเบปเบเปเบเบตเบ payload:
ld poff
ret a
เบเบฒเบเบเบฐเบซเบเบฒเบ BPF เบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบ tcpdump
, เปเบเปเบเบตเปเปเบกเปเบเปเบซเบเบเบปเบเบเบตเปเบเบตเบเบตเปเบเบฐเบฎเบนเปเบเบฑเบเบเบฑเบเบเบธเบเบเบปเบเบเบฐเปเบซเบเบ netsniff-ng
netsniff-ng
, เปเบเบดเปเบ, เบเบญเบเปเบซเบเบทเบญเบเบฒเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบเปเบเป BPF, เบเบฑเบเบกเบตเปเบเบทเปเบญเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฐเบฅเบฒเบเบญเบเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบ, เปเบฅเบฐเบกเบตเบเบงเบฒเบกเบเปเบฒเบงเบซเบเปเบฒเบเบงเปเบฒ. tools/bpf/bpf_asm
, เบเบนเปเบเบฐเบเบญเบ BPF เปเบญเบตเปเบเบงเปเบฒ bpfc
. เบเบธเบเบเบฐเบเบญเบเบเปเบงเบเปเบญเบเบฐเบชเบฒเบเบเบตเปเบเปเบญเบเบเปเบฒเบเบฅเบฐเบญเบฝเบ, เปเบเบดเปเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบเบญเบเบเปเบฒเบเบเบญเบเบเบปเบเบเบงเบฒเบก.
seccomp
เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบฎเบนเปเบงเบดเบเบตเบเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบก BPF เบเบญเบเบเบงเบฒเบกเบชเบฑเบเบชเบปเบเบเบตเปเบเบปเบเปเบญเบเบกเบฑเบเปเบฅเบฐเบเปเบญเบกเบเบตเปเบเบฐเปเบเบดเปเบเบเบปเบงเบขเปเบฒเบเปเบซเบกเป, เบเปเบฒเบญเบดเบเปเบกเปเบเปเบเบฑเบเปเบเปเบฅเบขเบต seccomp, เปเบเบดเปเบเบญเบฐเบเบธเบเบฒเบเปเบซเป, เบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบเบญเบ BPF, เปเบเบทเปเบญเบเบฑเบเบเบฒเบเบเบธเบเปเบฅเบฐเบเบธเบเบเบญเบเบเบฒเบเปเบเปเบเบฝเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบตเปเบกเบตเบขเบนเป. เบเบฐโเบเบงเบโเบเบฒเบโเบเบตเปโเปเบเปโเบฎเบฑเบโเปเบฅเบฐโเบฅเบนเบโเบซเบฅเบฒเบโเบเบญเบโเบเบปเบโ.
เบฎเบธเปเบเบเปเบฒเบญเบดเบเบเบญเบ seccomp เปเบเปเบเบทเบเปเบเบตเปเบกเปเบเบปเปเบฒเปเบ kernel เปเบเบเบต 2005 เปเบฅเบฐเบเปเปเปเบเบฑเบเบเบตเปเบเบดเบเบปเบกเบซเบผเบฒเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบกเบฑเบเบชเบฐเบซเบเบญเบเบเบฒเบเปเบฅเบทเบญเบเบเบฝเบง - เปเบเบทเปเบญเบเปเบฒเบเบฑเบเบเบธเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบตเปเบกเบตเบขเบนเปเปเบเบเบฐเบเบงเบเบเบฒเบเบเปเปเปเบเบเบตเป: read
, write
, exit
ะธ sigreturn
, เปเบฅเบฐเบเบฐเบเบงเบเบเบฒเบเบเบตเปเบฅเบฐเปเบกเบตเบเบเบปเบเบฅเบฐเบเบฝเบเปเบเปเบเบทเบเบเปเบฒเบเบฒเบเปเบเบเปเบเป SIGKILL
. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบเบต 2012, seccomp เปเบเปเปเบเบตเปเบกเบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบเบญเบ BPF, เบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบเบปเบเบเบธเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบตเปเปเบเปเบฎเบฑเบเบญเบฐเบเบธเบเบฒเบเปเบฅเบฐเปเบกเปเบเบฐเบเบฑเปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบงเบเบชเบญเบเบเบฒเบเปเบเปเบเบฝเบเบเบญเบเบเบงเบเปเบเบปเบฒ. (เปเปเบฒเบชเบปเบเปเบ, Chrome เปเบกเปเบเบซเบเบถเปเบเปเบเบเบฑเบเบเบฒเบเบนเปเปเบเปเบเปเบฒเบญเบดเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบเบตเป, เปเบฅเบฐเบเบฐเบเบฒเบเบปเบ Chrome เบเปเบฒเบฅเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบปเบเปเบ KRSI เปเบเบเบญเบตเบเปเบชเป BPF เบฎเบธเปเบเปเบซเบกเปเปเบฅเบฐเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฑเบเปเบเปเบ Linux Security Modules.) เบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเปเบญเบเบฐเบชเบฒเบเปเบเบตเปเบกเปเบเบตเบกเบชเบฒเบกเบฒเบเบเบปเบเปเบเปเปเบเบเปเบฒเบ. เบเบญเบเบเบปเบเบเบงเบฒเบก.
เปเบซเปเบชเบฑเบเปเบเบเบงเปเบฒเบกเบตเบเบปเบเบเบงเบฒเบกเบขเบนเปเปเบเบชเบนเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเปเบเป seccomp เปเบฅเปเบง, เบเบฒเบเบเบตเบเบปเบเบญเบฒเบเบเบฐเบเปเบญเบเบเบฒเบเบญเปเบฒเบเบกเบฑเบเบเปเบญเบ (เบซเบผเบทเปเบเบเบเบตเปเบเบฐ) เบญเปเบฒเบเบชเปเบงเบเบเปเบญเบเบเปเปเปเบเบเบตเป. เปเบเบเบปเบเบเบงเบฒเบก
เบเปเปเปเบเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบดเปเบเบงเบดเบเบตเบเบฒเบเบเบฝเบเปเบฅเบฐเบเบฒเบเปเบซเบผเบเบเบปเบงเบเบญเบเบชเปเบฒเบฅเบฑเบ seccomp
เปเบ C เปเบเบปเปเบฒเปเบฅเบฐเบเบฒเบเบเปเบฒเปเบเปเบซเปเบญเบเบชเบฐเบซเบกเบธเบ libseccomp
เปเบฅเบฐเบเปเปเบเบตเปเบฅเบฐเบเปเปเปเบชเบเบเบญเบเปเบเปเบฅเบฐเบเบฒเบเปเบฅเบทเบญเบเปเบกเปเบเบซเบเบฑเบ, เปเบฅเบฐเบชเบธเบเบเปเบฒเบ, เปเบซเปเปเบเบดเปเบเบงเปเบฒ seccomp เบเบทเบเปเบเปเปเบเบเปเบเบเบเบฒเบเปเบเบงเปเบ strace
.
เบเบฒเบเบเบฝเบเปเบฅเบฐเบเบฒเบเปเบซเบผเบเบเบปเบงเบเบญเบเบชเปเบฒเบฅเบฑเบ seccomp
เบเบงเบเปเบฎเบปเบฒเบฎเบนเปเบงเบดเบเบตเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบก BPF เปเบฅเปเบง, เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบญเบดเบเปเบซเปเปเบเบดเปเบเบเบฒเบเปเบเปเบเบญเบเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบก seccomp. เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบเบปเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฅเบฐเบเบฑเบเบเบฐเบเบงเบเบเบฒเบ, เปเบฅเบฐเบเบฐเบเบงเบเบเบฒเบเปเบเบฑเบเบเปเบญเบเบเบฑเบเบซเบกเบปเบเบเบฐเบชเบทเบเบเบญเบเบเปเปเบเปเบฒเบเบฑเบ. เบเบตเปเปเบกเปเบเปเบฎเบฑเบเปเบเปเปเบเบเปเบเปเบเบฒเบเปเบเบฅเบฐเบเบปเบ seccomp(2)
seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)
เบเปเบญเบเบเบตเป &filter
- เบเบตเปเปเบกเปเบเบเบปเบงเบเบตเปเปเบเบดเบเปเบเบเบชเปเบฒเบเบเบตเปเบเบธเปเบเปเบเบตเบเบเบฑเบเบเบงเบเปเบฎเบปเบฒ struct sock_fprog
, i.e. เปเบเบเบเบฒเบ BPF.
เปเบเบฅเปเบเบฅเบกเบชเปเบฒเบฅเบฑเบ seccomp เปเบเบเบเปเบฒเบเบเบฒเบเปเบเบผเปเบเบผเบกเบชเปเบฒเบฅเบฑเบ sockets เปเบเบงเปเบ? เบชเบฐเบเบฒเบเบเบฒเบเบเปเบฒเบเบเบญเบ. เปเบเบเปเบฅเบฐเบเบตเบเบญเบ sockets, เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบเบทเปเบเบเบตเปเบเบงเบฒเบกเบเบปเบเบเปเบฒเบเบตเปเบเบฐเบเบญเบเบเปเบงเบ packet, เปเบฅเบฐเปเบเบเปเบฅเบฐเบเบตเบเบญเบ seccomp เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเปเบเบเบชเปเบฒเบเปเบเบฑเปเบ:
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};
เบกเบฑเบเปเบเบฑเบ nr
เปเบกเปเบเบเบปเบงเปเบฅเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบตเปเบเบฐเปเบเบตเบเบเบปเบง, arch
- เบชเบฐโเบเบฒโเบเบฑเบโเบเบฐโเบเบฑเบโเบเบธโเบเบฑเบ (เปเบเบตเปเบกโเปเบเบตเบกโเบเปเบฝเบงโเบเบฑเบโเบเบฒเบโเบเปเบฒเบโเบฅเบธเปเบกโเบเบตเปโ)โ, args
- เปเบเบดเบเบซเบปเบเบเบฒเบเปเบเปเบเบฝเบเบเบฒเบเปเบเบฅเบฐเบเบปเบ, เปเบฅเบฐ instruction_pointer
เปเบกเปเบเบเบปเบงเบเบตเปเปเบเบซเบฒเบเปเบฒเปเบเบฐเบเปเบฒเบเบทเปเบเบเบตเปเบเบญเบเบเบนเปเปเบเปเบเบตเปเปเบฎเบฑเบเปเบซเปเบฅเบฐเบเบปเบเบเบฒเบเปเบ. เบเบฑเปเบเบเบฑเปเบ, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เบเบฒเบเปเบซเบผเบเบเปเบฒเบเบงเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเปเบเบปเปเบฒเปเบเปเบเบเบฐเบเบฝเบ A
เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเปเบงเบปเปเบฒ
ldw [0]
เบกเบตเบฅเบฑเบเบชเบฐเบเบฐเบญเบทเปเบเปเบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบ seccomp, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เบชเบฐเบเบฒเบเบเบฒเบเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเปเปเบเบเบเบฒเบเบงเบฒเบ 32-bit เปเบฅเบฐเบเปเบฒเบเบเปเปเบชเบฒเบกเบฒเบเปเบซเบฅเบเปเบเบดเปเบเบซเบเบถเปเบเบเปเบฒเบซเบผเบท byte - เปเบเปเบงเบฅเบฒเบเบตเปเบเบฐเบเบฒเบเบฒเบกเปเบซเบผเบเบเบฒเบเบเบฑเปเบเบเบญเบ. ldh [0]
เปเบเบฅเบฐเบเบปเบ seccomp
เบเบฐเบเบฑเบเบเบทเบเบกเบฒ EINVAL
. เบเบฑเบเบเบฑเบเบเบงเบเบชเบญเบเบเบฒเบเบเบฑเปเบเบเบญเบเบเบตเปเปเบซเบฅเบ seccomp_check_filter()
mod
(เบเบฒเบเปเบเปเบเบชเปเบงเบเบเบตเปเบเบฑเบเปเบซเบผเบทเบญ) เปเบฅเบฐเบเบญเบเบเบตเปเบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเบชเบณเบฅเบฑเบเปเบเบเบเบฒเบ BPF seccomp, เบเบฑเบเบเบฑเปเบเปเบเปเบเบฒเบเปเบเบตเปเบกเบเบญเบเบกเบฑเบ
เปเบเบเบเบทเปเบเบเบฒเบเปเบฅเปเบง, เบเบงเบเปเบฎเบปเบฒเบฎเบนเปเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบเบทเปเบญเบเบฝเบเปเบฅเบฐเบญเปเบฒเบเปเบเบเบเบฒเบ 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 เบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบงเบเบเบธเบกเบเบปเบเปเบเปเบฎเบฑเบเปเบเปเบขเปเบฒเบเปเบเบฑเบกเบเบตเป, เปเบเปเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ, เบเบฒเบเบเบฑเปเบเบกเบฑเบเบเปเปเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเบกเบตเบฅเบฐเบซเบฑเบเปเบเบเปเบเบทเปเบญเบเบเบตเปเปเบฅเบฐ / เบซเบผเบทเบชเบฒเบกเบฒเบเบญเปเบฒเบเปเบเป. เบซเปเบญเบเบชเบฐเบซเบกเบธเบเบเบฐเบเปเบงเบเบเบงเบเปเบฎเบปเบฒเปเบเปเบฅเบทเปเบญเบเบเบตเป
เบเบปเบงเบขเปเบฒเบ, เปเบซเปเบเบฝเบเปเบเบผเปเบเบผเบกเบเบตเปเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบฅเปเบเบนเปเบเบญเบเบเบฒเบเปเบฅเบทเบญเบเบเบญเบเบเบนเปเปเบเป, เปเบเบเปเบเปเบเบดเบเบเบฑเปเบเบเบฑเบเบเบตเบเปเบฒเบเบญเบเบฅเบฐเบเบปเบเบเบฒเบเปเบเบเบฒเบ.
#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]);
}
เบเปเบญเบเบญเบทเปเบ เปเบปเบ เบเบงเบเปเบฎเบปเบฒ เบเบณ เบเบปเบ array sys_numbers
เบเบญเบ 40+ เบเปเบฒเบเบงเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบตเปเบเบฐเบเบฑเบ. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เปเบฅเบตเปเบกเบเบปเปเบเบชเบฐเบเบฒเบเบเบฒเบ ctx
เปเบฅเบฐเบเบญเบเบซเปเบญเบเบชเบฐเปเบธเบเบชเบดเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบซเป (SCMP_ACT_ALLOW
) เบเบฒเบโเปเบโเบฅเบฐโเบเบปเบโเบเบฑเบโเบซเบกเบปเบโเปเบเบฑเบโเบเปเบฒโเปเบฅเบตเปเบกโเบเบปเปเบ (เบกเบฑเบโเบเปเบฒเบโเบเบถเปเบโเบเบตเปโเบเบฐโเบชเปเบฒเบโเบเบฑเบโเบเบตโเบเปเบฒโ)โ. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบซเบเบถเปเบเปเบเบเบซเบเบถเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบเบตเปเบกเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบฑเบเบซเบกเบปเบเบเบฒเบเบเบฑเบเบเบตเบเปเบฒ. เปเบเบเบฒเบเบเบญเบเบชเบฐเบซเบเบญเบเบเปเปเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบฒเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเป, เบเบงเบเปเบฎเบปเบฒเบฎเปเบญเบเบเป SCMP_ACT_TRAP
, เปเบเบเปเบฅเบฐเบเบตเบเบตเป seccomp เบเบฐเบชเบปเปเบเบชเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบเบงเบเบเบฒเบ SIGSYS
เบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเปเบเบฅเบฐเปเบกเบตเบเบเบปเบเบฅเบฐเบเบฝเบ. เบชเบธเบเบเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบซเบฅเบเปเบเบเบเบฒเบเปเบเบปเปเบฒเปเบเปเบ kernel เปเบเบเปเบเป 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
, fitting เบฅเบฐเบซเบฑเบเบเบตเปเบเปเปเปเบกเปเบ trivial เปเบเบฑเบเบชเบตเปเปเบเบง. เปเบเบเบปเบงเบขเปเบฒเบเบเปเบฒเบเปเบเบดเบ, เบเปเบฒเบกเบตเบเปเบฒเบเบงเบเบซเบฅเบฒเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบ, เปเบงเบฅเบฒเบเบฐเบเบดเบเบฑเบเบชเบฒเบกเบฒเบเบซเบผเบธเบเบฅเบปเบเบขเปเบฒเบเปเบซเบฑเบเปเบเปเบเบฑเบ, เปเบเบฒเบฐเบงเปเบฒเบเบฒเบเบเบงเบเบชเบญเบเปเบกเปเบเบเบฝเบเปเบเปเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบเบฒเบเบเบฝเบเบเบฝเบ. เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบ, libseccomp เบเปเปเบเบปเบเบกเบฒเบเบตเปเบกเบต SCMP_FLTATR_CTL_OPTIMIZE
. เบเบฒเบเบเบฑเปเบเบเปเบฒเบเบธเบเบฅเบฑเบเบชเบฐเบเบฐเบเบตเปเปเบเบฑเบ 2 เบเบฐเบเปเบฝเบเบเบปเบงเบเบญเบเปเบเบปเปเบฒเปเบเปเบเปเบเบเบเบฒเบเบเบปเปเบเบซเบฒเบเบฒเบเบชเบญเบ.
เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบเบดเปเบเบงเปเบฒเบเบปเบงเบเบญเบเบเบฒเบเบเบปเปเบเบซเบฒเบเบนเปเปเบฎเบฑเบเบงเบฝเบเปเบเบงเปเบ, เปเบซเปเปเบเบดเปเบ
$ 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 เบเปเปเบชเบฒเบกเบฒเบเบเบณเปเบเบตเบเบเบฒเบ indentation jumps เปเบเป (เบเบปเบงเบขเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเป. jmp A
เบซเบผเบท jmp [label+X]
) เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบเบฒเบเบซเบฑเบเบเปเบฝเบเบเบฑเบเบซเบกเบปเบเปเบกเปเบเบเบปเบเบเบตเป.
seccomp เปเบฅเบฐ strace
เบเบธเบเบเบปเบเบฎเบนเปเบเบฑเบเบเบฐเปเบซเบเบ strace
เปเบเบฑเบเปเบเบทเปเบญเบเบกเบทเบเบตเปเบเบฒเบเบเปเปเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบถเบเบชเบฒเบเบถเบเบเบดเบเปเบฒเบเบญเบเบเบฐเบเบงเบเบเบฒเบเปเบ Linux. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบซเบผเบฒเบเบเบปเบเบเบฑเบเปเบเปเบเบดเบเบเปเบฝเบงเบเบฑเบ strace
เบเบฐเบเบดเบเบฑเบเปเบเบเบเปเบฒเปเบเป ptrace(2)
, เปเบฅเบฐเปเบเบเบปเบเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเบฅเบฐเบเบธเปเบเปเบงเปเบฒเบเบธเบเบเบญเบเบฅเบฐเบเบปเบเบเบฒเบเปเบเบซเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบขเบธเบเบเบฐเบเบงเบเบเบฒเบ, i.e., เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เบเปเบฒเบชเบฑเปเบ.
$ 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
, เปเบฅเบฐเบญเบทเปเบเป.
เบเปเบงเบ 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.
เปเบกเบทเปเบญเปเบเปเบเบฒเบเปเบฅเบทเบญเบ --seccomp-bpf
เบกเบตเบชเบญเบเบเปเปเบเปเบฒเบเบฑเบ. เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบกเบฑเบเบเบฐเบเปเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเบฎเปเบงเบกเบเบฐเบเบงเบเบเบฒเบเบเบตเปเบกเบตเบขเบนเปเปเบฅเปเบงเปเบเป (เบเบฒเบเปเบฅเบทเบญเบ -p
เบเบฑเบเบเบฒเปเบเบเบเบฒเบ strace
), เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบตเปเบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเปเบเบ seccomp. เบญเบฑเบเบเบตเบชเบญเบ, เบเปเปเบกเบตเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเป เบเปเป เปเบเบดเปเบเบเบฐเบเบงเบเบเบฒเบเบเบญเบเปเบเบฑเบเบเปเบญเบ, เบเบฑเบเบเบฑเปเบเปเบเปเบเบปเบงเบเบญเบ seccomp เปเบกเปเบเบชเบทเบเบเบญเบเปเบเบเบเบฐเบเบงเบเบเบฒเบเปเบเบฑเบเบเปเบญเบเบเบฑเบเบซเบกเบปเบเปเบเบเบเปเปเบกเบตเบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเบดเบเบเบฒเบเปเบเปเบเบฒเบเบเบตเป.
เบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบฅเบฑเบเบเปเบญเบเบเปเบฝเบงเบเบฑเบเบงเบดเบเบตเปเบเปเบเบญเบ strace
เปเบฎเบฑเบเบงเบฝเบเบเบฑเบ seccomp
เบชเบฒเบกเบฒเบเบเบปเบเปเบเปเบเบฒเบ
xt_bpf
เบเบญเบเบเบตเปเปเบซเปเบเบฑเบเบเบทเบเบชเบนเปเปเบฅเบเบเบญเบเปเบเบทเบญเบเปเบฒเบ.
เบเบงเบฒเบกโเปเบเบฑเบโเบกเบฒโ: เปเบเบฑเบโเปเบงโเบฅเบฒโเบเบปเบโเบเบฒเบโเบเปเบญเบโเบซเบเปเบฒโเบเบตเปโ, เปเบโเบเบต 2007โ, เบซเบผเบฑเบโเบเบฒเบโเปเบกเปเบโ xt_u32
เบชเปเบฒเบฅเบฑเบ netfilter. เบกเบฑเบเบเบทเบเบเบฝเบเปเบเบเบเบฒเบเบเบฝเบเบเบฝเบเบเบฑเบเบเบปเบงเบเบฑเบเบเบฐเปเบเบเบเบฒเบเบเบฐเบฅเบฒเบเบญเบเบเบตเปเปเบเบปเปเบฒเปเบเปเบเบงเปเบฒ cls_u32
เปเบฅเบฐเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฒเบเบเบฝเบเบเบปเบเบฅเบฐเบเบฝเบ binary arbitrary เบชเปเบฒเบฅเบฑเบ iptables เปเบเบเปเบเปเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบเปเบเปเปเปเบเบเบตเป: เปเบซเบฅเบ 32 bits เบเบฒเบเบเบธเบเปเบฅเบฐเบเบฐเบเบดเบเบฑเบเบเบธเบเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบฅเบเบเบฐเบเบดเบเบชเบฒเบ. เบเบปเบโเบเบปเบงโเบขเปเบฒเบ,
sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"
เปเบซเบฅเบ 32 bits เบเบญเบเบซเบปเบง IP, เปเบฅเบตเปเบกเบเบฒเบ padding 6, เปเบฅเบฐเบเปเบฒเปเบเปเบซเบเปเบฒเบเบฒเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒ. 0xFF
(เปเบญเบปเบฒ byte เบเปเปเบฒ). เบเบฒเบเบชเบฐเบซเบเบฒเบกเบเบตเป protocol
เบซเบปเบง IP เปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเบฝเบเบเบฝเบเบกเบฑเบเบเบฑเบ 1 (ICMP). เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบปเบกเบเบปเบเบเบฒเบเบเบงเบเบชเบญเบเบเปเบฒเบเบงเบเบซเบผเบฒเบเปเบเบซเบเบถเปเบเบเบปเบเบฅเบฐเบเบฝเบ, เปเบฅเบฐเบเปเบฒเบเบเบฑเบเบชเบฒเบกเบฒเบเบเบฐเบเบดเบเบฑเบเบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบ @
โ เบเปเบฒเบ X bytes เปเบเบเบฒเบเบเบงเบฒ. เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เบเบปเบเบฅเบฐเบเบฝเบ
iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"
เบเบงเบเปเบเบดเปเบเบงเปเบฒ TCP Sequence Number เบเปเปเปเบเบปเปเบฒเบเบฑเบ 0x29
. เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบเปเปเปเบเบปเปเบฒเปเบเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบทเปเบกเบญเบตเบ, เปเบเบฒเบฐเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเปเบฅเปเบงเบงเปเบฒเบเบฒเบเบเบฝเบเบเบปเบเบฅเบฐเบเบฝเบเบเบฑเปเบเบเปเบฒเบงเบเปเบงเบเบกเบทเปเบกเปเบเบเปเปเบชเบฐเบเบงเบเบซเบผเบฒเบ. เปเบเบเบปเบเบเบงเบฒเบก xt_u32
. เปเบเบดเปเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบเบญเบเบเปเบฒเบเบเบญเบเบเบปเบเบเบงเบฒเบกเบเบตเป.
เบเบฑเบเบเบฑเปเบเปเบเป 2013 เปเบกเบเบนเบเปเบเบเบเบตเปเบเบฐเปเบเบฑเบเปเบกเบเบนเบ xt_u32
เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเปเบกเบเบนเบ BPF xt_bpf
. เปเบเบเปเปเบเบฒเบกเบเบตเปเปเบเปเบญเปเบฒเบเบกเบฒเบเบตเปเปเบฅเปเบงเบเบงเบเบเบฐเบกเบตเบเบงเบฒเบกเบเบฑเบเปเบเบเบเปเบฝเบงเบเบฑเบเบซเบผเบฑเบเบเบฒเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบญเบเบกเบฑเบ: เบเปเบฒเปเบเบตเบเบเบฒเบ BPF bytecode เปเบเบฑเบเบเบปเบเบฅเบฐเบเบฝเบ iptables. เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเปเบฒเบเบเบปเบเบฅเบฐเบเบฝเบเปเบซเบกเป, เบเบปเบงเบขเปเบฒเบเปเบเบฑเปเบเบเบตเป:
iptables -A INPUT -m bpf --bytecode <ะฑะฐะนัะบะพะด> -j LOG
เบเบตเปเบเบตเป <ะฑะฐะนัะบะพะด>
- เบเบตเปเปเบกเปเบเบฅเบฐเบซเบฑเบเปเบเบฎเบนเบเปเบเบเบเบปเบเบเบฐเบฅเบดเบเบเบญเบ assembler bpf_asm
เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ,
$ cat /tmp/test.bpf
ldb [9]
jneq #17, ignore
ret #1
ignore: ret #0
$ bpf_asm /tmp/test.bpf
4,48 0 0 9,21 0 1 17,6 0 0 1,6 0 0 0,
# iptables -A INPUT -m bpf --bytecode "$(bpf_asm /tmp/test.bpf)" -j LOG
เปเบเบเบปเบงเบขเปเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบ UDP เบเบฑเบเบซเบกเบปเบ. เปเบเบทเปเบญเปเบเบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบ BPF เปเบเปเบกเบเบนเบ xt_bpf
เปเบเปเบเบญเบ, เบเบตเปเปเบซเปเปเบซเบฑเบเปเบเบดเบเบเปเปเบกเบนเบเปเบเบฑเบเปเบเบฑเบ, เปเบเบเปเบฅเบฐเบเบตเบเบญเบ iptables, เปเบเบซเบฒเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบซเบปเบง IPv4. เบเบฑเบเบเบทเบเบกเบนเบเบเปเบฒเบเบฒเบเปเบเบเบเบฒเบ BPF false
เปเบฒเบเบเบงเบฒเบกเบงเปเบฒเปเบเบฑเบเปเบเบฑเบเบเปเปเบเบปเบเบเบฑเบ.
เบกเบฑเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเบงเปเบฒเปเบกเบเบนเบ xt_bpf
เบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเบฒเบเบเบฑเปเบเบเบญเบเบเบตเปเบชเบฑเบเบชเบปเบเบซเบผเบฒเบเบเปเบงเบฒเบเบปเบงเบขเปเบฒเบเบเปเบฒเบเปเบเบดเบ. เปเบซเปเปเบเบดเปเบเบเบปเบงเบขเปเบฒเบเบเบตเปเปเบเปเบเบดเบเบเบฒเบ Cloudfare. เบเบปเบเบเปเบงเบฒเบเปเปเบเบปเบเบกเบฒเบเบตเปเบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเบเปเบฒเปเบเปเปเบกเบเบนเบ xt_bpf
เปเบเบทเปเบญเบเปเบญเบเบเบฑเบเบเบฒเบเปเบเบกเบเบต DDoS. เปเบเบเบปเบเบเบงเบฒเบก bpfgen
เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเปเบฒเบเปเบเบเบเบฒเบ BPF เบเบตเปเบเบปเบเบเบฑเบเบเปเบฒเบเบฒเบก DNS เบชเปเบฒเบฅเบฑเบเบเบทเป habr.com
:
$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax
lb_0:
ld [x + 0]
jneq #0x04686162, lb_1
ld [x + 4]
jneq #0x7203636f, lb_1
ldh [x + 8]
jneq #0x6d00, lb_1
ret #65535
lb_1:
ret #0
เปเบเปเบเบเบเบฒเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบญเบดเบเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบเบเบฐเบเบฝเบ X
เบเบตเปเบขเบนเปเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเปเบเบง x04habrx03comx00
เบเบฒเบเปเบ UDP datagram เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบเบดเปเบเบเปเบฒเบฎเปเบญเบเบเป: 0x04686162 <-> "x04hab"
เปเบฅเบฐเบญเบทเปเบเป.
เปเบฅเบฑเบเบเปเบญเบเบเปเปเบกเบฒ, Cloudfare เปเบเบตเบเปเบเปเบฅเบฐเบซเบฑเบ p0f -> BPF compiler. เปเบเบเบปเบเบเบงเบฒเบก
$ ./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, เปเบเบดเปเบ.
cls_bpf
เบเบปเบงเบขเปเบฒเบเบชเบธเบเบเปเบฒเบเบเบญเบเบเบฒเบเปเบเป BPF เบเบฅเบฒเบชเบชเบดเบเปเบ kernel เปเบกเปเบเบเบปเบงเบเบฑเบเบเบฐเปเบเบ cls_bpf
เบชเปเบฒเบฅเบฑเบเบฅเบฐเบเบปเบเบเปเบญเบเบเบฒเบเบเบงเบเบเบธเบกเบเบฒเบเบเบฐเบฅเบฒเบเบญเบเปเบ Linux, เปเบเบตเปเบกเปเบชเป Linux เปเบเบเปเบฒเบเบเบต 2013 เปเบฅเบฐเบเปเบฝเบเปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบเบงเบฑเบเบเบธเบเบนเบฎเบฒเบ. cls_u32
.
เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบเบฑเบเบเบธเบเบฑเบเบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเปเบญเบฐเบเบดเบเบฒเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ cls_bpf
, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบญเบเบเบงเบฒเบกเบฎเบนเปเบเปเบฝเบงเบเบฑเบ BPF เบเบฅเบฒเบชเบชเบดเบเบเบตเปเบเบฐเบเปเปเปเบซเปเบเบงเบเปเบฎเบปเบฒเบซเบเบฑเบ - เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฒเบเปเบเบฑเบเบเบงเบฒเบกเบเบธเปเบเปเบเบตเบเบเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบซเบกเบปเบ. เบเบญเบเบเบฒเบเบเบฑเปเบ, เปเบเบเบปเบเบเบงเบฒเบกเบเปเปเปเบเบเบตเปเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบ Extended BPF, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบปเบเบเบฑเบเบเบปเบงเบเบฑเบเบเบฐเปเบเบเบเบตเปเบซเบผเบฒเบเบเบงเปเบฒเบซเบเบถเปเบเบเบฑเปเบ.
เปเบซเบเบเบปเบเบญเบทเปเบเบเบตเปเบเบฐเบเปเปเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเปเบเป BPF เบเบฅเบฒเบชเบชเบดเบ c cls_bpf
เบเบฑเบเบซเบฒเปเบกเปเบเบงเปเบฒ, เปเบกเบทเปเบญเบเบฝเบเบเบฝเบเบเบฑเบ Extended BPF, เบเบญเบเปเบเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเปเปเบเบเปเบฅเบฐเบเบตเบเบตเปเปเบกเปเบเปเบเบเบฅเบปเบเบซเบผเบฒเบ: เปเบเบเบเบฒเบเบเบฅเบฒเบชเบชเบดเบเบเปเปเบชเบฒเบกเบฒเบเบเปเบฝเบเปเบเบทเปเบญเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเปเบฅเบฐเบเปเปเบชเบฒเบกเบฒเบเบเบฑเบเบเบถเบเบชเบฐเบเบฒเบเบฐเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบ.
เบชเบฐเบเบฑเปเบเบกเบฑเบเปเบเบดเบเปเบงเบฅเบฒเบเบตเปเบเบฐเบเบญเบเบฅเบฒเบเบฑเบ BPF เบเบฅเบฒเบชเบชเบดเบเปเบฅเบฐเปเบเบดเปเบเบญเบฐเบเบฒเบเบปเบ.
เบญเบณเบฅเบฒ BPF เบเบฅเบฒเบชเบชเบดเบ
เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบดเปเบเบงเบดเบเบตเบเบฒเบเปเบเบเปเบเปเบฅเบเบต BPF, เบเบฑเบเบเบฐเบเบฒเปเบเบเบปเปเบ nineties, เบเบฐเบชเบปเบเบเบปเบเบชเปเบฒเปเบฅเบฑเบเปเบเบซเบเบถเปเบเบชเปเบงเบเบชเบตเปเบเบญเบเบชเบฐเบเบฐเบงเบฑเบเปเบฅเบฐเบเบปเบเบเปเบงเบฒเปเบเบเบญเบเบเปเบฒเบเบเบญเบเบเบฒเบเบเบปเปเบเบเบปเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเปเบซเบกเป. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเปเบฒเบเบเบทเบเบฑเบเบเบฑเบเบเบฒเบเบซเบฑเบเบเปเบฝเบเบเบฒเบเปเบเบทเปเบญเบเบเบฑเบ stack เบเบฑเบ RISC, เปเบเบดเปเบเปเบเปเบฎเบฑเบเบเบดเบเบเบญเบเปเบเบฑเบเปเบฎเบเบเบฐเบเบธเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ BPF เบเบฅเบฒเบชเบชเบดเบ, เปเบเบเบธเบกเบเบต 32 เบกเบตเบเบฒเบเบซเบฑเบเบเปเบฝเบเบเบฒเบเปเบเบทเปเบญเบเบเบฑเบ 64-bit เบเบฑเบ XNUMX-bit เปเบฅเบฐ BPF เบเบฅเบฒเบชเบชเบดเบเปเบเปเปเบฅเบตเปเบกเบเบปเปเบเบเบตเปเบเบฐเบฅเปเบฒเบชเบฐเปเบซเบก. เบเบญเบเบเบฒเบเบเบฑเปเบ, เบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบ BPF เบเบฅเบฒเบชเบชเบดเบเปเบกเปเบเบเปเบฒเบเบฑเบเบซเบผเบฒเบ, เปเบฅเบฐเบเบญเบเปเบซเบเบทเบญเบเบฒเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบเบตเปเบฅเปเบฒเบชเบฐเปเบซเบก - เบเบงเบเปเบฎเบปเบฒเบเปเปเบกเบตเบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเปเบงเบเบเบฐเบขเบฑเบเบฅเบฑเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบเบเบฑเบเปเบเบเบเบฒเบ BPF, เบเปเปเบกเบตเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเบญเบเบเบฒเบเปเบเปเบเบญเบเบเบนเปเปเบเปเปเบเบเบเบปเบ, เบเปเปเบกเบตเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเบญเบเบเบฒเบเปเบเปเบเบญเบ. เบเบฑเบ kernel, เบเบปเบเปเบงเบฑเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเปเบฒเบเบเปเบฒเบเบงเบเบเปเบฒเบเบฑเบเบเบญเบเบเปเบญเบเปเบเบเบชเปเบฒเบ sk_buff
เปเบฅเบฐเบเบฒเบเปเบเบตเบเบเบปเบงเบซเบเปเบฒเบเบตเปเบเบนเปเบเปเบงเบเบเบตเปเบเปเบฒเบเบเบฒเบเบเบตเปเบชเบธเบ, เบเปเบฒเบเบเปเปเบชเบฒเบกเบฒเบเบเปเบฝเบเปเบเบทเปเบญเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเปเบฅเบฐเบเปเบฝเบเปเบชเบฑเปเบเบเบฒเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒ.
เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบเบฐเบเบธเบเบฑเบเบเบฑเบเบซเบกเบปเบเบเบตเปเบเบฑเบเปเบซเบผเบทเบญเบเบญเบ BPF เบเบฅเบฒเบชเบชเบดเบเปเบ Linux เปเบกเปเบเบเบฒเบเปเบเปเบเบญเบ API, เปเบฅเบฐเบเบฒเบเปเบ kernel เบเบฑเบเบเบฒเปเบเบเบเบฒเบเบเบฅเบฒเบชเบชเบดเบ, เบเปเปเบงเปเบฒเบเบฐเปเบเบฑเบเบเบปเบงเบเบญเบ socket เบซเบผเบทเบเบปเบงเบเบญเบ seccomp, เบเบฐเบเบทเบเปเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบเบฎเบนเบเปเบเบเปเบซเบกเป, Extended BPF. (เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเปเบขเปเบฒเบเปเบเปเบเบญเบเปเบเบเบปเบเบเบงเบฒเบกเบเปเปเปเบ.)
เบเบฒเบเบซเบฑเบเบเปเบฝเบเปเบเบชเบนเปเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบซเบกเปเปเบเปเปเบฅเบตเปเบกเบเบปเปเบเปเบ 2013, เปเบเปเบงเบฅเบฒเบเบตเป Alexey Starovoitov เบชเบฐเปเบซเบเบตเปเบเบเบเบฒเบเบเบฑเบเบเบธเบ BPF. เปเบโเบเบต 2014 เบเบฒเบโเปเบเปโเปเบโเบเบตเปโเบชเบญเบโเบเปเบญเบโเบเบฑเบโ
เบเบปเบเบเบงเบฒเบกเปเบเบตเปเบกเปเบเบตเบกเปเบเบเบธเบเบเบตเปเบเบฐเบเบงเบกเปเบญเบปเบฒเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบฅเบฐเบเบฒเบเบเปเบฒเปเบเปเปเบเบฑเบเปเบเปเบฅเบขเบตเปเบซเบกเป, เปเบเปเบเบทเปเบญเบเบเบปเปเบเปเบญเบตเปเบเบงเปเบฒ BPF เบเบฒเบเปเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบซเบเบฒเบ BPF, เปเบฅเบฐเปเบเบเบฑเบเบเบธเบเบฑเบเบเบฝเบเปเบเป BPF.
เปเบญเบเบฐเบชเบฒเบ
- Steven McCanne เปเบฅเบฐ Van Jacobson, "BSD Packet Filter: เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบซเบกเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบ Packet เบฅเบฐเบเบฑเบเบเบนเปเปเบเป",
https://www.tcpdump.org/papers/bpf-usenix93.pdf
- Steven McCanne, "libpcap: เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ เปเบฅเบฐเบงเบดเบเบตเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเปเบเบฑเบเปเบเบฑเบ",
https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
tcpdump
,libpcap
:https://www.tcpdump.org/ เบเบฒเบเบชเบญเบเบเบฒเบเบเบฑเบเบเบนเป IPtable U32 .- BPF - เบฅเบฐเบซเบฑเบ byte เบฅเบทเบก:
https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
- เบเบฒเบโเบเปเบฒโเบชเบฐโเปเบซเบเบตโเปเบเบทเปเบญเบโเบกเบท BPFโ:
https://blog.cloudflare.com/introducing-the-bpf-tools/
bpf_cls
:http://man7.org/linux/man-pages/man8/tc-bpf.8.html
- เบเบฒเบโเบฅเบงเบก seccompโ:
https://lwn.net/Articles/656307/
https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
habr: เบเบฑเบเบเบธเปเบฅเบฐเบเบงเบฒเบกเบเบญเบเปเบ: seccomp habr: เบเบฒเบเปเบเบ daemons เบเบฑเบ systemd เบซเบผเบท "เบเปเบฒเบเบเปเปเบเปเบญเบเบเบฒเบ Docker เบชเปเบฒเบฅเบฑเบเบชเบดเปเบเบเบตเป!" - Paul Chaignon, "strace --seccomp-bpf: a look under the hood",
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
netsniff-ng
:http://netsniff-ng.org/
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com