Berkeley Packet Filters (BPF) Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, ΠΊΠΎΡΡΠΎ Π½Π΅ ΡΠ»ΠΈΠ·Π° ΠΎΡ ΠΏΡΡΠ²ΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° Π°Π½Π³Π»ΠΎΠ΅Π·ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΡ Π²Π΅ΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈΡΠ΅ ΡΠ° ΠΏΡΠ»Π½ΠΈ Ρ Π΄ΠΎΠΊΠ»Π°Π΄ΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° BPF. ΠΠ΅ΠΉΠ²ΠΈΠ΄ ΠΠΈΠ»ΡΡ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ½ΠΈΠΊ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π° Linux, Π½Π°ΡΠΈΡΠ° ΡΠ²ΠΎΡ Π΄ΠΎΠΊΠ»Π°Π΄ Π½Π° Linux Plumbers 2018 (XDP Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π²Π°ΡΠΈΠ°Π½ΡΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BPF). ΠΡΠ΅Π½Π΄ΡΠ½ ΠΡΠ΅Π³Π³ ΡΠ΅ΡΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄ΠΈ Ρ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ . Π’ΠΎΠΊΠ΅ Π₯ΡΠΎΠ»Π°Π½Π΄-ΠΠΎΡΠ³Π΅Π½ΡΠ΅Π½ , ΡΠ΅ ΡΠ΄ΡΠΎΡΠΎ ΡΠ΅Π³Π° Π΅ ΠΌΠΈΠΊΡΠΎΠΊΠ΅ΡΠ½Π΅Π». Π’ΠΎΠΌΠ°Ρ ΠΡΠ°Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠ·ΠΈΡΠ° ΠΈΠ΄Π΅ΡΡΠ°, ΡΠ΅ .
ΠΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° BPF Π² Π₯Π°Π±ΡΠ°, Π·Π°ΡΠΎΠ²Π° Π² ΡΠ΅ΡΠΈΡ ΠΎΡ ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ° Π·Π° ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ°, Π΄Π° ΠΎΠΏΠΈΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΡΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π΄Π° ΠΎΡΠ΅ΡΡΠ°Ρ ΠΎΠ±Π»Π°ΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BPF. Π ΡΠ°Π·ΠΈ, Π½ΡΠ»Π΅Π²Π°, ΡΡΠ°ΡΠΈΡ ΠΎΡ ΡΠΈΠΊΡΠ»Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΊΠ°Π·Π°Π½Π° ΠΈΡΡΠΎΡΠΈΡΡΠ° ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·ΠΊΡΠΈΡΠΈ ΡΠ°ΠΉΠ½ΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° tcpdump, seccomp, strace, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° BPF ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΎΠ±ΡΠ½ΠΎΡΡ Π½Π° Linux, ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° BPF ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΌΡΠ΅ΠΆΠΈΡΠ΅ ΠΈ Π·Π°ΡΠΎΠ²Π°, Ρ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° , Π½Π°ΡΠ΅ΠΊΠΎΡ ΡΠ΅ΡΠΈΡΡΠ° "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), Π±Π΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ°Ρ Π½Π΅Π½ΡΠΆΠ½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΡΠ°Π½ΠΎ, Ρ.Π΅. Π² ΡΠ΄ΡΠΎΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π½Π΅ ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Ρ ΠΈΠ·Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. ΠΠ° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΊΠΎΠ΄ Π² ΡΠ΄ΡΠΎΡΠΎ, Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° β ΠΏΡΡΡΡΠ½ΠΈΠΊ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ Π·Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ Π±ΡΡ Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈ Ρ ΡΡΠ΅ΠΊΠΎΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈ Π½Π° Π½ΠΎΠ²ΠΈΡΠ΅ RISC ΠΌΠ°ΡΠΈΠ½ΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠ΅Ρ Π° ΡΠΎΠ»ΠΊΠΎΠ²Π° Π΅ΡΠΊΡΠΈΠ²Π½ΠΎ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΡΠΈΠ»ΠΈΡΡΠ° Π½Π° ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΎΡ Berkeley Labs Π±Π΅ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½Π° Π½ΠΎΠ²Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ BPF (Berkeley Packet Filters), ΡΠΈΡΡΠΎ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π±Π΅ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° Motorola 6502 β ΡΠ°Π±ΠΎΡΠ½Π° ΠΊΠΎΠ½Ρ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈ ΠΊΠ°ΡΠΎ ΠΈΠ»ΠΈ . ΠΠΎΠ²Π°ΡΠ° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΠ»ΡΡΠΈΡΠ΅ Π΄Π΅ΡΠ΅ΡΠΊΠΈ ΠΏΡΡΠΈ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° BPF
Π©Π΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ. ΠΠΎ ΠΏΡΡΠ²ΠΎ Π½Π΅ΠΊΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° ΠΈΠΌΠ°ΡΠ΅ Π΄Π²Π° Π½Π°Π»ΠΈΡΠ½ΠΈ Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ° β Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ A ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ΅Π½ ΡΠ΅Π³ΠΈΡΡΡΡ X, 64 Π±Π°ΠΉΡΠ° ΠΏΠ°ΠΌΠ΅Ρ (16 Π΄ΡΠΌΠΈ), Π½Π°Π»ΠΈΡΠ½Π° Π·Π° Π·Π°ΠΏΠΈΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΎ ΡΠ΅ΡΠ΅Π½Π΅, ΠΈ ΠΌΠ°Π»ΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ΅Π·ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π±ΡΡ
Π° Π½Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΏΡΠ΅Ρ
ΠΎΠ΄, Π·Π° Π΄Π° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΡΠ»ΠΎΠ²Π½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ, Π½ΠΎ Π·Π° Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° Π½Π°Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΡΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π½Π°ΠΏΡΠ΅Π΄, Ρ.Π΅. ΠΏΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π½Π΅ Π±Π΅ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΠΈΠΊΠ»ΠΈ.
ΠΠ±ΡΠ°ΡΠ° ΡΡ Π΅ΠΌΠ° Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ°. ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΡΡΠ·Π΄Π°Π²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° BPF ΠΈ, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½ΡΠΊΠ°ΠΊΡΠ² ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π½Π° ΡΠ΄ΡΠΎΡΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ), Π·Π°ΡΠ΅ΠΆΠ΄Π° ΠΈ ΡΠ²ΡΡΠ·Π²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Ρ Π½ΡΠΊΠ°ΠΊΡΠ² Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΄ΡΠΎΡΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ±ΠΈΡΠΈΠ΅ β ΡΠΎΠ²Π° Π΅ ΠΏΡΠΈΡΡΠΈΠ³Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ² ΠΏΠ°ΠΊΠ΅Ρ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΊΠ°ΡΡΠ°). ΠΡΠΈ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΠ΅, ΡΠ΄ΡΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ), ΠΏΡΠΈ ΠΊΠΎΠ΅ΡΠΎ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ. Π½ΡΠΊΠ°ΠΊΡΠ² ΡΠ΅Π³ΠΈΠΎΠ½ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ).
Π’ΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΊΠ°Π·Π°Ρ
ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅, Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, Π·Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°: ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΈ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ. ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π²Π΅Π΄Π½Π°Π³Π° ΠΈ Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ Π·Π° Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΠΉ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡ. ΠΈ/ΠΈΠ»ΠΈ ΠΏΡΡΠ²Π°ΡΠ° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π½Π° ΡΠ°ΠΉΠ»Π° ΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°ΡΠ΅ ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡΡΠ° , Π² ΠΊΠΎΡΡΠΎ ΠΠ°ΠΊΠΠ°Π½, Π΅Π΄ΠΈΠ½ ΠΎΡ Π°Π²ΡΠΎΡΠΈΡΠ΅ Π½Π° BPF, ΡΠ°Π·ΠΊΠ°Π·Π²Π° Π·Π° ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ libpcap.
Π‘Π΅Π³Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΊΡΠΌ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF Π² Linux: tcpdump (libpcap), seccomp, xt_bpf, cls_bpf.
tcpdump
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° BPF ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠΎΠ½ΡΠ΅Π½Π΄ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ β Π΄ΠΎΠ±ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ tcpdump. Π, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° Π΅ Π½Π°ΠΉ-ΡΡΠ°ΡΠΈΡΡ ΠΈ Π½Π°ΠΉ-ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF, Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, Ρ Π½Π΅Π³ΠΎ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π½Π°ΡΠ΅ΡΠΎ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ°.
(ΠΡΠΈΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ Π½Π° Linux 5.6.0-rc6. Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Π½ΠΈ Π·Π° ΠΏΠΎΠ²ΠΈΡΠ΅Π½Π° ΡΠ΅ΡΠΈΠΌΠΎΡΡ.)
ΠΡΠΈΠΌΠ΅Ρ: Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° IPv6 ΠΏΠ°ΠΊΠ΅ΡΠΈ
ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ IPv6 ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° eth0. ΠΠ° ΡΠ΅Π»ΡΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° tcpdump Ρ Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΈΡ ΡΠΈΠ»ΡΡΡ ip6:
$ sudo tcpdump -i eth0 ip6Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ tcpdump ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΡΠΈΠ»ΡΡΡΠ° ip6 Π² Π±Π°ΠΉΡ-ΠΊΠΎΠ΄ Π½Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° BPF ΠΈ ΡΠ΅ Π³ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠΈ ΠΊΡΠΌ ΡΠ΄ΡΠΎΡΠΎ (Π²ΠΈΠΆΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π² ΡΠ°Π·Π΄Π΅Π» ). ΠΠ°ΡΠ΅Π΄Π΅Π½ΠΈΡΡ ΡΠΈΠ»ΡΡΡ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. eth0ΠΠΊΠΎ ΡΠΈΠ»ΡΡΡΡΡ Π²ΡΡΠ½Π΅ Π½Π΅Π½ΡΠ»Π΅Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ n, ΡΠΎΠ³Π°Π²Π° Π΄ΠΎ n Π±Π°ΠΉΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠΏΠΈΡΠ°Π½ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈ ΡΠ΅ Π³ΠΎ Π²ΠΈΠ΄ΠΈΠΌ Π² ΠΈΠ·Ρ
ΠΎΠ΄Π°. tcpdump.

