ΠΠ΅ΡΠΊΠ»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈ ΡΠΈΠ»ΡΡΠΈ (BPF) Π΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ° Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π½Π° ΠΠΈΠ½ΡΠΊΡ ΠΊΠΎΡΠ° Π΅ Π½Π° Π½Π°ΡΠ»ΠΎΠ²Π½ΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΡΠΊΠΈΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° Π°Π½Π³Π»ΠΈΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ Π²Π΅ΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ»Π½ΠΈ ΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° ΠΈ ΡΠ°Π·Π²ΠΎΡΠΎΡ Π½Π° BPF. ΠΠ΅ΡΠ²ΠΈΠ΄ ΠΠΈΠ»Π΅Ρ, ΠΎΠ΄ΡΠΆΡΠ²Π°Ρ Π½Π° ΠΌΡΠ΅ΠΆΠ΅Π½ ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΠΈΠ½ΡΠΊΡ, Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° ΡΠ²ΠΎΡΠΎΡ Π³ΠΎΠ²ΠΎΡ Π½Π° 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.
ΠΠΎΠ½ ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΎΡΡΠΌΠ΄Π΅ΡΠ΅ΡΡΠΈΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π½Π° ΠΌΠΈΠ½Π°ΡΠΈΠΎΡ Π²Π΅ΠΊ, ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΎΠ΄ ΠΏΠΎΠ·Π½Π°ΡΠ°ΡΠ° Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠΈΡΠ° ΠΠΎΡΠ΅Π½Ρ ΠΠ΅ΡΠΊΠ»ΠΈ ΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π° Π·Π° ΠΏΡΠ°ΡΠ°ΡΠ΅ΡΠΎ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ°Π°Ρ ΠΌΡΠ΅ΠΆΠ½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Ρ Π°ΡΠ΄Π²Π΅Ρ ΠΊΠΎΡ Π±Π΅ΡΠ΅ ΠΌΠΎΠ΄Π΅ΡΠ΅Π½ Π²ΠΎ Π΄ΠΎΡΠ½ΠΈΡΠ΅ ΠΎΡΡΠΌΠ΄Π΅ΡΠ΅ΡΡΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π½Π° ΠΌΠΈΠ½Π°ΡΠΈΠΎΡ Π²Π΅ΠΊ. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅, ΠΏΡΠ²ΠΈΡΠ½ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π²ΠΎ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ° CSPF (CMU/Stanford Packet Filter), Π±Π΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ°Π°Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠ°Π½ΠΎ, Ρ.Π΅. Π²ΠΎ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΎ ΡΠΎΠ° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½ΡΠ²Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ. ΠΠ° Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΡΠ°Π΅ΡΠ΅ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΊΠΎΠ΄ Π²ΠΎ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΡΠΎ ΠΏΠ΅ΡΠΎΠΊ.
Π‘Π΅ΠΏΠ°ΠΊ, Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ Π·Π° ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ Π±Π΅Π° Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° ΠΎΡΠ°ΠΊ ΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠ΅Π° ΡΠΎΠ»ΠΊΡ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ Π½Π° ΠΏΠΎΠ½ΠΎΠ²ΠΈΡΠ΅ RISC ΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΠΏΡΠ΅ΠΊΡ Π½Π°ΠΏΠΎΡΠΈΡΠ΅ Π½Π° ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΎΠ΄ Berkeley Labs, Π±Π΅ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ΅Π½Π° Π½ΠΎΠ²Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ° BPF (Berkeley Packet Filters), ΡΠΈΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π±Π΅ΡΠ΅ Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½Π° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ Motorola 6502 - ΡΠ°Π±ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΡ Π½Π° ΡΠ°ΠΊΠ²ΠΈ Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° BPF
Π‘ΠΎ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ΅Π½ Π½Π°ΡΠΈΠ½, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ. Π‘Π΅ΠΏΠ°ΠΊ, Π·Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊ, Π΄Π° ΡΠ΅ΡΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° ΠΈΠΌΠ°ΡΠ΅ Π΄Π²Π° 32-Π±ΠΈΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ, Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ A
ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ΅Π½ ΡΠ΅Π³ΠΈΡΡΠ°Ρ X
, 64 Π±Π°ΡΡΠΈ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° (16 Π·Π±ΠΎΡΠΎΠ²ΠΈ), Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠΈΡΠ°ΡΠ΅ ΠΈ ΠΌΠ°Π» ΡΠΈΡΡΠ΅ΠΌ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΎΠ²ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΈ. ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅ΡΠΊΠΎΠΊΠ½ΡΠ²Π°ΡΠ΅ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΡΡΠ»ΠΎΠ²Π½ΠΈ ΠΈΠ·ΡΠ°Π·ΠΈ Π±Π΅Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅, Π½ΠΎ Π·Π° Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° Π½Π°Π²ΡΠ΅ΠΌΠ΅Π½ΠΎ Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠΊΠΎΠΊΠΎΠ²ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π°Ρ ΡΠ°ΠΌΠΎ Π½Π°ΠΏΡΠ΅Π΄, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ, Π±Π΅ΡΠ΅ Π·Π°Π±ΡΠ°Π½Π΅ΡΠΎ Π΄Π° ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Π°Ρ ΡΠ°ΠΌΠΊΠΈ.
ΠΠΏΡΡΠ°ΡΠ° ΡΠ΅ΠΌΠ° Π·Π° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΠ²Π°. ΠΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΡΠΎΠ·Π΄Π°Π²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° BPF ΠΈ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π½Π΅ΠΊΠΎΠΈ ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ (ΠΊΠ°ΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ), ΡΠ° Π²ΡΠΈΡΡΠ²Π° ΠΈ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠΎ Π½Π° Π½Π΅ΠΊΠΎΠΈ Π΄ΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° Π½Π°ΡΡΠ°Π½ΠΈ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΡΡΠ°Π½ Π΅ ΠΏΡΠΈΡΡΠΈΠ³Π½ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π½Π° ΠΌΡΠ΅ΠΆΠ½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°). ΠΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ Π½Π°ΡΡΠ°Π½, ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ ΠΏΡΠ΅Π²Π΅Π΄ΡΠ²Π°Ρ), Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠ°ΡΠ° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π½Π° Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΠ΅ΠΌΠΎΡΠΈΡΠΊΠΈ ΡΠ΅Π³ΠΈΠΎΠ½ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° Π΄ΠΎΡΠ΄ΠΎΠ²Π΅Π½ ΠΏΠ°ΠΊΠ΅Ρ).
ΠΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡΠΎ ΡΠ΅ Π½ΠΈ Π±ΠΈΠ΄Π΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π·Π° Π΄Π° ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ Π΄Π° Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ: ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌΠ΅ ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΈ ΡΠΎΡΠΌΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠΎ ΠΏΠΎΡΡΠ΅Π±Π°. ΠΠΊΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ Π²Π΅Π΄Π½Π°Ρ Π΄Π° Π³ΠΎ ΠΏΡΠΎΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΈ Π΄Π° Π΄ΠΎΠ·Π½Π°Π΅ΡΠ΅ Π·Π° ΡΠΈΡΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΡΠΎΠ³Π°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° libpcap
: ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡΠ° Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π·Π° ΡΠ°ΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈlibpcap
.
Π‘Π΅Π³Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠΈΡΠ΅ Π·Π½Π°ΡΠ°ΡΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ΅Π½ BPF Π½Π° Linux: tcpdump
(libpcap
), ΡΠ΅ΠΊΠΊΠΎΠΌΠΏ, 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)
ΡΠΈ Π±Π°ΡΡ ΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈΠΎΡ ΠΌΡΠ΅ΠΆΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ. Π§ΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΠ΄ Π΅ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ eth0
, ΠΈ ΠΎΠ²Π°
6 6 2
|Destination MAC|Source MAC|Ether Type|...|
ΠΠ½Π°ΡΠΈ ΠΏΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ldh [12]
Π²ΠΎ ΡΠ΅Π³ΠΈΡΡΠ°ΡΠΎΡ A
ΡΠ΅ ΠΈΠΌΠ° Π½ΠΈΠ²Π° Ether Type
β ΡΠΈΠΏΠΎΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΡΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π° Π²ΠΎ ΠΎΠ²Π°Π° Π΅ΡΠ΅ΡΠ½Π΅Ρ ΡΠ°ΠΌΠΊΠ°. ΠΠ° Π»ΠΈΠ½ΠΈΡΠ° 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 ΠΏΠ°ΠΊΠ΅Ρ (Π’ΠΈΠΏ Π½Π° Π΅ΡΠ΅Ρ = 0x800
) ΠΈ Π²ΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ Π²ΠΎ ΡΠ΅Π³ΠΈΡΡΠ°ΡΠΎΡ A
24-ΡΠΈ Π±Π°ΡΡ ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ. ΠΠ°ΡΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ
14 8 1 1
|ethernet header|ip fields|ttl|protocol|...|
ΡΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π²ΡΠΈΡΡΠ²Π°ΠΌΠ΅ Π²ΠΎ ΡΠ΅Π³ΠΈΡΡΠ°ΡΠΎΡ A
ΠΏΠΎΠ»Π΅ΡΠΎ Protocol Π½Π° IP Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ, ΡΡΠΎ Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ TCP ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠΈΠ΅ Π³ΠΎ ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ ΡΠΎ 0x6
(IPPROTO_TCP
ΠΠ° Π»ΠΈΠ½ΠΈΠΈΡΠ΅ 4 ΠΈ 5 Π³ΠΈ Π²ΡΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΡΠ·Π±ΠΎΡΠΎΠ²ΠΈΡΠ΅ Π»ΠΎΡΠΈΡΠ°Π½ΠΈ Π½Π° Π°Π΄ΡΠ΅ΡΠ°ΡΠ° 20 ΠΈ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° jset
ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π°Π»ΠΈ Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΎ Π΅Π΄Π½ΠΎ ΠΎΠ΄ ΡΡΠΈΡΠ΅ jset
ΡΠ΅ Π±ΡΠΈΡΠ°Ρ ΡΡΠΈΡΠ΅ Π½Π°ΡΠ·Π½Π°ΡΠ°ΡΠ½ΠΈ Π±ΠΈΡΠ°. ΠΠ²Π° ΠΎΠ΄ ΡΡΠΈΡΠ΅ Π±ΠΈΡΠ° Π½ΠΈ ΠΊΠ°ΠΆΡΠ²Π°Π°Ρ Π΄Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ Π΅ Π΄Π΅Π» ΠΎΠ΄ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ IP ΠΏΠ°ΠΊΠ΅Ρ, ΠΈ Π°ΠΊΠΎ Π΅ ΡΠ°ΠΊΠ°, Π΄Π°Π»ΠΈ Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ. Π’ΡΠ΅ΡΠΈΠΎΡ Π±ΠΈΡ Π΅ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠ°Π½ ΠΈ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π½ΡΠ»Π°. ΠΠ΅ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π½ΠΈΡΡ Π½Π΅ΡΠ΅Π»ΠΎΡΠ½ΠΈ ΠΈΠ»ΠΈ ΡΠΊΡΡΠ΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΏΠ° Π·Π°ΡΠΎΠ° Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠΈΡΠ΅ ΡΡΠΈ Π±ΠΈΡΠ°.
ΠΠΈΠ½ΠΈΡΠ°ΡΠ° 6 Π΅ Π½Π°ΡΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° Π²ΠΎ ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ°. ΠΠ·ΡΠ°Π·ΡΠ²Π°ΡΠ΅ ldxb 4*([14]&0xf)
Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π²ΡΠΈΡΡΠ²Π°ΠΌΠ΅ Π²ΠΎ ΡΠ΅Π³ΠΈΡΡΠ°ΡΠΎΡ X
Π½Π°ΡΠΌΠ°Π»ΠΊΡ Π·Π½Π°ΡΠ°ΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΠΈΡΠΈ Π±ΠΈΡΠ° ΠΎΠ΄ ΠΏΠ΅ΡΠ½Π°Π΅ΡΠ΅ΡΡΠΈΠΎΡ Π±Π°ΡΡ ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΠΏΠΎΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈ ΡΠΎ 4. ΠΠ°ΡΠΌΠ°Π»ΠΊΡ Π·Π½Π°ΡΠ°ΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΠΈΡΠΈ Π±ΠΈΡΠ° ΠΎΠ΄ ΠΏΠ΅ΡΠ½Π°Π΅ΡΠ΅ΡΡΠΈΠΎΡ Π±Π°ΡΡ Π΅ ΠΏΠΎΠ»Π΅ΡΠΎ 4*([14]&0xf)
Π΅ ΠΎΠ·Π½Π°ΠΊΠ° Π·Π° ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½Π° Π°Π΄ΡΠ΅ΡΠ½Π° ΡΠ΅ΠΌΠ° ΠΊΠΎΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ°ΠΌΠΎ Π²ΠΎ ΠΎΠ²Π°Π° ΡΠΎΡΠΌΠ° ΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅Π³ΠΈΡΡΠ°Ρ X
, Ρ.Π΅. Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π½ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ldb 4*([14]&0xf)
Π½ΠΈΡΡ ΠΏΠ°ΠΊ ldxb 5*([14]&0xf)
(ΠΌΠΎΠΆΠ΅ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ldxb 4*([16]&0xf)
). ΠΠ°ΡΠ½ΠΎ Π΅ Π΄Π΅ΠΊΠ° ΠΎΠ²Π°Π° ΡΠ΅ΠΌΠ° Π·Π° Π°Π΄ΡΠ΅ΡΠΈΡΠ°ΡΠ΅ Π΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° Π½Π° BPF ΡΠΎΠΊΠΌΡ ΡΠΎ ΡΠ΅Π» Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ X
(ΠΈΠ½Π΄Π΅ΠΊΡΠ΅Π½ ΡΠ΅Π³ΠΈΡΡΠ°Ρ) ΠΠΎΠ»ΠΆΠΈΠ½Π° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ IPv4.
Π’Π°ΠΊΠ°, Π½Π° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° 7 ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° Π²ΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π·Π±ΠΎΡ Π½Π° (X+16)
. ΠΠ°ΠΏΠΎΠΌΠ½ΡΠ²Π°ΡΡΠΈ Π΄Π΅ΠΊΠ° 14 Π±Π°ΡΡΠΈ ΡΠ΅ ΠΎΠΊΡΠΏΠΈΡΠ°Π½ΠΈ ΠΎΠ΄ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ Π½Π° ΠΡΠ΅ΡΠ½Π΅Ρ, ΠΈ X
ΡΠ° ΡΠΎΠ΄ΡΠΆΠΈ Π΄ΠΎΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ IPv4, Π½ΠΈΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π²ΠΎ A
ΠΠ΄ΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΠΏΠΎΡΡΠ° TCP Π΅ Π²ΡΠΈΡΠ°Π½Π°:
14 X 2 2
|ethernet header|ip header|source port|destination port|
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° 8 ΡΠ° ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΡΡΠΈΠ½Π°ΡΠΈΡΠΊΠ°ΡΠ° ΠΏΠΎΡΡΠ° ΡΠΎ ΡΠ°ΠΊΠ°Π½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΠΈ Π½Π° Π»ΠΈΠ½ΠΈΠΈΡΠ΅ 9 ΠΈΠ»ΠΈ 10 Π³ΠΎ Π²ΡΠ°ΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ - Π΄Π°Π»ΠΈ Π΄Π° ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΠΈΠ»ΠΈ Π½Π΅.
Tcpdump: ΡΠ΅ Π²ΡΠΈΡΡΠ²Π°
ΠΠΎ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ, Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π½Π΅ Π·Π±ΠΎΡΡΠ²Π°Π²ΠΌΠ΅ Π΄Π΅ΡΠ°Π»Π½ΠΎ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΡΠΎΡΠ½ΠΎ Π³ΠΎ Π²ΡΠΈΡΡΠ²Π°ΠΌΠ΅ BPF Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ΠΎΡ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠΏΡΡΠΎ Π·Π΅ΠΌΠ΅Π½ΠΎ, tcpdump
ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½ Π½Π° ΠΌΠ½ΠΎΠ³Ρ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΡΠΈΠ»ΡΡΠΈ tcpdump
libpcap
libpcap
, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΠ²ΠΎ:
- ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π° ΡΠΈΠΏΠΎΡ
pcap_t
ΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ: ,pcap_create
- Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ:
,pcap_activate
- ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ° ΡΠΈΠ»ΡΠ΅Ρ:
,pcap_compile
- ΡΠΈΠ»ΡΠ΅Ρ Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅:
.pcap_setfilter
ΠΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° pcap_setfilter
ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ Π²ΠΎ Linux, Π½ΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ strace
(Π½Π΅ΠΊΠΎΠΈ Π»ΠΈΠ½ΠΈΠΈ ΡΠ΅ ΠΎΡΡΡΡΠ°Π½Π΅ΡΠΈ):
$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768) = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...
ΠΠ° ΠΏΡΠ²ΠΈΡΠ΅ Π΄Π²Π΅ Π»ΠΈΠ½ΠΈΠΈ Π½Π° ΠΈΠ·Π»Π΅Π· ΡΡΠΎ Π³ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ eth0
. ΠΠ΄ ip
ΡΠ΅ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ ΡΠ΅ΡΠΈΡΠΈ BPF ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π° Π½Π° ΡΡΠ΅ΡΠ°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ° Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΎΠΏΡΠΈΡΠ°ΡΠ° SO_ATTACH_FILTER
setsockopt
Π²ΡΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΈ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΠΌΠ΅ ΡΠΈΠ»ΡΠ΅Ρ ΡΠΎ Π΄ΠΎΠ»ΠΆΠΈΠ½Π° 4. ΠΠ²Π° Π΅ Π½Π°ΡΠΈΠΎΡ ΡΠΈΠ»ΡΠ΅Ρ.
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° Π²ΠΎ ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΠΎΡ BPF, Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ ΠΈ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠΈΠ»ΡΠ΅ΡΠΎΡ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΠΊΠ°ΠΊΠΎ Π°ΡΠΎΠΌΡΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ°, Π° Π²ΠΎ Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° BPF, Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΈ Π½Π΅ΡΠ·ΠΈΠ½ΠΎΡΠΎ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ ΡΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΡ Π½Π° Π½Π°ΡΡΠ°Π½ΠΈ ΡΠ΅ ΠΎΠ΄Π΄Π΅Π»Π΅Π½ΠΈ Π½Π°Π²ΡΠ΅ΠΌΠ΅.
Π‘ΠΊΡΠΈΠ΅Π½Π° Π²ΠΈΡΡΠΈΠ½Π°
ΠΠ°Π»ΠΊΡ ΠΏΠΎΡΠ΅Π»ΠΎΡΠ½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768) = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0xbeefbeefbeef}, 16) = 0
recvfrom(3, 0x7ffcad394257, 1, MSG_TRUNC, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...
ΠΠ°ΠΊΠΎ ΡΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Π²ΠΌΠ΅ ΠΏΠΎΠ³ΠΎΡΠ΅, Π³ΠΎ Π²ΡΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΈ Π³ΠΎ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΡΠΈΠ»ΡΠ΅Ρ ΡΠΎ ΡΡΠ΅ΠΊΠ΅ΡΠΎΡ Π½Π° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° 5, Π½ΠΎ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π½Π° Π»ΠΈΠ½ΠΈΠΈΡΠ΅ 3 ΠΈ 4? ΠΠ·Π»Π΅Π³ΡΠ²Π° Π΄Π΅ΠΊΠ° ΠΎΠ²Π° libpcap
ΡΠ΅ Π³ΡΠΈΠΆΠΈ Π·Π° Π½Π°Ρ - ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ ΠΎΠ΄ Π½Π°ΡΠΈΠΎΡ ΡΠΈΠ»ΡΠ΅Ρ Π½Π΅ Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΡΠΎ Π½Π΅ Π³ΠΎ Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΡΠ²Π°Π°Ρ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ret #0
(ΠΎΡΡΡΠ»ΠΈ Π³ΠΈ ΡΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ), Π³ΠΎ ΠΏΡΠ΅ΡΡΠ»Π° ΡΡΠ΅ΠΊΠ΅ΡΠΎΡ Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅ ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π° Π΄Π° Π³ΠΈ ΠΎΠ΄Π·Π΅ΠΌΠ΅ ΡΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΡΠΎ Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»Π΅ Π΄Π° ΠΎΡΡΠ°Π½Π°Ρ ΠΎΠ΄ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ.
Π‘Π΅Π²ΠΊΡΠΏΠ½ΠΎ, Π·Π° Π΄Π° Π³ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ Π½Π° Linux ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΊΠ»Π°ΡΠΈΡΠ΅Π½ BPF, ΡΡΠ΅Π±Π° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΡΠΈΠ»ΡΠ΅Ρ Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ°ΠΊΠΎ struct sock_fprog
ΠΈ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΡΡΠ΅ΠΊΠ΅Ρ, ΠΏΠΎ ΡΡΠΎ ΡΠΈΠ»ΡΠ΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΡΠΈ Π½Π° ΡΡΠ΅ΠΊΠ΅ΡΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ setsockopt
.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅ ΡΡΠΎ ΡΠΈΠ»ΡΠ΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΡΠΈ Π½Π° ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΡΡΠ΅ΠΊΠ΅Ρ, Π° Π½Π΅ ΡΠ°ΠΌΠΎ ΡΡΡΠΎΠ². ΠΠ²Π΅
ΠΠΎΠ²Π΅ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° setsockopt
Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΈΠ»ΡΡΠΈ, Π²ΠΈΠ΄Π΅ΡΠ΅ struct sock_fprog
Π±Π΅Π· ΠΏΠΎΠΌΠΎΡ tcpdump
ΡΠ΅ ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠ°ΠΌΠ΅ Π²ΠΎ Π΄Π΅Π»ΠΎΡ
ΠΠ»Π°ΡΠΈΡΠ΅Π½ BPF ΠΈ 21 Π²Π΅ΠΊ
BPF Π±Π΅ΡΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π²ΠΎ ΠΠΈΠ½ΡΠΊΡ Π²ΠΎ 1997 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΎΡΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠ½Π° ΡΠΈΠ»Π° Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ libpcap
Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠΎΡΠ΅Π±Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ (ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΠΠΈΠ½ΡΠΊΡ, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, x86_64
ΠΊΠΎΠ΄.
JIT ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ Π±Π΅ΡΠ΅ ΠΏΡΠ²ΠΈΠΎΡ Π²ΠΎ ΡΠΈΠ½ΡΠΈΡΠΎΡ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ: Π²ΠΎ 2012 Π³ΠΎΠ΄ΠΈΠ½Π° xt_bpf
, ΠΊΠΎΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° iptables
ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΠΠ€, Π° Π²ΠΎ ΠΎΠΊΡΠΎΠΌΠ²ΡΠΈ 2013 Π³ΠΎΠ΄ΠΈΠ½Π° Π±Π΅ΡΠ΅ cls_bpf
, ΠΊΠΎΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Π½Π° ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ BPF.
ΠΠ°ΡΠΊΠΎΡΠΎ ΡΠ΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΎ, Π½ΠΎ ΠΏΡΠ²ΠΎ ΡΠ΅ Π½ΠΈ Π±ΠΈΠ΄Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π΄Π° Π½Π°ΡΡΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΈ ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° BPF, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΡΡΠΎ Π³ΠΈ Π½ΡΠ΄ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libpcap
ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ (Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ: Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΡΠΈΠ»ΡΠ΅Ρ libpcap
ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΡΠ°ΡΠΈ ΡΠ°ΠΌΠΎ Π΄Π²Π΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ - 0 ΠΈΠ»ΠΈ 0x40000) ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΎ, ΠΊΠ°ΠΊΠΎ Π²ΠΎ ΡΠ»ΡΡΠ°ΡΠΎΡ ΡΠΎ seccomp, Π½Π΅ ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ Π½Π° BPF ΡΠΎ ΡΠ²ΠΎΠΈ ΡΠ°ΡΠ΅
ΠΡΠ΄Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌΠ΅ ΡΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΎΡ ΡΠΎΡΠΌΠ°Ρ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ BPF, ΡΠΎΠ° Π΅ ΠΌΠ½ΠΎΠ³Ρ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ:
16 8 8 32
| code | jt | jf | k |
Π‘Π΅ΠΊΠΎΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠ° Π·Π°ΡΠ°ΡΠ° 64 Π±ΠΈΡΠ°, Π²ΠΎ ΠΊΠΎΠΈ ΠΏΡΠ²ΠΈΡΠ΅ 16 Π±ΠΈΡΠ° ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΊΠΈΠΎΡ ΠΊΠΎΠ΄, Π° ΠΏΠΎΡΠΎΠ° ΠΈΠΌΠ° Π΄Π²Π΅ ΠΎΡΡΠΌ-Π±ΠΈΡΠ½ΠΈ Π°Π»ΠΈΠ½Π΅ΡΠ°, jt
ΠΈ jf
, ΠΈ 32 Π±ΠΈΡΠ° Π·Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΡ K
, ΡΠΈΡΠ° ΡΠ΅Π» Π²Π°ΡΠΈΡΠ° ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ret
, ΠΊΠΎΡ ΡΠ° ΠΏΡΠ΅ΠΊΠΈΠ½ΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π³ΠΎ ΠΈΠΌΠ° ΠΊΠΎΠ΄ΠΎΡ 6
, Π° ΠΏΠΎΠ²ΡΠ°ΡΠ½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΡΠ΅ Π·Π΅ΠΌΠ° ΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΡΠ° K
. ΠΠΎ 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))
ΠΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ, Π½ΠΎ ΠΏΠΎΠ½Π΅ΠΊΠΎΠ³Π°Ρ Π΅ Π½Π΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΎ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡΠ°ΡΠ΅, ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΈ Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡΠΈ, ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π°ΠΏΠΈΡΠΈ Π½Π° Π₯Π°Π±ΡΠ΅ ΠΈΡΠ½.). ΠΠ° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ, Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° <linux/filter.h>
ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΌΠ°ΠΊΡΠΎΠ° - ΠΈΡΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ³ΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΠΊΠΎ
struct sock_filter code[] = {
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
BPF_STMT(BPF_RET|BPF_K, 0x00040000),
BPF_STMT(BPF_RET|BPF_K, 0),
}
Π‘Π΅ΠΏΠ°ΠΊ, ΠΎΠ²Π°Π° ΠΎΠΏΡΠΈΡΠ° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ³ΠΎΠ΄Π½Π°. ΠΠ²Π° Π΅ ΠΎΠ½Π° ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π½Π° ΠΠΈΠ½ΡΠΊΡ Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π»ΠΎΠΆΠΈΡΠ°, Π° ΡΠΎ ΡΠΎΠ° ΠΈ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ tools/bpf
ΠΠ°Π·ΠΈΠΊΠΎΡ Π½Π° ΡΠΎΠ±ΡΠ°Π½ΠΈΠ΅ΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ»ΠΈΡΠ΅Π½ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ 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
, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ²ΠΌΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° ΠΎΠ²ΠΎΡ Π΄Π΅Π».
ΠΠΈΠ½ΡΠΊΡ ΠΈ netsniff-ng Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ
ΠΠΎΠΊΡΠ°Ρ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡΠ΅ BPF, Linux ΠΈ tools/bpf/bpf_asm
ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° ΠΈ struct sk_buff
, ΠΊΠΎΡ ΠΎΠΏΠΈΡΡΠ²Π° ΠΌΡΠ΅ΠΆΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ. Π‘Π΅ΠΏΠ°ΠΊ, ΠΏΠΎΡΡΠΎΡΠ°Ρ ΠΈ Π΄ΡΡΠ³ΠΈ Π²ΠΈΠ΄ΠΎΠ²ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ ldw cpu
ΡΠ΅ ΡΠ΅ Π²ΡΠΈΡΠ° Π²ΠΎ ΡΠ΅Π³ΠΈΡΡΠ°ΡΠΎΡ A
ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ raw_smp_processor_id()
. (ΠΠΎ Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° BPF, ΠΎΠ²ΠΈΠ΅ Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ΅Π½ΠΈ Π·Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΡΠΎ Π·Π±ΠΈΡ Π½Π° ΠΏΠΎΠΌΠΎΡΠ½ΠΈΡΠΈ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°, ΡΡΡΡΠΊΡΡΡΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π°ΡΡΠ°Π½ΠΈ.) ΠΠ²Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΡΠΈΠ»ΡΠ΅Ρ Π²ΠΎ ΠΊΠΎΡ Π³ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΠ°Π³Π»Π°Π²ΠΈΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° Π½Π°ΡΡΠ°Π²ΠΊΠ°ΡΠ° poff
, ΠΎΡΡΠ΅Ρ Π½Π° Π½ΠΎΡΠΈΠ²ΠΎΡΡ:
ld poff
ret a
BPF Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π²ΠΎ tcpdump
, Π½ΠΎ ΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠΈΡΠΈΠ½Π° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ ΡΠΎ ΠΊΠΎΠΌΡΠ½Π°Π»Π½ΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ netsniff-ng
netsniff-ng
, ΠΊΠΎΡ, ΠΏΠΎΠΊΡΠ°Ρ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° BPF, ΡΠΎΠ΄ΡΠΆΠΈ ΠΈ Π΅ΡΠΈΠΊΠ°ΡΠ΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ ΠΈ ΠΏΠΎΠ½Π°ΠΏΡΠ΅Π΄Π΅Π½ ΠΎΠ΄ tools/bpf/bpf_asm
, ΠΏΠΎΠ²ΠΈΠΊΠ° Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΡ Π½Π° BPF bpfc
. ΠΠ°ΠΊΠ΅ΡΠΎΡ ΡΠΎΠ΄ΡΠΆΠΈ Π΄ΠΎΡΡΠ° Π΄Π΅ΡΠ°Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°, Π²ΠΈΠ΄Π΅ΡΠ΅ Π³ΠΈ ΠΈ Π²ΡΡΠΊΠΈΡΠ΅ Π½Π° ΠΊΡΠ°ΡΠΎΡ ΠΎΠ΄ ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
ΡΠ΅ΠΊΠΊΠΎΠΌΠΏ
ΠΠ½Π°ΡΠΈ, Π½ΠΈΠ΅ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΡΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ ΠΈ ΡΠΌΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π½ΠΎΠ²ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ, ΠΎΠ΄ ΠΊΠΎΠΈ ΠΏΡΠ²ΠΈΠΎΡ Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ° seccomp, ΠΊΠΎΡΠ° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ BPF ΡΠΈΠ»ΡΡΠΈ, Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° Π΄Π°Π΄Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΠΎΡΠΎΠΌΡΠΈ.
ΠΡΠ²Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° seccomp Π±Π΅ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π²ΠΎ 2005 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π½Π΅ Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠΏΡΠ»Π°ΡΠ½Π°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°ΡΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΎΠΏΡΠΈΡΠ° - Π΄Π° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ»Π΅Π΄Π½ΠΎΠ²ΠΎ: read
, write
, exit
ΠΈ sigreturn
, Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΡΡΠΎ Π³ΠΈ ΠΏΡΠ΅ΠΊΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π±Π΅ΡΠ΅ ΡΠ±ΠΈΠ΅Π½ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ SIGKILL
. Π‘Π΅ΠΏΠ°ΠΊ, Π²ΠΎ 2012 Π³ΠΎΠ΄ΠΈΠ½Π°, seccomp Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° BPF ΡΠΈΠ»ΡΡΠΈ, ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°ΡΡΠΈ Π²ΠΈ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π·Π±ΠΈΡ Π½Π° Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ, ΠΏΠ° Π΄ΡΡΠΈ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π½ΠΈΠ²Π½ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ. (ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅ ΡΡΠΎ Chrome Π±Π΅ΡΠ΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΠΏΡΠ²ΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ Π½Π° ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ, Π° Π»ΡΡΠ΅ΡΠΎ ΠΎΠ΄ Chrome Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π·Π²ΠΈΠ²Π°Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·Π°ΠΌ KRSI Π·Π°ΡΠ½ΠΎΠ²Π°Π½ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° BPF ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Π°Ρ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΡΠ²Π°ΡΠ΅ Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π° Linux.) ΠΡΡΠΊΠΈ Π΄ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ Π½Π° ΠΊΡΠ°ΡΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° Π²Π΅ΡΠ΅ ΠΈΠΌΠ° Π½Π°ΠΏΠΈΡΠΈ Π½Π° ΡΠ΅Π½ΡΠ°ΡΠΎΡ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° seccomp, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΠΊΠΎΡ ΡΠ΅ ΡΠ°ΠΊΠ° Π΄Π° Π³ΠΈ ΠΏΡΠΎΡΠΈΡΠ° ΠΏΡΠ΅Π΄ (ΠΈΠ»ΠΈ Π½Π°ΠΌΠ΅ΡΡΠΎ) Π΄Π° Π³ΠΈ ΠΏΡΠΎΡΠΈΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΠΊΡΠΈΠΈ. ΠΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ°
Π‘Π»Π΅Π΄Π½ΠΎ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΈ Π²ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΠ»ΡΡΠΈ Π·Π° seccomp
Π²ΠΎ Π³ΠΎΠ»ΠΎ C ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libseccomp
ΠΈ ΠΊΠΎΠΈ ΡΠ΅ Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΈ Π»ΠΎΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈ Π½Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΎΠΏΡΠΈΡΠ°, ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ seccomp ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° strace
.
Π€ΠΈΠ»ΡΡΠΈ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΈ Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π·Π° seccomp
ΠΠΈΠ΅ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΏΠ° Π°ΡΠ΄Π΅ ΠΏΡΠ²ΠΎ Π΄Π° Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ seccomp. ΠΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠΈΠ»ΡΠ΅Ρ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΡΠΎΡΠ΅Ρ ΠΈ ΡΠΈΡΠ΅ Π΄Π΅ΡΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ ΡΠ΅ Π³ΠΈ Π½Π°ΡΠ»Π΅Π΄Π°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ°ΡΠ°. ΠΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ seccomp(2)
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
. Π€ΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π²ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ seccomp_check_filter()
mod
(ΠΎΡΡΠ°ΡΠΎΠΊ ΠΎΠ΄ ΠΏΠΎΠ΄Π΅Π»Π±Π°) ΠΈ ΡΠ΅Π³Π° Π΅ Π½Π΅Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π·Π° seccomp BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅, ΠΎΠ΄ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅
ΠΠΎ ΠΎΡΠ½ΠΎΠ²Π°, Π½ΠΈΠ΅ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΠΌΠ΅ ΡΓ¨ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΈ ΡΠΈΡΠ°ΡΠ΅ Π½Π° 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
Bad system call
ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ strace
Π·Π° Π΄Π΅ΡΠ°Π»ΠΈ:
$ sudo strace -e seccomp ./seccomp_lib mount -t bpf bpf /tmp
seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=50, filter=0x55d8e78428e0}) = 0
--- SIGSYS {si_signo=SIGSYS, si_code=SYS_SECCOMP, si_call_addr=0xboobdeadbeef, si_syscall=__NR_mount, si_arch=AUDIT_ARCH_X86_64} ---
+++ killed by SIGSYS (core dumped) +++
Bad system call
ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π·Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΅ ΠΏΡΠ΅ΠΊΠΈΠ½Π°ΡΠ° ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° Π½Π΅Π»Π΅Π³Π°Π»Π΅Π½ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ mount(2)
.
ΠΠ½Π°ΡΠΈ, Π½Π°ΠΏΠΈΡΠ°Π²ΠΌΠ΅ ΡΠΈΠ»ΡΠ΅Ρ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libseccomp
, Π²ΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΡΠΈ Π³ΠΎ Π½Π΅ΡΡΠΈΠ²ΠΈΡΠ°Π»Π½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π²ΠΎ ΡΠ΅ΡΠΈΡΠΈ Π»ΠΈΠ½ΠΈΠΈ. ΠΠΎ Π³ΠΎΡΠ½ΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π΅ ΡΠ°ΠΌΠΎ Π»ΠΈΡΡΠ° Π½Π° ΡΠΏΠΎΡΠ΅Π΄Π±ΠΈ. ΠΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ°, libseccomp Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° ΠΈΠΌΠ°ΡΠ΅ SCMP_FLTATR_CTL_OPTIMIZE
. ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²ΠΎΡ Π°ΡΡΠΈΠ±ΡΡ Π½Π° 2 ΡΠ΅ Π³ΠΎ ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈ ΡΠΈΠ»ΡΠ΅ΡΠΎΡ Π²ΠΎ Π±ΠΈΠ½Π°ΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅.
ΠΠΊΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π°Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ Π·Π° ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅
$ 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
ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΠΎΠ΄
xt_bpf
Π‘Π΅Π³Π° Π΄Π° ΡΠ΅ Π²ΡΠ°ΡΠΈΠΌΠ΅ Π²ΠΎ ΡΠ²Π΅ΡΠΎΡ Π½Π° ΠΌΡΠ΅ΠΆΠΈΡΠ΅.
ΠΠΎΠ·Π°Π΄ΠΈΠ½Π°: ΠΌΠ½ΠΎΠ³Ρ ΠΎΠ΄Π°ΠΌΠ½Π°, Π²ΠΎ 2007 Π³ΠΎΠ΄ΠΈΠ½Π°, ΡΠ°Π΄ΡΠΎΡΠΎ Π±Π΅ΡΠ΅ xt_u32
Π·Π° Π½Π΅ΡΡΠΈΠ»ΡΠ΅Ρ. ΠΠ°ΠΏΠΈΡΠ°Π½ Π΅ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ° ΡΠΎ ΡΡΡΠ΅ ΠΏΠΎΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Π΅Π½ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ cls_u32
ΠΈ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° iptables ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: Π²ΡΠΈΡΠ°ΡΡΠ΅ 32 Π±ΠΈΡΠ° ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΠΈ ΠΈΠ·Π²Π΅Π΄Π΅ΡΠ΅ Π·Π±ΠΈΡ Π½Π° Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° Π½ΠΈΠ². ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ,
sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"
ΠΠΈ Π²ΡΠΈΡΡΠ²Π° 32-ΡΠ΅ Π±ΠΈΡΠ° ΠΎΠ΄ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ΡΠΎ Π½Π° IP, ΠΏΠΎΡΠ½ΡΠ²Π°ΡΡΠΈ ΠΎΠ΄ ΠΏΠΎΠΏΠΎΠ»Π½ΡΠ²Π°ΡΠ΅ΡΠΎ 6, ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ²Π° ΠΌΠ°ΡΠΊΠ° Π½Π° Π½ΠΈΠ² 0xFF
(Π·Π΅ΠΌΠ΅ΡΠ΅ Π³ΠΎ Π½ΠΈΡΠΊΠΈΠΎΡ Π±Π°ΡΡ). ΠΠ²Π° ΠΏΠΎΠ»Π΅ protocol
ΠΠ°Π³Π»Π°Π²ΠΈΠ΅ Π½Π° IP ΠΈ Π³ΠΎ ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠΎ 1 (ICMP). ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎ Π΅Π΄Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΡ @
β ΠΏΠΎΠΌΠ΅ΡΡΠ΅ΡΠ΅ X Π±Π°ΡΡΠΈ Π½Π°Π΄Π΅ΡΠ½ΠΎ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ
iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"
ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π΄Π°Π»ΠΈ ΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠΊΠΈΠΎΡ Π±ΡΠΎΡ Π½Π° TCP Π½Π΅ Π΅ Π΅Π΄Π½Π°ΠΊΠΎΠ² 0x29
. ΠΠ΅ΠΌΠ° Π΄Π° Π½Π°Π²Π»Π΅Π³ΡΠ²Π°ΠΌ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ Π²ΠΎ Π΄Π΅ΡΠ°Π»ΠΈ, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π²Π΅ΡΠ΅ Π΅ ΡΠ°ΡΠ½ΠΎ Π΄Π΅ΠΊΠ° ΡΠ°ΡΠ½ΠΎ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠ°ΠΊΠ²ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ. ΠΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° xt_u32
. ΠΠΈΠ΄Π΅ΡΠ΅ Π³ΠΈ ΠΈ Π²ΡΡΠΊΠΈΡΠ΅ Π½Π° ΠΊΡΠ°ΡΠΎΡ ΠΎΠ΄ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°.
ΠΠ΄ 2013 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΌΠΎΠ΄ΡΠ» Π½Π°ΠΌΠ΅ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ» xt_u32
ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ» Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° BPF xt_bpf
. Π‘Π΅ΠΊΠΎΡ ΡΡΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π» Π΄ΠΎΡΠ΅Π³Π° ΡΡΠ΅Π±Π° Π²Π΅ΡΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΡΠ°ΡΠ΅Π½ Π·Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΡ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°ΡΠ΅: ΡΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ Π³ΠΎ BPF bytecode ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° 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 Π½Π°ΠΏΠ°Π΄ΠΈ. ΠΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° 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. ΠΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ°
$ ./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, Π²ΠΎ 32-ΡΠΈΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΡΠ°Π½Π·ΠΈΡΠΈΡΠ° ΠΎΠ΄ 64-Π±ΠΈΡΠ½ΠΈ Π½Π° XNUMX-Π±ΠΈΡΠ½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΠΎΡ BPF ΠΏΠΎΡΠ½Π° Π΄Π° Π·Π°ΡΡΠ°ΡΡΠ²Π°. ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΠΎΡ BPF ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ, Π° ΠΏΠΎΠΊΡΠ°Ρ Π·Π°ΡΡΠ°ΡΠ΅Π½Π°ΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° - Π½Π΅ΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ° Π·Π°ΡΡΠ²Π°ΠΌΠ΅ ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΠΏΠΎΠ²ΠΈΡΠΈΡΠ΅ ΠΊΠΎΠ½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ BPF, Π½Π΅ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ, Π½Π΅ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ, ΠΎΡΠ²Π΅Π½ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠΎΡ ΠΏΠΎΠ»ΠΈΡΠ° Π·Π° ΡΡΡΡΠΊΡΡΡΠ° sk_buff
ΠΈ ΡΠΎ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠΌΠΎΡ, Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡΠ΅Π½Π°ΡΠΎΡΡΠ²Π°ΡΠ΅.
ΠΡΡΡΠ½ΠΎΡΡ, ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΓ¨ ΡΡΠΎ ΠΎΡΡΠ°Π½ΡΠ²Π° ΠΎΠ΄ ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΠΎΡ BPF Π²ΠΎ Linux Π΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ API, Π° Π²Π½Π°ΡΡΠ΅ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΡΠΈΡΠ΅ ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π±ΠΈΠ»ΠΎ Π΄Π° ΡΠ΅ ΡΠΎΠ° ΡΠΈΠ»ΡΡΠΈ Π·Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ ΠΈΠ»ΠΈ ΡΠΈΠ»ΡΡΠΈ Π·Π° seccomp, Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΠΏΡΠ΅Π²Π΅Π΄ΡΠ²Π°Π°Ρ Π²ΠΎ Π½ΠΎΠ² ΡΠΎΡΠΌΠ°Ρ, Extended BPF. (ΠΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΠΎΠ²Π° Π²ΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ°.)
Π’ΡΠ°Π½Π·ΠΈΡΠΈΡΠ°ΡΠ° ΠΊΠΎΠ½ Π½ΠΎΠ²Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π°ΠΏΠΎΡΠ½Π° Π²ΠΎ 2013 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠΎΠ³Π° ΠΠ»Π΅ΠΊΡΠ΅Ρ Π‘ΡΠ°ΡΠΎΠ²ΠΎΠΈΡΠΎΠ² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ ΡΠ΅ΠΌΠ° Π·Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π½Π° BPF. ΠΠΎ 2014 Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΡΠ΅ Π·Π°ΠΊΡΠΏΠΈ
ΠΠΎΠ½Π°ΡΠ°ΠΌΠΎΡΠ½ΠΈΡΠ΅ Π½Π°ΠΏΠΈΡΠΈ Π²ΠΎ ΠΎΠ²Π°Π° ΡΠ΅ΡΠΈΡΠ° ΡΠ΅ ΡΠ° ΠΎΠΏΡΠ°ΡΠ°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ Π½Π° Π½ΠΎΠ²Π°ΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°, ΠΏΡΠ²ΠΈΡΠ½ΠΎ ΠΏΠΎΠ·Π½Π°ΡΠ° ΠΊΠ°ΠΊΠΎ Π²Π½Π°ΡΡΠ΅ΡΠ΅Π½ BPF, ΠΏΠΎΡΠΎΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ BPF, Π° ΡΠ΅Π³Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ BPF.
ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈ
- Π‘ΡΠΈΠ²Π΅Π½ ΠΠ΅ΠΊΠΠ΅Π½ ΠΈ ΠΠ°Π½ ΠΠ΅ΡΠΊΠΎΠ±ΡΠΎΠ½, βΠ€ΠΈΠ»ΡΠ΅ΡΠΎΡ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ BSD: Π½ΠΎΠ²Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π° ΡΠ°ΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊβ,
https://www.tcpdump.org/papers/bpf-usenix93.pdf
- Π‘ΡΠΈΠ²Π΅Π½ ΠΠ΅ΠΊΠΠ΅Π½, βlibpcap: ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡΠ° Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ° Π·Π° ΡΠ½ΠΈΠΌΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈβ,
https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
tcpdump
,libpcap
:https://www.tcpdump.org/ Π£ΠΏΠ°ΡΡΡΠ²ΠΎ Π·Π° Π½Π°ΡΠΏΡΠ΅Π²Π°Ρ Π·Π° IPtable U32 .- BPF - Π·Π°Π±ΠΎΡΠ°Π²Π΅Π½ΠΈΠΎΡ Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄:
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
- ΠΡΠΎΡ ΠΏΡΠ΅Π³Π»Π΅Π΄:
https://lwn.net/Articles/656307/
https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
habr: ΠΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ: seccomp habr: ΠΠ·ΠΎΠ»ΠΈΡΠ°ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΠΈ ΡΠΎ systemd ΠΈΠ»ΠΈ βΠ½Π΅ ΡΠΈ ΡΡΠ΅Π±Π° Docker Π·Π° ΠΎΠ²Π°!β - ΠΠΎΠ» Π¨Π°ΡΡΠΎΠ½, βΡΡΠ°ΡΡ --ΡΠ΅ΡΠΎΠΌΠΏ-Π±ΠΏΡ: ΠΏΠΎΠ³Π»Π΅Π΄ ΠΏΠΎΠ΄ Ρ
Π°ΡΠ±Π°ΡΠ°β,
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
netsniff-ng
:http://netsniff-ng.org/
ΠΠ·Π²ΠΎΡ: www.habr.com