ΠΠΊΠ°Π·Π²Π° ΡΠ΅, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊΡΠ² ΡΠΎΡΠ½ΠΎ Π±Π°ΠΉΡ-ΠΊΠΎΠ΄ Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ ΠΊΡΠΌ ΡΠ΄ΡΠΎΡΠΎ 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)-ΡΡ Π±Π°ΠΉΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈΡ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅Ρ. Π§ΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ Ethernet ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° eth0, Π° ΡΠΎΠ²Π° , ΠΊΠΎΠ΅ΡΠΎ ΠΏΠ°ΠΊΠ΅ΡΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½ (Π·Π° ΡΠ»Π΅ΡΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠ΅, ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡΡ Π½ΡΠΌΠ° VLAN ΡΠ°Π³ΠΎΠ²Π΅):
6 6 2
|Destination MAC|Source MAC|Ether Type|...|Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΡΠ»Π΅Π΄ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ldh [12] Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° A ΡΠ΅ ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ ΠΏΠΎΠ»Π΅ Ether Type β ΡΠΈΠΏΡΡ Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΡΠΎΠ·ΠΈ Ethernet ΡΡΠ΅ΠΉΠΌ. ΠΠ° ΡΠ΅Π΄ 1 ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ° A (ΡΠΈΠΏ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°) Ρ 0x86dd, Π° ΡΠΎΠ²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠΈΡΡ Π½ΠΈ ΡΠΈΠΏ IPv6. ΠΠ° ΡΠ΅Π΄ 1, ΠΎΡΠ²Π΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, ΠΈΠΌΠ° ΠΈ Π΄Π²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ β jt 2 ΠΈ jf 3 β Π΅ΡΠΈΠΊΠ΅ΡΠΈ, Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π² ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ (A == 0x86dd) ΠΈ Π½Π° Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ. Π ΡΠ°ΠΊΠ°, Π² ΡΡΠΏΠ΅ΡΠ½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ (IPv6) ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ Π½Π° ΡΠ΅Π΄ 2, Π° Π² Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈΡ β Π½Π° ΡΠ΅Π΄ 3. ΠΠ° ΡΠ΅Π΄ 3 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π°Π²ΡΡΡΠ²Π° Ρ ΠΊΠΎΠ΄ 0 (Π½Π΅ ΠΊΠΎΠΏΠΈΡΠ°ΠΉ ΠΏΠ°ΠΊΠ΅ΡΠ°), Π½Π° ΡΠ΅Π΄ 2 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π°Π²ΡΡΡΠ²Π° Ρ ΠΊΠΎΠ΄ 262144 (ΠΊΠΎΠΏΠΈΡΠ°ΠΉ ΠΌΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 256 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡΠ° ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠ°).
ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ΅Π½: Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅ TCP ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΏΠΎ ΡΠ΅Π»Π΅Π²ΠΈΡ ΠΏΠΎΡΡ
ΠΠ΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠΈΠ»ΡΡΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΠΏΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ TCP ΠΏΠ°ΠΊΠ΅ΡΠΈ Ρ ΡΠ΅Π»Π΅Π²ΠΈ ΠΏΠΎΡΡ 666. Π©Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»ΡΡΠ°Ρ IPv4, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ»ΡΡΠ°ΠΉ IPv6 Π΅ ΠΏΠΎ-ΠΏΡΠΎΡΡ. Π‘Π»Π΅Π΄ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΈ Π΄Π° ΠΏΡΠΎΡΡΠΈΡΠ΅ ΡΠΈΠ»ΡΡΡΠ° Π·Π° IPv6 (ip6 and tcp dst port 666) ΠΈ ΡΠΈΠ»ΡΡΡΠ° Π·Π° ΠΎΠ±ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ (tcp dst port 666). Π ΡΠ°ΠΊΠ°, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠΈΡΡ Π½ΠΈ ΡΠΈΠ»ΡΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 10
(002) ldb [23]
(003) jeq #0x6 jt 4 jf 10
(004) ldh [20]
(005) jset #0x1fff jt 10 jf 6
(006) ldxb 4*([14]&0xf)
(007) ldh [x + 16]
(008) jeq #0x29a jt 9 jf 10
(009) ret #262144
(010) ret #0ΠΠ°ΠΊΠ²ΠΎ ΠΏΡΠ°Π²ΡΡ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ 0 ΠΈ 1, Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΠΌ. ΠΠ° ΡΠ΅Π΄ 2 Π²Π΅ΡΠ΅ ΡΠΌΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ, ΡΠ΅ ΡΠΎΠ²Π° Π΅ IPv4 ΠΏΠ°ΠΊΠ΅Ρ (Ether Type = 0x800) ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΠ° A 24-ΠΈΡ Π±Π°ΠΉΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ°ΡΠΈΡΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ
14 8 1 1
|ethernet header|ip fields|ttl|protocol|...Π° Π·Π½Π°ΡΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΠ° A ΠΏΠΎΠ»Π΅ΡΠΎ Protocol Π½Π° IP Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ TCP ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π‘ΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ Protocol Ρ 0x6 () Π½Π° ΡΠ΅Π΄ 3.
ΠΠ° ΡΠ΅Π΄ΠΎΠ²Π΅ 4 ΠΈ 5 Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ Π΄ΡΠΌΠΈ, ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π½Π° Π°Π΄ΡΠ΅Ρ 20, ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° jset ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅, Π΄Π°Π»ΠΈ Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΠΈΡΠ΅ β Π² ΠΌΠ°ΡΠΊΠ°ΡΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° jset ΡΠ° ΠΈΠ·Π³Π»Π°Π΄Π΅Π½ΠΈ ΡΡΠΈ ΡΡΠ°ΡΡΠΈ Π±ΠΈΡΠ°. ΠΠ²Π° ΠΎΡ ΡΡΠΈΡΠ΅ Π±ΠΈΡΠ° Π½ΠΈ ΠΊΠ°Π·Π²Π°Ρ, Π΄Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΡΡ Π΅ ΡΠ°ΡΡ ΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ IP ΠΏΠ°ΠΊΠ΅Ρ ΠΈ Π°ΠΊΠΎ Π΄Π°, Π΄Π°Π»ΠΈ Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ. Π’ΡΠ΅ΡΠΈΡΡ Π±ΠΈΡ Π΅ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠ°Π½ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π²Π΅Π½ Π½Π° Π½ΡΠ»Π°. ΠΠ΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π½ΠΈ ΡΠ΅Π»ΠΎΡΡΡΠ°, Π½ΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠΈ Π±ΠΈΡΠ°.
Π Π΅Π΄ 6 β Π½Π°ΠΉ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΡ Π² ΡΠΎΠ·ΠΈ Π»ΠΈΡΡΠΈΠ½Π³. ΠΠ·ΡΠ°Π·ΡΡ ldxb 4*([14]&0xf) ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ Π² ΡΠ΅Π³ΠΈΡΡΡΠ° X ΡΠ΅ΡΠΈΡΠΈΡΠ΅ Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈ Π±ΠΈΡΠ° Π½Π° ΠΏΠ΅ΡΠ½Π°Π΄Π΅ΡΠ΅ΡΠΈΡ Π±Π°ΠΉΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°, ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈ Π½Π° 4. Π§Π΅ΡΠΈΡΠΈΡΠ΅ Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈ Π±ΠΈΡΠ° Π½Π° ΠΏΠ΅ΡΠ½Π°Π΄Π΅ΡΠ΅ΡΠΈΡ Π±Π°ΠΉΡ β ΡΠΎΠ²Π° Π΅ ΠΏΠΎΠ»Π΅ Π½Π° IPv4, Π² ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ Π² Π΄ΡΠΌΠΈ, Π·Π°ΡΠΎΠ²Π° Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΡΠ΅ ΡΠΌΠ½ΠΎΠΆΠΈ Π½Π° 4. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅, ΡΠ΅ ΠΈΠ·ΡΠ°Π·ΡΡ 4*([14]&0xf) β ΡΠΎΠ²Π° Π΅ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° ΡΡ
Π΅ΠΌΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΌΠΎ Π² ΡΠ°ΠΊΡΠ² Π²ΠΈΠ΄ ΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠ° X, Ρ.Π΅. Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½ΠΈΡΠΎ ldb 4*([14]&0xf) Π½ΠΈΡΠΎ ldxb 5*([14]&0xf) (ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΌΠΎ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Π΄ΡΡΠ³ ΠΎΡΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ldxb 4*([16]&0xf)). Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΡΡ
Π΅ΠΌΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π² BPF ΡΠΎΡΠ½ΠΎ Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π² X (ΠΈΠ½Π΄Π΅ΠΊΡΠ΅Π½ ΡΠ΅Π³ΠΈΡΡΡΡ) Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ Π½Π° IPv4.
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π² ΡΠ΅Π΄ 7 ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π΄Π° Π·Π°ΡΠ΅Π΄ΠΈΠΌ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ Π΄ΡΠΌΠ°, Π½Π° Π°Π΄ΡΠ΅Ρ (X+16). Π‘ΠΏΠΎΠΌΠ½ΡΠΉΠΊΠΈ ΡΠΈ, ΡΠ΅ 14 Π±Π°ΠΉΡΠ° Π·Π°Π΅ΠΌΠ° Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ Π½Π° Ethernet, Π° X ΡΡΠ΄ΡΡΠΆΠ° Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ Π½Π° IPv4, ΡΠ°Π·Π±ΠΈΡΠ°ΠΌΠ΅, ΡΠ΅ Π² A ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π° ΠΏΠΎΡΡΡΡ Π½Π° ΡΠ΅Π»ΡΠ° TCP:
14 X 2 2
|Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π½Π° ethernet|Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π½Π° ip|ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΏΠΎΡΡ|ΡΠ΅Π»Π΅Π²ΠΈ ΠΏΠΎΡΡ|ΠΠ°ΠΊΡΠ°Ρ, Π² ΡΠ΅Π΄ 8 ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΡΡΡΡ Π½Π° ΡΠ΅Π»ΡΠ° Ρ ΠΆΠ΅Π»Π°Π½ΠΎΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π² ΡΠ΅Π΄ΠΎΠ²Π΅ 9 ΠΈΠ»ΠΈ 10 Π²ΡΡΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° β ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΠ»ΠΈ Π½Π΅.
Tcpdump: Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅
Π ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π½Π΅ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ°Ρ
ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ ΡΠΎΡΠ½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ BPF Π±Π°ΠΉΡΠΊΠΎΠ΄Π° Π² ΡΠ΄ΡΠΎΡΠΎ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠ±ΡΠΎΡΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, tcpdump ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½ Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΈΠ»ΡΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° . ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ, Π·Π° Π΄Π° Π½Π°ΡΡΠ°Π½ΠΈΠΌ ΡΠΈΠ»ΡΡΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° libpcap, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
- ΡΡΠ·Π΄Π°ΠΉΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡ ΡΠΈΠΏ
pcap_tΠΎΡ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°: , - Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°: ,
- ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΉΡΠ΅ ΡΠΈΠ»ΡΡΡΠ°: ,
- ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅ΡΠ΅ ΡΠΈΠ»ΡΡΡΠ°: .
ΠΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡΡΠ° 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
...Π ΠΏΡΡΠ²ΠΈΡΠ΅ Π΄Π²Π° ΡΠ΅Π΄Π° Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Ethernet ΡΠ°ΠΌΠΊΠΈ ΠΈ Π³ΠΎ ΠΏΡΠΈΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ ΠΊΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° eth0. ΠΡ Π·Π½Π°Π΅ΠΌ, ΡΠ΅ ΡΠΈΠ»ΡΡΡΡΡ ip ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΡΠ΅ΡΠΈΡΠΈ BPF ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΈ Π² ΡΡΠ΅ΡΠΈΡ ΡΠ΅Π΄ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΠΏΡΠΈΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ 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 (Π΄Π° ΡΠ΅ ΠΎΡΡ
Π²ΡΡΠ»ΡΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ), ΠΏΡΠ΅Π²ΡΡΡΠ° ΡΠΎΠΊΠ΅ΡΠ° Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°Ρ ΡΠ΅ΠΆΠΈΠΌ ΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ° ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ.
Π’Π°ΠΊΠ° ΡΠ΅, Π·Π° Π΄Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π² Linux Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF, Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠΈΠ»ΡΡΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ° ΡΠΈΠΏ struct sock_fprog ΠΈ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΡΠΎΠΊΠ΅Ρ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠΈΠ»ΡΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΠΊΡΠΌ ΡΠΎΠΊΠ΅ΡΠ° ΡΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ Π²ΠΈΠΊ. setsockopt.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅, ΡΠ΅ ΡΠΈΠ»ΡΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π²Π°Π½ ΠΊΡΠΌ Π²ΡΠ΅ΠΊΠΈ ΡΠΎΠΊΠ΅Ρ, Π½Π΅ ΡΠ°ΠΌΠΎ ΠΊΡΠΌ raw. ΠΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΎΡΡΡΠ·Π²Π° Π²ΡΠΈΡΠΊΠΎ, ΠΎΡΠ²Π΅Π½ ΠΏΡΡΠ²ΠΈΡΠ΅ Π΄Π²Π° Π±Π°ΠΉΡΠ° Π½Π° Π²ΡΠΈΡΠΊΠΈΡΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΈ UDP Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΈ. (ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ Π² ΠΊΠΎΠ΄Π°, Π·Π° Π΄Π° Π½Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Ρ ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°.)
ΠΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° setsockopt Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΡΠΈΠ»ΡΡΠΈ, Π²ΠΈΠΆΡΠ΅ Π² , Π° Π·Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΠΈΠ»ΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° struct sock_fprog Π±Π΅Π· ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° tcpdump ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π² ΡΠ°Π·Π΄Π΅Π» .
ΠΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ BPF ΠΈ XXI Π²Π΅ΠΊ
BPF Π±Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² Linux ΠΏΡΠ΅Π· 1997 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΎΡΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠ½Π° ΠΊΠΎΠ½Ρ libpcap Π±Π΅Π· ΠΎΡΠΎΠ±Π΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ (ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° Linux ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, , Π½ΠΎ ΡΠ΅ Π½Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡ
Π° Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°). ΠΡΡΠ²ΠΈΡΠ΅ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ ΠΏΡΠΈΠ·Π½Π°ΡΠΈ, ΡΠ΅ BPF ΡΠ΅ Π΅Π²ΠΎΠ»ΡΠΈΡΠ°, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ
Π° ΠΏΡΠ΅Π· 2011 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΡΠΈΠΊ ΠΡΠΌΠ°Π·Π΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ , Π΄ΠΎΠ±Π°Π²ΡΡ Π² ΡΠ΄ΡΠΎΡΠΎ Just In Time Compiler β ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄ Π½Π° Π±Π°ΠΉΡΠΊΠΎΠ΄ Π½Π° BPF Π² Π½Π°ΡΠΈΠ²Π΅Π½ x86_64 ΠΊΠΎΠ΄.
JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π±Π΅ΡΠ΅ ΠΏΡΡΠ²ΠΈΡΡ Π² ΡΠ΅Π΄ΠΈΡΠ°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ: ΠΏΡΠ΅Π· 2012 Π³ΠΎΠ΄ΠΈΠ½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΠ»ΡΡΠΈ Π·Π° , ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ BPF, ΠΏΡΠ΅Π· ΡΠ½ΡΠ°ΡΠΈ 2013 Π±Π΅ΡΠ΅ ΠΌΠΎΠ΄ΡΠ» xt_bpf, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° iptables ΡΡΠ΅Π· BPF, Π° ΠΏΡΠ΅Π· ΠΎΠΊΡΠΎΠΌΠ²ΡΠΈ 2013 ΠΈΠΌΠ°ΡΠ΅ ΠΎΡΠ΅ ΠΈ ΠΌΠΎΠ΄ΡΠ» cls_bpf, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ°ΡΠΈΠΊΠΎΠ²ΠΈ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Ρ BPF.
Π‘ΠΊΠΎΡΠΎ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ΅Π·ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, Π½ΠΎ ΠΏΡΡΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° Π½Π°ΡΡΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° BPF, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libpcap ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ (ΠΏΡΠΎΡΡ ΠΏΡΠΈΠΌΠ΅Ρ: ΡΠΈΠ»ΡΡΡ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠ°Π½ libpcap ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡΡΠ½Π΅ ΡΠ°ΠΌΠΎ Π΄Π²Π΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ β 0 ΠΈΠ»ΠΈ 0x40000) ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π² ΡΠ»ΡΡΠ°Ρ seccomp, Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π½Π° BPF Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠ΅ ΡΡΡΠ΅
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈΡ ΡΠΎΡΠΌΠ°Ρ Π½Π° BPF ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡ:
16 8 8 32
| ΠΊΠΎΠ΄ | jt | jf | k |ΠΡΡΠΊΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π°Π΅ΠΌΠ° 64 Π±ΠΈΡΠ°, Π² ΠΊΠΎΠΈΡΠΎ ΠΏΡΡΠ²ΠΈΡΠ΅ 16 Π±ΠΈΡΠ° β ΡΠΎΠ²Π° Π΅ ΠΊΠΎΠ΄Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΡΠ»Π΅Π΄Π²Π°Π½ΠΈ ΠΎΡ Π΄Π²Π΅ ΠΎΡΠ΅ΠΌ Π±ΠΈΡΠΎΠ²ΠΈ ΠΎΡΡΡΡΠΏΠΈ, jt ΠΈ jf, ΠΈ 32 Π±ΠΈΡΠ° Π·Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, K, ΡΠΈΡΡΠΎ ΡΠΎΠ»Ρ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ret, ΠΊΠΎΡΡΠΎ Π·Π°Π²ΡΡΡΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΈΠΌΠ° ΠΊΠΎΠ΄ 6, Π° Π²ΡΡΡΠ°Π½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΡΠ΅ Π²Π·ΠΈΠΌΠ° ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΡΠ° K. Π Π΅Π·ΠΈΠΊΠ° C Π΅Π΄Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ BPF ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π² Π²ΠΈΠ΄Π° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°
struct sock_filter {
__u16 ΠΊΠΎΠ΄;
__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))ΠΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π² ΠΌΠ°ΡΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅, Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΠΈ Π² Ρ
Π°Π±ΡΠ° ΠΈ Ρ.Π½.). ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π² ΡΠ°ΠΉΠ»Π° <linux/filter.h> ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΌΠ°ΠΊΡΠΎΡΠΈ β ΡΡΡΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ°Π½ ΠΊΠ°ΡΠΎ
struct sock_filter code[] = {
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
BPF_STMT(BPF_RET|BPF_K, 0x00040000),
BPF_STMT(BPF_RET|BPF_K, 0),
}ΠΠ±Π°ΡΠ΅, ΠΈ ΡΠΎΠ·ΠΈ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π΅ Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠ΄ΠΎΠ±Π΅Π½. ΠΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ ΠΌΠΈΡΠ»ΠΈΡ Π° ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈΡΠ΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΈ Π·Π°ΡΠΎΠ²Π° Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ ΠΈ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ 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ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΊΠΎΠ΄ Π² ΡΠΎΡΠΌΠ°Ρ , ,..., Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Ρ 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, ΠΎΠΏΠΈΡΠ²Π°ΡΠ° ΠΌΡΠ΅ΠΆΠΎΠ² ΠΏΠ°ΠΊΠ΅Ρ Π² ΡΠ΄ΡΠΎΡΠΎ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΈΠΌΠ° ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΎΡ Π΄ΡΡΠ³ ΡΠΈΠΏ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ldw cpu ΡΠ΅ Π·Π°ΡΠ΅Π΄ΠΈ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° A ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ raw_smp_processor_id(). (Π Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° BPF ΡΠ΅Π·ΠΈ Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π±ΠΈΠ»ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈ Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° kernel helpers Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΏΠ°ΠΌΠ΅Ρ, ΡΡΡΡΠΊΡΡΡΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ.) ΠΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΈΠ»ΡΡΡ, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΡΠ°ΠΌΠΎ Π·Π°Π³Π»Π°Π²ΠΈΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ poff, payload offset:
ld poff
ret aΠ Π°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ° Π½Π° BPF Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² tcpdump, Π½ΠΎ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΡΠΈΠ»ΠΈΡΠΈ , ΠΊΠΎΠΉΡΠΎ, ΠΎΡΠ²Π΅Π½ Π²ΡΠΈΡΠΊΠΎ Π΄ΡΡΠ³ΠΎ, ΡΡΠ΄ΡΡΠΆΠ° Π°Π²Π°Π½Π³Π°ΡΠ΄Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° netsniff-ng, ΠΊΠΎΡΡΠΎ, ΠΎΡΠ²Π΅Π½ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· BPF, ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΠΊ ΠΈ ΠΏΠΎ-Π½Π°ΠΏΡΠ΅Π΄Π½Π°Π» ΠΎΡ tools/bpf/bpf_asm, Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ Π½Π° BPF, Π½Π°ΡΠ΅ΡΠ΅Π½ bpfc. ΠΠ°ΠΊΠ΅ΡΡΡ ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΎΡΡΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π²ΠΈΠΆΡΠ΅ ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅ΡΠ΅ Π² ΠΊΡΠ°Ρ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°.
seccomp
Π’Π°ΠΊΠ° ΡΠ΅ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΠΈ ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ, ΠΏΡΡΠ²ΠΈΡΡ ΠΎΡ ΠΊΠΎΠΈΡΠΎ Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° seccomp, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° BPF ΡΠΈΠ»ΡΡΠΈ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΠΎΡΠΎΠΌΡΠΈ.
ΠΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° seccomp Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π² ΡΠ΄ΡΠΎΡΠΎ ΠΏΡΠ΅Π· 2005 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π½Π΅ Π΅ ΠΈΠΌΠ°Π»Π° Π³ΠΎΠ»ΡΠΌΠ° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π»Π° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ - Π΄Π° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°, ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ: read, write, exit ΠΈ sigreturn, Π° ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΠΉΡΠΎ Π½Π°ΡΡΡΠ°Π²Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°, Π±ΠΈΠ²Π° ΡΠ±ΠΈΠ²Π°Π½ ΡΡΠ΅Π· SIGKILL. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° ΠΏΡΠ΅Π· 2012 Π³. Π² seccomp Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BPF ΡΠΈΠ»ΡΡΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΈ Π΄ΠΎΡΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΡΡ
Ρ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ. (ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΡΠ²ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π±Π΅ΡΠ΅ Chrome, Π° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π΅ΠΊΠΈΠΏΡΡ Π½Π° Chrome ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ KRSI, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° BPF, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Linux Security Modules.) ΠΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² ΠΊΡΠ°Ρ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅, ΡΠ΅ Π½Π° Π₯Π°Π±ΡΡ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΡΠ°ΡΠΈΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° seccomp, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π° Π½ΡΠΊΠΎΠ³ΠΎ ΡΠ΅ ΠΌΡ ΡΠ΅ ΠΈΡΠΊΠ° Π΄Π° Π³ΠΈ ΠΏΡΠΎΡΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ (ΠΈΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ) ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΠΈ. Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ° Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° seccomp, ΠΊΠ°ΠΊΡΠΎ ΠΎΡ Π²Π΅ΡΡΠΈΡΡΠ° ΠΎΡ 2007 Π³., ΡΠ°ΠΊΠ° ΠΈ ΠΎΡ Π²Π΅ΡΡΠΈΡΡΠ° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BPF (ΡΠΈΠ»ΡΡΠΈΡΠ΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° libseccomp), ΠΎΠ±ΡΡΠΆΠ΄Π° ΡΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ seccomp ΠΈ Docker, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ. Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ°Π·ΠΊΠ°Π·Π²Π°, ΠΏΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, ΠΊΠ°ΠΊ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅ΡΠ½ΠΈ ΠΈΠ»ΠΈ Π±Π΅Π»ΠΈ ΡΠΏΠΈΡΡΡΠΈ ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π·Π° Π΄Π΅ΠΌΠΎΠ½ΠΈΡΠ΅, ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΈ ΠΎΡ systemd.
ΠΠΎ-Π½Π°ΡΠ°ΡΡΠΊ ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠΈΠ»ΡΡΠΈ Π·Π° seccomp Π½Π° ΡΠΈΡΡ C ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libseccomp ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ ΠΈΠΌΠ° Π²ΡΠ΅ΠΊΠΈ Π²Π°ΡΠΈΠ°Π½Ρ, Π° Π½Π°ΠΊΡΠ°Ρ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ seccomp ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° strace.
ΠΠΈΡΠ΅ΠΌ ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠΈΠ»ΡΡΠΈ Π·Π° seccomp
ΠΠ΅ΡΠ΅ Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ Π·Π°ΡΠΎΠ²Π° ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΊΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π° seccomp. Π€ΠΈΠ»ΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΡΠΎΡΠ΅Ρ, ΠΏΡΠΈ ΠΊΠΎΠ΅ΡΠΎ Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ°. Π’ΠΎΠ²Π° ΡΡΠ°Π²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°Π½Π΅ :
seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)ΠΊΡΠ΄Π΅ΡΠΎ &filter β ΡΠΎΠ²Π° Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ Π²Π΅ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠ°ΡΠ° Π½ΠΈ ΡΡΡΡΠΊΡΡΡΠ° struct sock_fprog, Ρ.Π΅. ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° BPF.
Π‘ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° seccomp ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° ΡΠΎΠΊΠ΅ΡΠΈ? Π‘ ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. Π ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅, Π½ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ΅ ΠΎΠ±Π»Π°ΡΡ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠ°, Π° Π² ΡΠ»ΡΡΠ°Ρ Π½Π° seccomp Π½ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° ΡΡΡΡΠΊΡΡΡΠ° ΠΎΡ Π²ΠΈΠ΄Π°
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};Π’ΡΠΊ nr β ΡΠΎΠ²Π° Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΎΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, arch β ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° (Π·Π° ΡΠΎΠ²Π° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ), args β Π΄ΠΎ ΡΠ΅ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, Π° instruction_pointer β ΡΠΎΠ²Π° Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Π²ΡΡΡΠΈΡ
Π° ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π½Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π΄Π° Π·Π°ΡΠ΅Π΄ΠΈΠΌ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½Π°ΡΠ° ΠΏΠΎΠ²ΠΈΠΊΠ²Π½Π° Π² ΡΠ΅Π³ΠΈΡΡΡΡ A ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ
ldw [0]ΠΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ seccomp ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΡΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΠ°ΠΌΠΎ ΠΏΡΠΈ 32-Π±ΠΈΡΠΎΠ²ΠΎ ΠΏΠΎΠ΄ΡΠ°Π²Π½ΡΠ²Π°Π½Π΅ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΡΠ΅Π΄ΠΈΠΌ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ Π΄ΡΠΌΠ° ΠΈΠ»ΠΈ Π±Π°ΠΉΡ β ΠΏΡΠΈ ΠΎΠΏΠΈΡ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠΈΠ»ΡΡΡ ldh [0] ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ seccomp ΡΠ΅ Π²ΡΡΠ½Π΅ EINVAL. ΠΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ. (ΠΡ ΡΠΌΠ΅ΡΠ½ΠΎΡΠΎ, Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ commit, Π΄ΠΎΠ±Π°Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° seccomp, Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π±ΡΠ°Π²ΠΈΡ
Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΌΠΎΠ΄ (ΠΎΡΡΠ°ΡΡΠΊ ΠΎΡ Π΄Π΅Π»Π΅Π½ΠΈΠ΅) ΠΈ ΡΠ΅Π³Π° ΡΡ Π½Π΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Π·Π° 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 ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΏΡΠ»Π΅Π½ ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π°Π΄ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°, Π½ΠΎ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½ΠΎ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡΠ΅Π½ΠΎΡΠΈΠΌ ΠΈ/ΠΈΠ»ΠΈ ΡΠ΅ΡΠΈΠΌ ΠΊΠΎΠ΄. Π ΡΠΎΠ²Π° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° , ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΠ½ΠΈ ΠΈΠ»ΠΈ Π±Π΅Π»ΠΈ ΡΠΈΠ»ΡΡΠΈ.
ΠΠ΅ΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠ°ΠΉΠ» ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΠ΅Π½ ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π½ΠΈ ΠΎΡ (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΅ ΠΎΠΏΡΠΎΡΡΠ΅Π½Π° Π·Π° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΠ΅ΡΠΈΠΌΠΎΡΡ, ΠΏΡΠ»Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ):
#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
ΠΠΎΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 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} ---
+++ ΡΠ±ΠΈΡ ΠΎΡ SIGSYS (core dumped) +++
ΠΠΎΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΠΎΡΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ, ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΅ Π±ΠΈΠ»Π° Π·Π°Π²ΡΡΡΠ΅Π½Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π°Π±ΡΠ°Π½Π΅Π½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ mount(2).
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΠΈΡΠ°Ρ
ΠΌΠ΅ ΡΠΈΠ»ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libseccomp, ΡΡΠ±ΡΠ°Π» Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»Π΅Π½ ΠΊΠΎΠ΄ Π² ΡΠ΅ΡΠΈΡΠΈ ΡΠ΅Π΄Π°. Π ΠΏΡΠΈΠΌΠ΅ΡΠ° Π³ΠΎΡΠ΅, ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ½ΠΈΠΆΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΏΠΈΡΡΠΊ Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ. ΠΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΠΊΠΎΡΠΎ Π² libseccomp Π±Π΅ΡΠ΅ , Π΄ΠΎΠ±Π°Π²ΡΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π°ΡΡΠΈΠ±ΡΡΠ° Π½Π° ΡΠΈΠ»ΡΡΡΠ° SCMP_FLTATR_CTL_OPTIMIZE. ΠΠΊΠΎ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΡΠΎΠ·ΠΈ Π°ΡΡΠΈΠ±ΡΡ Π½Π° 2, ΡΠΈΠ»ΡΡΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° Π±ΠΈΠ½Π°ΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊ ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ΅ Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ , Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΠ°ΠΊΠΈΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ BPF ΠΏΠΎ Π½Π°Π±ΠΎΡ ΠΎΡ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
$ echo 1 3 6 8 13 | .\/generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0ΠΡΠΌΠ° ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π½Π΅ΡΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ BPF Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΏΡΠ΅Ρ
ΠΎΠ΄ΠΈ ΠΏΠΎ ΠΎΡΡΡΡΠΏ (Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, jmp A ΠΈΠ»ΠΈ jmp [label+X]) ΠΈ Π·Π°ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ΅Ρ
ΠΎΠ΄ΠΈ ΡΠ° ΡΡΠ°ΡΠΈΡΠ½ΠΈ.
seccomp ΠΈ strace
ΠΡΠ΅ΠΊΠΈ Π·Π½Π°Π΅ ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° strace β Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π² Linux. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΌΠ½ΠΎΠ³ΠΎ Ρ
ΠΎΡΠ° ΡΡΡΠΎ ΡΠ° ΡΡΠ²Π°Π»ΠΈ Π·Π° ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ. Π‘ΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° strace ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΡΠ΅Π· ptrace(2), Π° Π² ΡΠΎΠ·ΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° ΠΊΠΎΠ΅ ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΏΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΠ°, Ρ.Π΅., Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅
$ time strace du /usr/share/ >/dev/null 2>&1
real 0m3.081s
user 0m0.531s
sys 0m2.073sΠΈ
$ time strace -e open du /usr/share/ >/dev/null 2>&1
real 0m2.404s
user 0m0.193s
sys 0m1.800sΡΠ°Π±ΠΎΡΡΡ Π·Π° ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π²ΡΠ² Π²ΡΠΎΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΠΌ ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅.
ΠΠΎΠ²Π° ΠΎΠΏΡΠΈΡ --seccomp-bpf, Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π² strace Π²Π΅ΡΡΠΈΡ 5.3, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π΄Π° ΡΡΠΊΠΎΡΠΈ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΏΠΎΠ΄ ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π΅Π΄Π½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ Π²Π΅ΡΠ΅ Π΅ ΡΡΠ°Π²Π½ΠΈΠΌΠΎ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅:
$ time strace --seccomp-bpf -e open du /usr/share/ >/dev/null 2>&1
real 0m0.148s
user 0m0.017s
sys 0m0.131s
$ time du /usr/share/ >/dev/null 2>&1
real 0m0.140s
user 0m0.024s
sys 0m0.116s(Π’ΡΠΊ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ° ΠΌΠ°Π»ΠΊΠ° Ρ
ΠΈΡΡΠΎΡΡ, ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°ΠΌΠ΅ Π½Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°. ΠΠΊΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Ρ
ΠΌΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, newfsstat, ΡΠΎΠ³Π°Π²Π° strace ΡΠ΅ΡΠ΅ Π΄Π° Π·Π°Π±Π°Π²Ρ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈ Π±Π΅Π· --seccomp-bpf.)
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΡΠ°Π·ΠΈ ΠΎΠΏΡΠΈΡ? ΠΠ΅Π· Π½Π΅Ρ strace ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π° Ρ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΈ Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ΅Π· PTRACE_SYSCALL. ΠΠΎΠ³Π°ΡΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ ΡΡΠ°ΡΡΠΈΡΠ° (Π½ΡΠΊΠΎΠ΅) ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° strace, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ΅Π· PTRACE_SYSCALL. Π‘Π»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π·Π°Π²ΡΡΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ ΠΏΡΠΈ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ ΠΎΡ Π½Π΅Π³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° strace, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° Π²ΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΎΡΠ΅ΡΠ° ΡΡΠ΅Π· PTRACE_SYSCALL, ΠΈ Ρ.Π½.

Π§ΡΠ΅Π· 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 ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΡΠΈ ΠΎΡ . ΠΠ° Π½Π°Ρ Π½Π°ΠΉ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΡ ΡΠ°ΠΊΡ Π΅, ΡΠ΅ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡΡ BPF Π² Π»ΠΈΡΠ΅ΡΠΎ Π½Π° seccomp Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π°ΠΌΠΈΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
xt_bpf
Π‘Π΅Π³Π° ΡΠ΅ Π²ΡΡΡΠ°ΠΌΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΡΠ²Π΅ΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠΈΡΠ΅.
ΠΡΠ΅Π΄ΠΈΡΡΠΎΡΠΈΡ: ΠΎΡΠ΄Π°Π²Π½Π°, ΠΏΡΠ΅Π· 2007 Π³ΠΎΠ΄ΠΈΠ½Π°, Π² ΡΠ΄ΡΠΎΡΠΎ Π±Π΅ΡΠ΅ ΠΌΠΎΠ΄ΡΠ» xt_u32 Π·Π° netfilter. Π’ΠΎΠΉ Π±Π΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π½Π° ΠΎΡΠ΅ ΠΏΠΎ-Π΄ΡΠ΅Π²Π½ΠΈΡ ΡΡΠ°ΡΠΈΠΊ ΠΊΠ»Π°ΡΡΠΈΠΊΠ°ΡΠΎΡ cls_u32 ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΈΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° iptables Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: Π΄Π° ΡΠ΅ Π·Π°ΡΠ΅Π΄ΡΡ 32 Π±ΠΈΡΠ° ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ°Ρ Π½Π°Π±ΠΎΡ ΠΎΡ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ,
sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"ΠΠ°ΡΠ΅ΠΆΠ΄Π° 32 Π±ΠΈΡΠ° ΠΎΡ IP Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ°, Π·Π°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ ΠΎΡΡΡΡΠΏ 6, ΠΈ ΠΏΡΠΈΠ»Π°Π³Π° ΠΌΠ°ΡΠΊΠ° 0xFF (Π²Π·ΠΈΠΌΠ° ΠΌΠ»Π°Π΄ΡΠΈΡ Π±Π°ΠΉΡ). Π’ΠΎΠ²Π° Π΅ ΠΏΠΎΠ»Π΅ΡΠΎ protocol Π½Π° IP Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ° ΠΈ Π³ΠΎ ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ Ρ 1 (ICMP). Π Π΅Π΄Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ @ β ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Π½Π° X Π±Π°ΠΉΡΠ° Π½Π°Π΄ΡΡΠ½ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ
iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, Π΄Π°Π»ΠΈ TCP Sequence Number 0x29Π΅ ΡΠ°Π²Π΅Π½ Π½Π° 0. ΠΡΠΌΠ° Π΄Π° Π·Π°Π΄ΡΠ»Π±ΠΎΡΠ°Π²Π°ΠΌ ΡΠ΅ΠΌΠ°ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²Π΅ΡΠ΅ Π΅ ΡΡΠ½ΠΎ, ΡΠ΅ ΡΡΡΠ½ΠΎΡΠΎ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ. Π ΡΡΠ°ΡΠΈΡΡΠ° , ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π»ΠΈΠ½ΠΊΠ° Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° 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 ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΠΈΠ»ΡΡΠΈ ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅. ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ΅Π°Π»Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Cloudfare. ΠΠΎΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
Π° ΠΌΠΎΠ΄ΡΠ» xt_bpf Π·Π° Π·Π°ΡΠΈΡΠ° ΠΎΡ DDoS Π°ΡΠ°ΠΊΠΈ. Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ°Π·ΠΊΠ°Π·Π²Π°Ρ ΠΊΠ°ΠΊ (ΠΈ Π·Π°ΡΠΎ) Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ 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" ΠΈ Ρ.Π½.
ΠΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Cloudfare ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° 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, Π²ΠΈΠΆΡΠ΅ .
cls_bpf
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ BPF Π² ΡΠ΄ΡΠΎ Π΅ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ cls_bpf Π·Π° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Π² Linux, Π΄ΠΎΠ±Π°Π²Π΅Π½ Π² Linux Π² ΠΊΡΠ°Ρ Π½Π° 2013 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»Π½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ» Π΄ΡΠ΅Π²Π½ΠΈΡ cls_u32.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π½ΠΈΠ΅ Π½ΡΠΌΠ° Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠ΅Π³Π°, cls_bpfΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Π·Π½Π°Π½ΠΈΡΡΠ° Π·Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ BPF ΡΠΎΠ²Π° Π½Π΅ ΡΠ΅ Π½ΠΈ Π΄Π°Π΄Π΅ Π½ΠΈΡΠΎ β Π²Π΅ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Ρ
ΠΌΠ΅ Ρ ΡΡΠ»Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π² ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Extended BPF, Π½ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΠΌ Ρ ΡΠΎΠ·ΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΡΠ½ΠΎΠ²ΠΎ.
ΠΡΠ΅ Π΅Π΄Π½Π° ΠΏΡΠΈΡΠΈΠ½Π° Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ BPF Ρ cls_bpf Π΅, ΡΠ΅ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ Extended BPF, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΎΠ±Ρ
Π²Π°ΡΡΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½: ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π°Ρ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ°.
Π’Π°ΠΊΠ° ΡΠ΅ Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΡΠ΅ ΡΠ±ΠΎΠ³ΡΠ²Π°ΠΌΠ΅ Ρ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ BPF ΠΈ Π΄Π° Π½Π°Π΄Π·ΡΡΠ½Π΅ΠΌ Π² Π±ΡΠ΄Π΅ΡΠ΅ΡΠΎ.
Π‘Π±ΠΎΠ³ΡΠ²Π°Π½Π΅ Ρ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF
Π Π°Π·Π³Π»Π΅Π΄Π°Ρ
ΠΌΠ΅ Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° BPF, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½Π° Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° Π΄Π΅Π²Π΅ΡΠ΄Π΅ΡΠ΅ΡΡΠ΅, ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠ΅ΠΆΠΈΠ²Ρ ΡΠ΅ΡΠ²ΡΡΡ Π²Π΅ΠΊ ΠΈ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° Π½Π°ΠΌΠΈΡΠ° Π½ΠΎΠ²ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΠΏΡΠ΅Ρ
ΠΎΠ΄Π° ΠΎΡ ΡΡΠ΅ΠΊΠΎΠ²ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΊΡΠΌ RISC, ΠΊΠΎΠΉΡΠΎ Π΄Π°Π΄Π΅ ΡΡΠ°ΡΡ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF, Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° 2000-ΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π½Π°ΡΡΡΠΏΠΈ ΠΏΡΠ΅Ρ
ΠΎΠ΄ΡΡ ΠΎΡ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΠΊΡΠΌ 64-Π±ΠΈΡΠΎΠ²ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡΡ BPF Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΠΎΡΡΠ°ΡΡΠ²Π°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF ΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ, ΠΎΡΠ²Π΅Π½ ΠΎΡΡΠ°ΡΡΠ»Π°ΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, Π½ΡΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅, Π½ΡΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½Π° Π²ΡΡΠ·ΠΊΠ° Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΈ Π½ΡΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΡΠ΄ΡΠΎΡΠΎ, ΠΎΡΠ²Π΅Π½ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠΎΠΉ ΠΏΠΎΠ»Π΅ΡΠ° ΠΎΡ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. sk_buff ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΈΡΠ΅ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Ρ.
ΠΡΡΡΠ½ΠΎΡΡ, Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΎΡ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ BPF Π² Linux ΠΎΡΡΠ°Π½Π° ΡΠ°ΠΌΠΎ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π° Π²ΡΡΡΠ΅ Π² ΡΠ΄ΡΠΎΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π±ΠΈΠ»ΠΎ ΡΠΎ ΡΠΈΠ»ΡΡΠΈ Π½Π° ΡΠΎΠΊΠ΅ΡΠΈ ΠΈΠ»ΠΈ ΡΠΈΠ»ΡΡΠΈ seccomp, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΡΡΠ°Π½ΡΠ»ΠΈΡΠ°Ρ Π² Π½ΠΎΠ²ΠΈΡ ΡΠΎΡΠΌΠ°Ρ, Extended BPF. (Π©Π΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡ.)
ΠΡΠ΅Ρ ΠΎΠ΄ΡΡ ΠΊΡΠΌ Π½ΠΎΠ²Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π°ΠΏΠΎΡΠ½Π° ΠΏΡΠ΅Π· 2013 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΠ»Π΅ΠΊΡΠ΅ΠΉ Π‘ΡΠ°ΡΠΎΠ²ΠΎΠΉΡΠΎΠ² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ ΡΡ Π΅ΠΌΠ° Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π° BPF. ΠΡΠ΅Π· 2014 Π³ΠΎΠ΄ΠΈΠ½Π° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΠ°ΡΠΎΠ²Π΅ Π² ΡΠ΄ΡΠΎΡΠΎ. ΠΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌ, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΠΈ JIT-ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° Π·Π° ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° 64-Π±ΠΈΡΠΎΠ²ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΡΠ΅Π·ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ Π° Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° Π½ΠΎΠ²Π° Π³Π»Π°Π²Π° Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Linux.
Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΠΈ Π² ΡΠ°Π·ΠΈ ΡΠ΅ΡΠΈΡ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ°Ρ Π·Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π½Π° Π½ΠΎΠ²Π°ΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΊΠ°ΡΠΎ internal BPF, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° extended BPF, Π° ΡΠ΅Π³Π° ΠΏΡΠΎΡΡΠΎ BPF.
ΠΡΡΠ·ΠΊΠΈ
- Steven McCanne and Van Jacobson, "The BSD Packet Filter: A New Architecture for User-level Packet Capture",
https://www.tcpdump.org/papers/bpf-usenix93.pdf - Steven McCanne, "libpcap: An Architecture and Optimization Methodology for Packet Capture",
https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf tcpdump,libpcap:- .
- BPF β Π·Π°Π±ΡΠ°Π²Π΅Π½ΠΈΡΡ Π±Π°ΠΉΡ-ΠΊΠΎΠ΄:
https://blog.cloudflare.com/bpf-the-forgotten-bytecode/ - ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° BPF Tool:
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- Paul Chaignon, "strace βseccomp-bpf: ΠΏΠΎΠ³Π»Π΅Π΄ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ°",
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/ netsniff-ng:http://netsniff-ng.org/
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
