BPF Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΈΡ‚Π΅, Π΄Π΅Π» Π½ΡƒΠ»Π°: класичСн BPF

Π‘Π΅Ρ€ΠΊΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ (BPF) Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Линукс која Π΅ Π½Π° насловнитС страници Π½Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΡˆΠΊΠΈΡ‚Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° англиски јазик вСќС Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠšΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈΡ‚Π΅ сС ΠΏΠΎΠ»Π½ΠΈ со ΠΈΠ·Π²Π΅ΡˆΡ‚Π°ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° ΠΈ Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° BPF. Π”Π΅Ρ˜Π²ΠΈΠ΄ ΠœΠΈΠ»Π΅Ρ€, ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°Ρ‡ Π½Π° ΠΌΡ€Π΅ΠΆΠ΅Π½ потсистСм Линукс, Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° ΡΠ²ΠΎΡ˜ΠΎΡ‚ Π³ΠΎΠ²ΠΎΡ€ Π½Π° Linux Plumbers 2018 β€žΠžΠ²ΠΎΡ˜ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ Π½Π΅ Π΅ Π·Π° XDPβ€œ (XDP Π΅ Π΅Π΄Π΅Π½ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π·Π° BPF). Π‘Ρ€Π΅Π½Π΄Π°Π½ Π“Ρ€Π΅Π³ Π΄Π°Π²Π° Π³ΠΎΠ²ΠΎΡ€ΠΈ со наслов Линукс BPF супСрсили. Π’ΠΎΠΊΠ΅ Π₯ојланд-ΠˆΠΎΡ€Π³Π΅Π½ΡΠ΅Π½ сС смССдСка Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ сСга Π΅ ΠΌΠΈΠΊΡ€ΠΎΠΊΠ΅Ρ€Π½Π΅Π». Вомас Π“Ρ€Π°Ρ„ ја ΠΏΡ€ΠΎΠΌΠΎΠ²ΠΈΡ€Π° ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π΄Π΅ΠΊΠ° BPF Π΅ javascript Π·Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚.

Π‘Γ¨ ΡƒΡˆΡ‚Π΅ Π½Π΅ΠΌΠ° систСматски опис Π½Π° BPF Π½Π° HabrΓ©, ΠΈ Π·Π°Ρ‚ΠΎΠ° Π²ΠΎ ΡΠ΅Ρ€ΠΈΡ˜Π° написи ќС сС ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π°Ρ‚Π°, Π΄Π° ја опишам Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ΠΈ Π°Π»Π°Ρ‚ΠΊΠΈΡ‚Π΅ Π·Π° Ρ€Π°Π·Π²ΠΎΡ˜ ΠΈ Π΄Π° Π³ΠΈ Π½Π°Π²Π΅Π΄Π°ΠΌ областитС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° BPF. Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, Π½ΡƒΠ»Π°, Π²ΠΎ ΡΠ΅Ρ€ΠΈΡ˜Π°Ρ‚Π°, ја раскаТува ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° класичниот BPF, Π° исто Ρ‚Π°ΠΊΠ° Π³ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π° Ρ‚Π°Ρ˜Π½ΠΈΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°. tcpdump, seccomp, strace, ΠΈ ΡƒΡˆΡ‚Π΅ повСќС.

Π Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° BPF Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Π½ ΠΎΠ΄ ΠΌΡ€Π΅ΠΆΠ½Π° Π·Π°Π΅Π΄Π½ΠΈΡ†Π° Π½Π° Linux, Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ постоСчки Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° BPF сС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со ΠΌΡ€Π΅ΠΆΠΈ ΠΈ Π·Π°Ρ‚ΠΎΠ°, со Π΄ΠΎΠ·Π²ΠΎΠ»Π° @eucariot, ја Π½Π°Ρ€Π΅ΠΊΠΎΠ² ΡΠ΅Ρ€ΠΈΡ˜Π°Ρ‚Π° β€žΠ‘ΠŸΠ€ Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΈΡ‚Π΅β€œ, Π²ΠΎ чСст Π½Π° ΠΎΠ΄Π»ΠΈΡ‡Π½Π°Ρ‚Π° ΡΠ΅Ρ€ΠΈΡ˜Π° β€žΠœΡ€Π΅ΠΆΠΈ Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΈΡ‚Π΅β€œ.

ΠšΡ€Π°Ρ‚ΠΎΠΊ курс Π²ΠΎ ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° 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 - Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΎΡ‚ коњ Π½Π° Ρ‚Π°ΠΊΠ²ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС Apple II ΠΈΠ»ΠΈ НБВ. Новата Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина Π³ΠΈ Π·Π³ΠΎΠ»Π΅ΠΌΠΈ пСрформанситС Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ дСсСтици ΠΏΠ°Ρ‚ΠΈ Π²ΠΎ спорСдба со постоСчкитС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ˜Π°.

АрхитСктура Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° BPF

Π‘ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ќС сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅Π½ Π½Π°Ρ‡ΠΈΠ½, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ˜ΡœΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ. Π‘Π΅ΠΏΠ°ΠΊ, Π·Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ, Π΄Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° имашС Π΄Π²Π° 32-Π±ΠΈΡ‚Π½ΠΈ рСгистри достапни Π·Π° корисникот, Π°ΠΊΡƒΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€ A ΠΈ индСксСн рСгистар X, 64 Π±Π°Ρ˜Ρ‚ΠΈ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° (16 Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ), достапни Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΈ послСдоватСлно Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ ΠΌΠ°Π» систСм Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со ΠΎΠ²ΠΈΠ΅ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° ΠΏΡ€Π΅ΡΠΊΠΎΠΊΠ½ΡƒΠ²Π°ΡšΠ΅ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° условни ΠΈΠ·Ρ€Π°Π·ΠΈ Π±Π΅Π° исто Ρ‚Π°ΠΊΠ° достапни Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅, Π½ΠΎ Π·Π° Π΄Π° сС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π° Π½Π°Π²Ρ€Π΅ΠΌΠ΅Π½ΠΎ Π·Π°Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, скоковитС ΠΌΠΎΠΆΠ΅Π° Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²Π°Ρ‚ само Π½Π°ΠΏΡ€Π΅Π΄, односно, особСно, бСшС Π·Π°Π±Ρ€Π°Π½Π΅Ρ‚ΠΎ Π΄Π° сС создаваат јамки.

ΠžΠΏΡˆΡ‚Π°Ρ‚Π° шСма Π·Π° ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува. ΠšΠΎΡ€ΠΈΡΠ½ΠΈΠΊΠΎΡ‚ создава ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° BPF ΠΈ, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π½Π΅ΠΊΠΎΠΈ ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΡ‚ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ (ΠΊΠ°ΠΊΠΎ систСмски ΠΏΠΎΠ²ΠΈΠΊ), ја Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π° ΠΈ ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° со Π½Π° Π½Π΅ΠΊΠΎΠΈ Π΄ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° настани Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, настан Π΅ ΠΏΡ€ΠΈΡΡ‚ΠΈΠ³Π½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° слСдниот ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π° ΠΌΡ€Π΅ΠΆΠ½Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ°). Кога ќС сС случи настан, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ја ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡), Π° ΠΌΠ°ΡˆΠΈΠ½ΡΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π° Π½Π° Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠœΠ΅ΠΌΠΎΡ€ΠΈΡΠΊΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° дојдовСн ΠΏΠ°ΠΊΠ΅Ρ‚).

Π“ΠΎΡ€Π΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡ‚ΠΎ ќС Π½ΠΈ Π±ΠΈΠ΄Π΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π·Π° Π΄Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ Π΄Π° Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ: ќС сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌΠ΅ со систСмот ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΡ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π°. Ако сакатС вСднаш Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΠΎΡ‚ систСм Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° машина ΠΈ Π΄Π° Π΄ΠΎΠ·Π½Π°Π΅Ρ‚Π΅ Π·Π° ситС Π½Π΅Π³ΠΎΠ²ΠΈ способности, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π€ΠΈΠ»Ρ‚Π΅Ρ€ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ BSD ΠΈ/ΠΈΠ»ΠΈ ΠΏΡ€Π²Π°Ρ‚Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΎΠ΄ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°/Π²ΠΌΡ€Π΅ΠΆΡƒΠ²Π°ΡšΠ΅/Ρ„ΠΈΠ»Ρ‚Π΅Ρ€.txt ΠΎΠ΄ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја ΠΏΡ€ΠΎΡƒΡ‡ΡƒΠ²Π°Ρ‚Π΅ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° libpcap: АрхитСктура ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π·Π° Ρ„Π°ΡœΠ°ΡšΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, Π²ΠΎ која McCanne, Π΅Π΄Π΅Π½ ΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° BPF, Π·Π±ΠΎΡ€ΡƒΠ²Π° Π·Π° ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ 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 ΠΈ испратСтС Π³ΠΎ Π΄ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ (Π²ΠΈΠ΄Π΅Ρ‚Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ Π²ΠΎ Π΄Π΅Π»ΠΎΡ‚ Tcpdump: сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°). Π’Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΎΡ‚ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ ќС сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° Π·Π° сСкој ΠΏΠ°ΠΊΠ΅Ρ‚ ΡˆΡ‚ΠΎ ΠΌΠΈΠ½ΡƒΠ²Π° Π½ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ eth0. Ако Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π²Ρ€Π°Ρ‚ΠΈ врСдност ΡˆΡ‚ΠΎ Π½Π΅ Π΅ Π½ΡƒΠ»Π° n, ΠΏΠΎΡ‚ΠΎΠ° Π΄ΠΎ n Π±Π°Ρ˜Ρ‚ΠΈ ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΊΠΎΠΏΠΈΡ€Π°Π½ΠΈ Π²ΠΎ корисничкиот простор ΠΈ ќС Π³ΠΎ Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ tcpdump.

BPF Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΈΡ‚Π΅, Π΄Π΅Π» Π½ΡƒΠ»Π°: класичСн BPF

Π˜Π·Π»Π΅Π³ΡƒΠ²Π° Π΄Π΅ΠΊΠ° лСсно ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ кој Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ Π΅ испратСн Π΄ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ tcpdump со помош Π½Π° tcpdump, Π°ΠΊΠΎ Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ со ΠΎΠΏΡ†ΠΈΡ˜Π°Ρ‚Π° -d:

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

На Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° Π½ΡƒΠ»Π° ја ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ldh [12], ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ β€žΠ²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ рСгистарот A ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π·Π±ΠΎΡ€ (16 Π±ΠΈΡ‚Π°) Π»ΠΎΡ†ΠΈΡ€Π°Π½ Π½Π° адрСса 12β€œ ΠΈ СдинствСното ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅ Π΅ Π½Π° ΠΊΠ°ΠΊΠ²Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° сС ΠΎΠ±Ρ€Π°ΡœΠ°ΠΌΠ΅? ΠžΠ΄Π³ΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π΅ Π΄Π΅ΠΊΠ° Π²ΠΎ x Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° (x+1)Ρ‚ΠΈ Π±Π°Ρ˜Ρ‚ ΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ ΠΌΡ€Π΅ΠΆΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ‚. Π§ΠΈΡ‚Π°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΠ΄ Π΅Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ eth0, ΠΈ ΠΎΠ²Π° Π·Π½Π°Ρ‡ΠΈΠ΄Π΅ΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ° (Π·Π° Сдноставност, прСтпоставувамС Π΄Π΅ΠΊΠ° Π½Π΅ΠΌΠ° VLAN ΠΎΠ·Π½Π°ΠΊΠΈ Π²ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚):

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

Π—Π½Π°Ρ‡ΠΈ ΠΏΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ldh [12] Π²ΠΎ рСгистарот A ќС ΠΈΠΌΠ° Π½ΠΈΠ²Π° Ether Type β€” Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ сС прСнСсува Π²ΠΎ ΠΎΠ²Π°Π° Π΅Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Ρ€Π°ΠΌΠΊΠ°. На линија 1 ја спорСдувамС содрТината Π½Π° рСгистарот A (Ρ‚ΠΈΠΏ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚) Π² 0x86dd, ΠΈ ΠΎΠ²Π° ΠΈ ΠΈΠΌΠ°Π°Ρ‚ Π’ΠΈΠΏΠΎΡ‚ Π·Π° кој Π½Π΅ интСрСсира Π΅ IPv6. На линија 1, ΠΏΠΎΠΊΡ€Π°Ρ˜ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° спорСдба, ΠΈΠΌΠ° ΡƒΡˆΡ‚Π΅ Π΄Π²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ - jt 2 ΠΈ jf 3 β€” ΠΎΠ·Π½Π°ΠΊΠΈ Π΄ΠΎ ΠΊΠΎΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π°ΠΊΠΎ спорСдбата Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½Π° (A == 0x86dd) ΠΈ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ. Π—Π½Π°Ρ‡ΠΈ, Π²ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ ΡΠ»ΡƒΡ‡Π°Ρ˜ (IPv6) ΠΎΠ΄ΠΈΠΌΠ΅ Π½Π° линија 2, Π° Π²ΠΎ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ ΡΠ»ΡƒΡ‡Π°Ρ˜ - Π½Π° линија 3. На Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° 3 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π·Π°Π²Ρ€ΡˆΡƒΠ²Π° со ΠΊΠΎΠ΄ΠΎΡ‚ 0 (Π½Π΅ Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°Ρ˜ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚), Π½Π° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° 2 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π·Π°Π²Ρ€ΡˆΡƒΠ²Π° со ΠΊΠΎΠ΄ΠΎΡ‚ 262144 (ΠΊΠΎΠΏΠΈΡ€Π°Ρ˜ ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΠ΄ максимум 256 ΠΊΠΈΠ»ΠΎΠ±Π°Ρ˜Ρ‚ΠΈ).

ΠŸΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ TCP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎ Π΄Π΅ΡΡ‚ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° ΠΏΠΎΡ€Ρ‚Π°

АјдС Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ΡˆΡ‚ΠΎ Π³ΠΈ ΠΊΠΎΠΏΠΈΡ€Π° ситС TCP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ со ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΠΏΠΎΡ€Ρ‚Π° 666. ЌС Π³ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»ΡƒΡ‡Π°Ρ˜ΠΎΡ‚ IPv4, бидСјќи ΡΠ»ΡƒΡ‡Π°Ρ˜ΠΎΡ‚ IPv6 Π΅ поСдноставСн. ΠžΡ‚ΠΊΠ°ΠΊΠΎ ќС Π³ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΡ‚Π΅ овој ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ сами Π΄Π° Π³ΠΎ истраТитС Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ IPv6 ΠΊΠ°ΠΊΠΎ Π²Π΅ΠΆΠ±Π° (ip6 and tcp dst port 666) ΠΈ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ Π·Π° ΠΎΠΏΡˆΡ‚ΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜ (tcp dst port 666). Π—Π½Π°Ρ‡ΠΈ, Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π·Π° кој смС заинтСрСсирани ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

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

Π’Π΅ΡœΠ΅ Π·Π½Π°Π΅ΠΌΠ΅ ΡˆΡ‚ΠΎ ΠΏΡ€Π°Π²Π°Ρ‚ Π»ΠΈΠ½ΠΈΠΈΡ‚Π΅ 0 ΠΈ 1. На Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° 2 вСќС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ²ΠΌΠ΅ Π΄Π°Π»ΠΈ ΠΎΠ²Π° Π΅ IPv4 ΠΏΠ°ΠΊΠ΅Ρ‚ (Π’ΠΈΠΏ Π½Π° Π΅Ρ‚Π΅Ρ€ = 0x800) ΠΈ Π²Ρ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ Π³ΠΎ Π²ΠΎ рСгистарот A 24-Ρ‚ΠΈ Π±Π°Ρ˜Ρ‚ ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚. ΠΠ°ΡˆΠΈΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ

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

ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ рСгистарот A ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Protocol Π½Π° IP Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ, ΡˆΡ‚ΠΎ Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, бидСјќи сакамС Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ само TCP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. НиС Π³ΠΎ спорСдувамС ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΡ‚ со 0x6 (IPPROTO_TCP) Π½Π° линија 3.

На Π»ΠΈΠ½ΠΈΠΈΡ‚Π΅ 4 ΠΈ 5 Π³ΠΈ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΡƒΠ·Π±ΠΎΡ€ΠΎΠ²ΠΈΡ‚Π΅ Π»ΠΎΡ†ΠΈΡ€Π°Π½ΠΈ Π½Π° адрСсата 20 ΠΈ ја користимС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° jset ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ Π΅ поставСно Π΅Π΄Π½ΠΎ ΠΎΠ΄ Ρ‚Ρ€ΠΈΡ‚Π΅ знамиња - ΠΈΠ·Π΄Π°Π΄Π΅Π½Π° носСњС маска jset сС Π±Ρ€ΠΈΡˆΠ°Ρ‚ Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π°Ρ˜Π·Π½Π°Ρ‡Π°Ρ˜Π½ΠΈ Π±ΠΈΡ‚Π°. Π”Π²Π° ΠΎΠ΄ Ρ‚Ρ€ΠΈΡ‚Π΅ Π±ΠΈΡ‚Π° Π½ΠΈ ΠΊΠ°ΠΆΡƒΠ²Π°Π°Ρ‚ Π΄Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ Π΅ Π΄Π΅Π» ΠΎΠ΄ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ IP ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΈ Π°ΠΊΠΎ Π΅ Ρ‚Π°ΠΊΠ°, Π΄Π°Π»ΠΈ Π΅ послСдниот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚. Π’Ρ€Π΅Ρ‚ΠΈΠΎΡ‚ Π±ΠΈΡ‚ Π΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€Π°Π½ ΠΈ ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π½ΡƒΠ»Π°. НС сакамС Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ Π½ΠΈΡ‚Ρƒ нСцСлосни ΠΈΠ»ΠΈ ΡΠΊΡ€ΡˆΠ΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΏΠ° Π·Π°Ρ‚ΠΎΠ° Π³ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ ситС Ρ‚Ρ€ΠΈ Π±ΠΈΡ‚Π°.

Π›ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° 6 Π΅ Π½Π°Ρ˜ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½Π° Π²ΠΎ ΠΎΠ²Π°Π° листа. Π˜Π·Ρ€Π°Π·ΡƒΠ²Π°ΡšΠ΅ ldxb 4*([14]&0xf) Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ рСгистарот X Π½Π°Ρ˜ΠΌΠ°Π»ΠΊΡƒ Π·Π½Π°Ρ‡Π°Ρ˜Π½ΠΈΡ‚Π΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π±ΠΈΡ‚Π° ΠΎΠ΄ пСтнаСсСттиот Π±Π°Ρ˜Ρ‚ ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ ΠΏΠΎΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈ со 4. ΠΠ°Ρ˜ΠΌΠ°Π»ΠΊΡƒ Π·Π½Π°Ρ‡Π°Ρ˜Π½ΠΈΡ‚Π΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π±ΠΈΡ‚Π° ΠΎΠ΄ пСтнаСсСттиот Π±Π°Ρ˜Ρ‚ Π΅ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π”ΠΎΠ»ΠΆΠΈΠ½Π° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π—Π°Π³Π»Π°Π²ΠΈΠ΅ IPv4, ΠΊΠΎΠ΅ ја складира Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ со Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, ΠΏΠ° ΠΏΠΎΡ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΏΠΎΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅ со 4. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, ΠΈΠ·Ρ€Π°Π·ΠΎΡ‚ 4*([14]&0xf) Π΅ ΠΎΠ·Π½Π°ΠΊΠ° Π·Π° ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»Π½Π° адрСсна шСма која ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи само Π²ΠΎ ΠΎΠ²Π°Π° Ρ„ΠΎΡ€ΠΌΠ° ΠΈ само Π·Π° рСгистар X, Ρ‚.Π΅. Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π½ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ldb 4*([14]&0xf) Π½ΠΈΡ‚Ρƒ ΠΏΠ°ΠΊ ldxb 5*([14]&0xf) (ΠΌΠΎΠΆΠ΅ΠΌΠ΅ само Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ldxb 4*([16]&0xf)). Јасно Π΅ Π΄Π΅ΠΊΠ° ΠΎΠ²Π°Π° шСма Π·Π° Π°Π΄Ρ€Π΅ΡΠΈΡ€Π°ΡšΠ΅ Π΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° Π½Π° BPF Ρ‚ΠΎΠΊΠΌΡƒ со Ρ†Π΅Π» Π΄Π° сС Π΄ΠΎΠ±ΠΈΠ΅ X (индСксСн рСгистар) Π”ΠΎΠ»ΠΆΠΈΠ½Π° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ IPv4.

Π’Π°ΠΊΠ°, Π½Π° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° 7 сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°ΠΌΠ΅ Π΄Π° Π²Ρ‡ΠΈΡ‚Π°ΠΌΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π·Π±ΠΎΡ€ Π½Π° (X+16). Π—Π°ΠΏΠΎΠΌΠ½ΡƒΠ²Π°Ρ˜ΡœΠΈ Π΄Π΅ΠΊΠ° 14 Π±Π°Ρ˜Ρ‚ΠΈ сС ΠΎΠΊΡƒΠΏΠΈΡ€Π°Π½ΠΈ ΠΎΠ΄ Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π•Ρ‚Π΅Ρ€Π½Π΅Ρ‚, ΠΈ X ја содрТи Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ IPv4, Π½ΠΈΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π²ΠΎ A ΠžΠ΄Ρ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΠΏΠΎΡ€Ρ‚Π° TCP Π΅ Π²Ρ‡ΠΈΡ‚Π°Π½Π°:

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

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° 8 ја спорСдувамС дСстинациската ΠΏΠΎΡ€Ρ‚Π° со саканата врСдност ΠΈ Π½Π° Π»ΠΈΠ½ΠΈΠΈΡ‚Π΅ 9 ΠΈΠ»ΠΈ 10 Π³ΠΎ Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ - Π΄Π°Π»ΠΈ Π΄Π° сС ΠΊΠΎΠΏΠΈΡ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ Π½Π΅.

Tcpdump: сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°

Π’ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π½Π΅ Π·Π±ΠΎΡ€ΡƒΠ²Π°Π²ΠΌΠ΅ Π΄Π΅Ρ‚Π°Π»Π½ΠΎ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π³ΠΎ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ BPF Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ΠΎΡ‚ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π·Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. ΠžΠΏΡˆΡ‚ΠΎ Π·Π΅ΠΌΠ΅Π½ΠΎ, tcpdump прСнСсСн Π½Π° ΠΌΠ½ΠΎΠ³Ρƒ систСми ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ tcpdump ја користи Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° libpcap. Накратко, Π΄Π° поставитС Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ libpcap, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ слСдново:

  • ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ дСскриптор Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ pcap_t ΠΎΠ΄ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚: pcap_create,
  • Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ˜ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ: pcap_activate,
  • ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€: pcap_compile,
  • Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅: pcap_setfilter.

Π—Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° pcap_setfilter ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Π²ΠΎ Linux, Π½ΠΈΠ΅ користимС strace (Π½Π΅ΠΊΠΎΠΈ Π»ΠΈΠ½ΠΈΠΈ сС отстранСти):

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

На ΠΏΡ€Π²ΠΈΡ‚Π΅ Π΄Π²Π΅ Π»ΠΈΠ½ΠΈΠΈ Π½Π° ΠΈΠ·Π»Π΅Π· ΡˆΡ‚ΠΎ Π³ΠΈ создавамС суров ΡˆΡ‚Π΅ΠΊΠ΅Ρ€ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ ситС Ethernet Ρ€Π°ΠΌΠΊΠΈ ΠΈ Π΄Π° Π³ΠΎ ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ со ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ 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.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Π΅ ΡˆΡ‚ΠΎ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΈΠΊΠ°Ρ‡ΠΈ Π½Π° кој Π±ΠΈΠ»ΠΎ ΡˆΡ‚Π΅ΠΊΠ΅Ρ€, Π° Π½Π΅ само суров. Π•Π²Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° која Π³ΠΈ отсСкува ситС освСн ΠΏΡ€Π²ΠΈΡ‚Π΅ Π΄Π²Π° Π±Π°Ρ˜Ρ‚Π° ΠΎΠ΄ ситС дојдовни UDP Π΄Π°Ρ‚Π°Π³Ρ€Π°ΠΌΠΈ. (Π”ΠΎΠ΄Π°Π΄ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π΄Π° Π½Π΅ ја Π½Π°Ρ‚Ρ€ΡƒΠΏΡƒΠ²Π°ΠΌ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π°.)

ПовСќС Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° setsockopt Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, Π²ΠΈΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ (7), Π½ΠΎ Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ сопствСни Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ ΠΊΠ°ΠΊΠΎ struct sock_fprog Π±Π΅Π· помош tcpdump ќС Ρ€Π°Π·Π³ΠΎΠ²Π°Ρ€Π°ΠΌΠ΅ Π²ΠΎ Π΄Π΅Π»ΠΎΡ‚ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅ Π½Π° BPF со свои Ρ€Π°Ρ†Π΅.

ΠšΠ»Π°ΡΠΈΡ‡Π΅Π½ BPF ΠΈ 21 Π²Π΅ΠΊ

BPF бСшС Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ Π²ΠΎ Линукс Π²ΠΎ 1997 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ остана Ρ€Π°Π±ΠΎΡ‚Π½Π° сила Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ libpcap Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ посСбни ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ (ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ спСцифични Π·Π° Линукс, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, Π±Π΅Π°, Π½ΠΎ Ρ‚ΠΈΠ΅ Π½Π΅ ја ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ˜Π° Π³Π»ΠΎΠ±Π°Π»Π½Π°Ρ‚Π° слика). ΠŸΡ€Π²ΠΈΡ‚Π΅ сСриозни Π·Π½Π°Ρ†ΠΈ Π΄Π΅ΠΊΠ° BPF ќС Π΅Π²ΠΎΠ»ΡƒΠΈΡ€Π° сС појавија Π²ΠΎ 2011 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠΎΠ³Π° Π•Ρ€ΠΈΠΊ Π”ΡƒΠΌΠ°Π·Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ Π»Π΅ΠΏΠ΅Π½ΠΊΠ°, кој Π΄ΠΎΠ΄Π°Π²Π° Just In Time Compiler Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ - ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡ Π·Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° BPF Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ Π²ΠΎ ΠΌΠ°Ρ˜Ρ‡ΠΈΠ½ x86_64 ΠΊΠΎΠ΄.

JIT ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ бСшС ΠΏΡ€Π²ΠΈΠΎΡ‚ Π²ΠΎ ΡΠΈΠ½ΡŸΠΈΡ€ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ: Π²ΠΎ 2012 Π³ΠΎΠ΄ΠΈΠ½Π° сС појави способност Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π·Π° сСккомп, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ BPF, Π²ΠΎ Ρ˜Π°Π½ΡƒΠ°Ρ€ΠΈ 2013 Π³ΠΎΠ΄ΠΈΠ½Π° имашС Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΌΠΎΠ΄ΡƒΠ» 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;
}

Π’Π°ΠΊΠ°, вСќС ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³ΠΈ Π·Π½Π°Π΅ΠΌΠ΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡ‚Π΅ Π·Π° инструкции ΠΎΠ΄ [1]). Π’Π°ΠΊΠ° ќС ΠΈΠ·Π³Π»Π΅Π΄Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ip6 Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct sock_filter code[] = {
        { 0x28, 0, 0, 0x0000000c },
        { 0x15, 0, 1, 0x000086dd },
        { 0x06, 0, 0, 0x00040000 },
        { 0x06, 0, 0, 0x00000000 },
};
struct sock_fprog prog = {
        .len = ARRAY_SIZE(code),
        .filter = code,
};

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° prog законски ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° користимС Π²ΠΎ ΠΏΠΎΠ²ΠΈΠΊ

setsockopt(sk, SOL_SOCKET, SO_ATTACH_FILTER, &prog, sizeof(prog))

ΠŸΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° машински ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ, Π½ΠΎ понСкогаш Π΅ Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΎ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅, создавањС тСстови Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ, ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ написи Π½Π° Π₯Π°Π±Ρ€Π΅ ΠΈΡ‚Π½.). Π—Π° погодност, Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° <linux/filter.h> сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ помошни ΠΌΠ°ΠΊΡ€ΠΎΠ° - истиот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ³ΠΎΡ€Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°ΠΊΠΎ

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

Π‘Π΅ΠΏΠ°ΠΊ, ΠΎΠ²Π°Π° ΠΎΠΏΡ†ΠΈΡ˜Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠ³ΠΎΠ΄Π½Π°. Ова Π΅ ΠΎΠ½Π° ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Линукс Π³ΠΎ ΠΎΠ±Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ˜Π°, Π° со Ρ‚ΠΎΠ° ΠΈ Π²ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ tools/bpf ΠΊΠ΅Ρ€Π½Π΅Π»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ асСмблСр ΠΈ Π΄Π΅Π±Π°Π³Π΅Ρ€ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со класичСн BPF.

ΠˆΠ°Π·ΠΈΠΊΠΎΡ‚ Π½Π° собраниСто Π΅ ΠΌΠ½ΠΎΠ³Ρƒ сличСн Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ Π·Π° ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ Π³Ρ€Π΅ΡˆΠΊΠΈ tcpdump, Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ симболични ΠΎΠ·Π½Π°ΠΊΠΈ. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΡƒΠΊΠ° Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΡˆΡ‚ΠΎ Π³ΠΈ ΠΈΡΠΏΡƒΡˆΡ‚Π° ситС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ освСн TCP/IPv4:

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

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΎ, асСмблСрот Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΊΠΎΠ΄ Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ <количСство инструкций>,<code1> <jt1> <jf1> <k1>,..., Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ со TCP ќС Π±ΠΈΠ΄Π΅

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

Π—Π° погодност Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ C, ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΈΠ·Π»Π΅Π·Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

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

Овој тСкст ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠΎΠΏΠΈΡ€Π° Π²ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° структурата Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ struct sock_filter, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° овој Π΄Π΅Π».

Линукс ΠΈ 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 Π΄Π°Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° seccomp, ΠΈ Π²Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ 2007 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π²Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° ΡˆΡ‚ΠΎ користи BPF (Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π°Ρ‚ со ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° libseccomp), Π·Π±ΠΎΡ€ΡƒΠ²Π° Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° seccomp со Docker, Π° исто Ρ‚Π°ΠΊΠ° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΠΌΠ½ΠΎΠ³Ρƒ корисни врски. Π’ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π˜Π·ΠΎΠ»ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π΅ΠΌΠΎΠ½ΠΈ со systemd ΠΈΠ»ΠΈ β€žΠ½Π΅ Ρ‚ΠΈ Ρ‚Ρ€Π΅Π±Π° Docker Π·Π° ΠΎΠ²Π°!β€œ Π’ΠΎΠ° ΠΎΠΏΡ„Π°ΡœΠ°, особСно, ΠΊΠ°ΠΊΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ Ρ†Ρ€Π½ΠΈ листи ΠΈΠ»ΠΈ Π±Π΅Π»ΠΈ листи Π½Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π·Π° Π΄Π΅ΠΌΠΎΠ½ΠΈ ΠΊΠΎΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π½Π° систСмот.

Π‘Π»Π΅Π΄Π½ΠΎ ќС Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΈ Π²Ρ‡ΠΈΡ‚Π°ΠΌΠ΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π·Π° 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() ΠΊΠ΅Ρ€Π½Π΅Π»ΠΈ. (БмСшна Ρ€Π°Π±ΠΎΡ‚Π° Π΅ ΡˆΡ‚ΠΎ Π²ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ‚ commit ΡˆΡ‚ΠΎ ја Π΄ΠΎΠ΄Π°Π΄Π΅ функционалноста seccomp, Ρ‚ΠΈΠ΅ Π·Π°Π±ΠΎΡ€Π°Π²ΠΈΡ˜Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°Ρ‚ Π΄ΠΎΠ·Π²ΠΎΠ»Π° Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΎΠ²Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° mod (остаток ΠΎΠ΄ ΠΏΠΎΠ΄Π΅Π»Π±Π°) ΠΈ сСга Π΅ нСдостапСн Π·Π° seccomp BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅, ΠΎΠ΄ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ додавањС ќС сС ΡΠΊΡ€ΡˆΠΈ ABI.)

Π’ΠΎ основа, Π½ΠΈΠ΅ вСќС Π·Π½Π°Π΅ΠΌΠ΅ сè Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΈ Ρ‡ΠΈΡ‚Π°ΡšΠ΅ Π½Π° seccomp ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. ΠžΠ±ΠΈΡ‡Π½ΠΎ програмската Π»ΠΎΠ³ΠΈΠΊΠ° Π΅ распорСдСна ΠΊΠ°ΠΊΠΎ Π±Π΅Π»Π° ΠΈΠ»ΠΈ Ρ†Ρ€Π½Π° листа Π½Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°

ld [0]
jeq #304, bad
jeq #176, bad
jeq #239, bad
jeq #279, bad
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
bad: ret #0

ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Ρ†Ρ€Π½Π° листа ΠΎΠ΄ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π½ΡƒΠΌΠ΅Ρ€ΠΈΡ€Π°Π½ΠΈ 304, 176, 239, 279. Кои сС ΠΎΠ²ΠΈΠ΅ систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ? НС ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ со сигурност, бидСјќи Π½Π΅ Π·Π½Π°Π΅ΠΌΠ΅ Π·Π° која Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π΅ напишана ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π—Π°Ρ‚ΠΎΠ°, Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° seccomp ΠΏΠΎΠ½ΡƒΠ΄Π° ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π³ΠΈ ситС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ со ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° (Ρ‚Π΅ΠΊΠΎΠ²Π½Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π΅ ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π° Π²ΠΎ контСкст ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ»Π΅ arch структурата struct seccomp_data). Π‘ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ Π±ΠΈ ΠΈΠ·Π³Π»Π΅Π΄Π°Π» Π²Π°ΠΊΠ°:

ld [4]
jne #0xc000003e, bad_arch ; SCMP_ARCH_X86_64

Π° ΠΏΠΎΡ‚ΠΎΠ° Π½Π°ΡˆΠΈΡ‚Π΅ систСмски ΠΏΠΎΠ²ΠΈΠΊ Π±Ρ€ΠΎΠ΅Π²ΠΈ ќС Π΄ΠΎΠ±ΠΈΡ˜Π°Ρ‚ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ врСдности.

НиС ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΈ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π·Π° seccomp ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ libseccomp

ΠŸΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π²ΠΎ ΠΌΠ°Ρ˜Ρ‡ΠΈΠ½ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π²ΠΎ ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅ BPF Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ цСлосна ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π²Ρ€Π· Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚, Π½ΠΎ Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, понСкогаш Π΅ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ прСнослив ΠΈ/ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Π»ΠΈΠ² ΠΊΠΎΠ΄. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ќС Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π²ΠΎ ΠΎΠ²Π° libseccomp, кој ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° стандардСн ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Ρ†Ρ€Π½ΠΈ ΠΈΠ»ΠΈ Π±Π΅Π»ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ.

АјдС, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° напишСмС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° која Ρ€Π°Π±ΠΎΡ‚ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ€ Π½Π° корисникот, ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ ΠΈΠΌΠ° инсталирано Ρ†Ρ€Π½Π° листа Π½Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΎΠ΄ Π³ΠΎΡ€Π½Π°Ρ‚Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΅ поСдноставСна Π·Π° ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° читливост, ΠΌΠΎΠΆΠ΅ Π΄Π° сС најдС цСлосната Π²Π΅Ρ€Π·ΠΈΡ˜Π° Ρ‚ΡƒΠΊΠ°):

#include <seccomp.h>
#include <unistd.h>
#include <err.h>

static int sys_numbers[] = {
        __NR_mount,
        __NR_umount2,
       // ... Π΅Ρ‰Π΅ 40 систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ...
        __NR_vmsplice,
        __NR_perf_event_open,
};

int main(int argc, char **argv)
{
        scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);

        for (size_t i = 0; i < sizeof(sys_numbers)/sizeof(sys_numbers[0]); i++)
                seccomp_rule_add(ctx, SCMP_ACT_TRAP, sys_numbers[i], 0);

        seccomp_load(ctx);

        execvp(argv[1], &argv[1]);
        err(1, "execlp: %s", argv[1]);
}

ΠŸΡ€Π²ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Π½ΠΈΠ·Π° sys_numbers ΠΎΠ΄ 40+ Π±Ρ€ΠΎΠ΅Π²ΠΈ Π½Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ Π·Π° Π±Π»ΠΎΠΊΠΈΡ€Π°ΡšΠ΅. ΠŸΠΎΡ‚ΠΎΠ°, ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΎ контСкстот ctx ΠΈ ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ ѝ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΡˆΡ‚ΠΎ сакамС Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΠΌΠ΅ (SCMP_ACT_ALLOW) ситС систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ стандардно (полСсно Π΅ Π΄Π° сС Π³Ρ€Π°Π΄Π°Ρ‚ Ρ†Ρ€Π½ΠΈ листи). ΠŸΠΎΡ‚ΠΎΠ°, Π΅Π΄Π΅Π½ ΠΏΠΎ Π΅Π΄Π΅Π½, Π³ΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ситС систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΎΠ΄ Ρ†Ρ€Π½Π°Ρ‚Π° листа. Како ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ Π½Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ ΠΎΠ΄ списокот, Π±Π°Ρ€Π°ΠΌΠ΅ SCMP_ACT_TRAP, Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ seccomp ќС испрати сигнал Π΄ΠΎ процСсот SIGSYS со опис кој систСмски ΠΏΠΎΠ²ΠΈΠΊ Π³ΠΈ ΠΏΡ€Π΅ΠΊΡ€ΡˆΠΈΠ» ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π°. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ја Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ seccomp_load, кој ќС ја ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈ ќС ја ΠΏΡ€ΠΈΠΊΠ°Ρ‡ΠΈ Π½Π° процСсот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ систСмски ΠΏΠΎΠ²ΠΈΠΊ seccomp(2).

Π—Π° ΡƒΡΠΏΠ΅ΡˆΠ½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½Π° со Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° libseccomp, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

cc -std=c17 -Wall -Wextra -c -o seccomp_lib.o seccomp_lib.c
cc -o seccomp_lib seccomp_lib.o -lseccomp

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ΅:

$ ./seccomp_lib echo ok
ok

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Π½ систСмски ΠΏΠΎΠ²ΠΈΠΊ:

$ sudo ./seccomp_lib mount -t bpf bpf /tmp
Bad system call

НиС користимС straceΠ·Π° Π΄Π΅Ρ‚Π°Π»ΠΈ:

$ sudo strace -e seccomp ./seccomp_lib mount -t bpf bpf /tmp
seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=50, filter=0x55d8e78428e0}) = 0
--- SIGSYS {si_signo=SIGSYS, si_code=SYS_SECCOMP, si_call_addr=0xboobdeadbeef, si_syscall=__NR_mount, si_arch=AUDIT_ARCH_X86_64} ---
+++ killed by SIGSYS (core dumped) +++
Bad system call

ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π·Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΅ ΠΏΡ€Π΅ΠΊΠΈΠ½Π°Ρ‚Π° ΠΏΠΎΡ€Π°Π΄ΠΈ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° Π½Π΅Π»Π΅Π³Π°Π»Π΅Π½ систСмски ΠΏΠΎΠ²ΠΈΠΊ mount(2).

Π—Π½Π°Ρ‡ΠΈ, напишавмС Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° libseccomp, Π²ΠΊΠ»ΠΎΠΏΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΡ˜Π°Π»Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π²ΠΎ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π»ΠΈΠ½ΠΈΠΈ. Π’ΠΎ Π³ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΠΎ ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ, Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ ΠΌΠΎΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° сС Π½Π°ΠΌΠ°Π»ΠΈ, бидСјќи ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π΅ само листа Π½Π° спорСдби. Π—Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, libseccomp Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° имашС Π²ΠΊΠ»ΡƒΡ‡Π΅Π½Π° Π»Π΅ΠΏΠ΅Π½ΠΊΠ°, кој Π΄ΠΎΠ΄Π°Π²Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΡ‚ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ SCMP_FLTATR_CTL_OPTIMIZE. ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° овој Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π° 2 ќС Π³ΠΎ ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€ΠΈ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π²ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅.

Ако сакатС Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π°Ρ‚ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΡ‚Π΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π·Π° ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Сдноставна скрипта, кој Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Ρ‚Π°ΠΊΠ²ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π²ΠΎ асСмблСрот Π½Π° BPF со Π±ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π±Ρ€ΠΎΠ΅Π²ΠΈ Π½Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

$ echo 1 3 6 8 13 | ./generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0

НСвозмоТно Π΅ Π΄Π° сС напишС Π½Π΅ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ±Ρ€Π·ΠΎ, бидСјќи ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ BPF Π½Π΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π²Ρ€ΡˆΠ°Ρ‚ скокови со Π²ΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ (Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, jmp A ΠΈΠ»ΠΈ jmp [label+X]) ΠΈ Π·Π°Ρ‚ΠΎΠ° ситС Ρ‚Ρ€Π°Π½Π·ΠΈΡ†ΠΈΠΈ сС статични.

seccomp ΠΈ strace

Π‘ΠΈΡ‚Π΅ ја Π·Π½Π°Π°Ρ‚ корисноста strace Π΅ Π½Π΅Π·Π°ΠΌΠ΅Π½Π»ΠΈΠ²Π° Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° ΠΏΡ€ΠΎΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° процСситС Π½Π° Linux. Π‘Π΅ΠΏΠ°ΠΊ, ΠΌΠ½ΠΎΠ³ΡƒΠΌΠΈΠ½Π° ΡΠ»ΡƒΡˆΠ½Π°Π»Π΅ ΠΈ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ со пСрформанситС ΠΊΠΎΠ³Π° ја користитС ΠΎΠ²Π°Π° Π°Π»Π°Ρ‚ΠΊΠ°. Π€Π°ΠΊΡ‚ Π΅ Π΄Π΅ΠΊΠ° strace ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ ptrace(2), ΠΈ Π²ΠΎ овој ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΎΠ΄Ρ€Π΅Π΄ΠΈΠΌΠ΅ Π½Π° кој сСт систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π·Π°ΠΏΡ€Π΅ΠΌΠ΅ процСсот, Ρ‚.Π΅., Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ

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

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

ΠΈ

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

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

сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°Π°Ρ‚ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, ΠΈΠ°ΠΊΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜ сакамС Π΄Π° слСдимС само Π΅Π΄Π΅Π½ систСмски ΠΏΠΎΠ²ΠΈΠΊ.

Нова ΠΎΠΏΡ†ΠΈΡ˜Π° --seccomp-bpf, Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° Π½Π° strace Π²Π΅Ρ€Π·ΠΈΡ˜Π° 5.3, Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ процСсот ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠ°Ρ‚ΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΠ΄ Ρ‚Ρ€Π°Π³Π°Ρ‚Π° Π½Π° Π΅Π΄Π΅Π½ систСмски ΠΏΠΎΠ²ΠΈΠΊ Π΅ вСќС спорСдливо со Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π½ΠΎ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅:

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

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

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

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

(Π’ΡƒΠΊΠ°, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, постои ΠΌΠ°Π»Π° ΠΈΠ·ΠΌΠ°ΠΌΠ° Π²ΠΎ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π½Π΅ Π³ΠΎ слСдимС Π³Π»Π°Π²Π½ΠΈΠΎΡ‚ систСмски ΠΏΠΎΠ²ΠΈΠΊ Π½Π° ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°. Ако слСдСвмС, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, newfsstat, ΠŸΠΎΡ‚ΠΎΠ° strace Π±ΠΈ ΠΊΠΎΡ‡Π΅Π» исто Ρ‚ΠΎΠ»ΠΊΡƒ силно ΠΊΠ°ΠΊΠΎ Π±Π΅Π· --seccomp-bpf.)

Како Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ΠΎΠ²Π°Π° ΠΎΠΏΡ†ΠΈΡ˜Π°? Π‘Π΅Π· Π½Π΅Π° strace сС ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π° со процСсот ΠΈ Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° Π΄Π° Π³ΠΎ користи PTRACE_SYSCALL. Кога ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π½ΠΈΠΎΡ‚ процСс ΠΈΠ·Π΄Π°Π²Π° (Π±ΠΈΠ»ΠΎ кој) систСмски ΠΏΠΎΠ²ΠΈΠΊ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° сС прСнСсува Π½Π° strace, кој Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ ΠΈ Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ PTRACE_SYSCALL. По Π½Π΅ΠΊΠΎΠ΅ Π²Ρ€Π΅ΠΌΠ΅, процСсот Π³ΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅Ρ‚ΠΈΡ€Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·Π»Π΅Π³ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ Π½Π΅Π³ΠΎ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ сС прСнСсува strace, кој Π³ΠΈ Π³Π»Π΅Π΄Π° ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈΡ‚Π΅ врСдности ΠΈ Π³ΠΎ Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° процСсот со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ PTRACE_SYSCALL, ΠΈ Ρ‚Π°ΠΊΠ° Π½Π°Ρ‚Π°ΠΌΡƒ.

BPF Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΈΡ‚Π΅, Π΄Π΅Π» Π½ΡƒΠ»Π°: класичСн BPF

ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, со seccomp, овој процСс ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° Ρ‚ΠΎΠΊΠΌΡƒ ΠΎΠ½Π°ΠΊΠ° ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π±ΠΈ сакалС. ИмСно, Π°ΠΊΠΎ сакамС Π΄Π° Π³Π»Π΅Π΄Π°ΠΌΠ΅ само Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ X, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° напишСмС BPF Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ ΡˆΡ‚ΠΎ Π·Π° X Π²Ρ€Π°ΡœΠ° врСдност SECCOMP_RET_TRACE, ΠΈ Π·Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΊΠΎΠΈ Π½Π΅ сС ΠΎΠ΄ интСрСс Π·Π° нас - SECCOMP_RET_ALLOW:

ld [0]
jneq #X, ignore
trace: ret #0x7ff00000
ignore: ret #0x7fff0000

Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ strace ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ Π³ΠΎ Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° процСсот ΠΊΠ°ΠΊΠΎ PTRACE_CONT, Π½Π°ΡˆΠΈΠΎΡ‚ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° Π·Π° сСкој систСмски ΠΏΠΎΠ²ΠΈΠΊ, Π°ΠΊΠΎ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ Π΅ X, Ρ‚ΠΎΠ³Π°Ρˆ процСсот ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π½ΠΎ Π°ΠΊΠΎ ΠΎΠ²Π° X, Ρ‚ΠΎΠ³Π°Ρˆ seccomp ќС ја прСнСсС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° straceкој ќС Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΈ ќС Π³ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π΅ процСсот ΠΊΠ°ΠΊΠΎ PTRACE_SYSCALL (бидСјќи seccomp Π½Π΅ΠΌΠ° моТност Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΏΡ€ΠΈ ΠΈΠ·Π»Π΅Π· ΠΎΠ΄ систСмски ΠΏΠΎΠ²ΠΈΠΊ). Кога ќС сС Π²Ρ€Π°Ρ‚ΠΈ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ, strace ќС Π³ΠΎ рСстартира процСсот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ PTRACE_CONT ΠΈ ќС Ρ‡Π΅ΠΊΠ° Π½ΠΎΠ²ΠΈ ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΎΠ΄ seccomp.

BPF Π·Π° Π½Π°Ρ˜ΠΌΠ°Π»ΠΈΡ‚Π΅, Π΄Π΅Π» Π½ΡƒΠ»Π°: класичСн BPF

ΠŸΡ€ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΎΠΏΡ†ΠΈΡ˜Π°Ρ‚Π° --seccomp-bpf ΠΈΠΌΠ° Π΄Π²Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°. ΠŸΡ€Π²ΠΎ, Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° сС ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π½Π° вСќС постоСчки процСс (ΠΎΠΏΡ†ΠΈΡ˜Π° -p ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ strace), бидСјќи ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΎ ΠΎΠ΄ seccomp. Π’Ρ‚ΠΎΡ€ΠΎ, Π½Π΅ΠΌΠ° моТност НСма ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Π³ΠΈ дСтскитС процСси, бидСјќи Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ seccomp сС наслСдСни ΠΎΠ΄ ситС дСтски процСси Π±Π΅Π· моТност Π·Π° ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ²Π°.

ΠœΠ°Π»ΠΊΡƒ повСќС Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ strace Ρ€Π°Π±ΠΎΡ‚ΠΈ со seccomp ΠΌΠΎΠΆΠ΅ Π΄Π° сС најдС ΠΎΠ΄ нСодамнСшСн ΠΈΠ·Π²Π΅ΡˆΡ‚Π°Ρ˜. Π—Π° нас, Π½Π°Ρ˜ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ΅Π½ Π΅ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° класичниот BPF прСтставСн со 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. НСма Π΄Π° Π½Π°Π²Π»Π΅Π³ΡƒΠ²Π°ΠΌ ΠΏΠΎΠ½Π°Ρ‚Π°ΠΌΡƒ Π²ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ, бидСјќи вСќС Π΅ јасно Π΄Π΅ΠΊΠ° Ρ€Π°Ρ‡Π½ΠΎ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Ρ‚Π°ΠΊΠ²ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ. Π’ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° BPF - Π·Π°Π±ΠΎΡ€Π°Π²Π΅Π½ΠΈΠΎΡ‚ Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄, ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ врски со ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° 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 Π½Π°ΠΏΠ°Π΄ΠΈ. Π’ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π’ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°Π»Π°Ρ‚ΠΊΠΈΡ‚Π΅ BPF Ρ‚ΠΈΠ΅ ΠΎΠ±Ρ˜Π°ΡΠ½ΡƒΠ²Π°Π°Ρ‚ ΠΊΠ°ΠΊΠΎ (ΠΈ Π·ΠΎΡˆΡ‚ΠΎ) Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π°Ρ‚ BPF Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ ΠΈ ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ Π΄ΠΎ Π·Π±ΠΈΡ€ Π½Π° Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° создавањС Ρ‚Π°ΠΊΠ²ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° bpfgen ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° BPF ΡˆΡ‚ΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π° Π½Π° Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ DNS Π·Π° ΠΈΠΌΠ΅ habr.com:

$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax

lb_0:
    ld [x + 0]
    jneq #0x04686162, lb_1
    ld [x + 4]
    jneq #0x7203636f, lb_1
    ldh [x + 8]
    jneq #0x6d00, lb_1
    ret #65535

lb_1:
    ret #0

Π’ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΏΡ€Π²ΠΎ сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ рСгистарот X адрСса Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ Π½Π° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° x04habrx03comx00 Π²Π½Π°Ρ‚Ρ€Π΅ Π²ΠΎ UDP Π΄Π°Ρ‚Π°Π³Ρ€Π°ΠΌ ΠΈ ΠΏΠΎΡ‚ΠΎΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π³ΠΎ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ: 0x04686162 <-> "x04hab" ΠΈΡ‚Π½

ΠœΠ°Π»ΠΊΡƒ ΠΏΠΎΠ΄ΠΎΡ†Π½Π°, Cloudfare Π³ΠΎ објави ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ p0f -> BPF. Π’ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π’ΠΈ Π³ΠΎ прСтставувамС ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ p0f BPF Ρ‚ΠΈΠ΅ Π·Π±ΠΎΡ€ΡƒΠ²Π°Π°Ρ‚ Π·Π° Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π΅ p0f ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° сС ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€Π°Ρ‚ потписитС Π½Π° p0f Π²ΠΎ BPF:

$ ./bpfgen p0f -- 4:64:0:0:*,0::ack+:0
39,0 0 0 0,48 0 0 8,37 35 0 64,37 0 34 29,48 0 0 0,
84 0 0 15,21 0 31 5,48 0 0 9,21 0 29 6,40 0 0 6,
...

Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² повСќС Π½Π΅ користи Cloudfare xt_bpf, бидСјќи сС прСсСлилС Π²ΠΎ XDP - Π΅Π΄Π½Π° ΠΎΠ΄ ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Π½ΠΎΠ²Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° BPF, Π²ΠΈΠ΄Π΅Ρ‚Π΅. L4Drop: Π£Π±Π»Π°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° XDP DDoS.

cls_bpf

ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° класичСн 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 Π³ΠΎΠ΄ΠΈΠ½Π° соодвСтнитС Π·Π°ΠΊΡ€ΠΏΠΈ ΠΏΠΎΡ‡Π½Π° Π΄Π° сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π° Π²ΠΎ Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. ΠšΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ Ρ€Π°Π·Π±Ρ€Π°Π², ΠΏΡ€Π²ΠΈΡ‡Π½ΠΈΠΎΡ‚ ΠΏΠ»Π°Π½ бСшС само Π΄Π° сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ΠΈ JIT ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ Π·Π° поСфикасно Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° 64-Π±ΠΈΡ‚Π½ΠΈ машини, Π½ΠΎ намСсто Ρ‚ΠΎΠ°, ΠΎΠ²ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π³ΠΎ ΠΎΠ·Π½Π°Ρ‡ΠΈΡ˜Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° Π½ΠΎΠ²ΠΎΡ‚ΠΎ поглавјС Π²ΠΎ Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° Linux.

ΠŸΠΎΠ½Π°Ρ‚Π°ΠΌΠΎΡˆΠ½ΠΈΡ‚Π΅ написи Π²ΠΎ ΠΎΠ²Π°Π° ΡΠ΅Ρ€ΠΈΡ˜Π° ќС ја ΠΎΠΏΡ„Π°Ρ‚Π°Ρ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° Π½ΠΎΠ²Π°Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π°, ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ·Π½Π°Ρ‚Π° ΠΊΠ°ΠΊΠΎ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ΅Π½ BPF, ΠΏΠΎΡ‚ΠΎΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ BPF, Π° сСга Сдноставно BPF.

Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ

  1. Π‘Ρ‚ΠΈΠ²Π΅Π½ МСкКСн ΠΈ Π’Π°Π½ ЏСјкобсон, β€žΠ€ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ BSD: Π½ΠΎΠ²Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π·Π° Ρ„Π°ΡœΠ°ΡšΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΠΊΠΎΡ€ΠΈΡΠ½ΠΈΠΊβ€œ, https://www.tcpdump.org/papers/bpf-usenix93.pdf
  2. Π‘Ρ‚ΠΈΠ²Π΅Π½ МСкКСн, β€žlibpcap: АрхитСктура ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π·Π° снимањС Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈβ€œ, https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
  3. tcpdump, libpcap: https://www.tcpdump.org/
  4. Упатство Π·Π° Π½Π°Ρ‚ΠΏΡ€Π΅Π²Π°Ρ€ Π·Π° IPtable U32.
  5. BPF - Π·Π°Π±ΠΎΡ€Π°Π²Π΅Π½ΠΈΠΎΡ‚ Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄: https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
  6. Π’ΠΈ ја прСтставувамС Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° BPF: https://blog.cloudflare.com/introducing-the-bpf-tools/
  7. bpf_cls: http://man7.org/linux/man-pages/man8/tc-bpf.8.html
  8. Π’Ρ‚ΠΎΡ€ ΠΏΡ€Π΅Π³Π»Π΅Π΄: https://lwn.net/Articles/656307/
  9. https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
  10. habr: ΠšΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ ΠΈ бСзбСдност: seccomp
  11. habr: Π˜Π·ΠΎΠ»ΠΈΡ€Π°ΡšΠ΅ Π΄Π΅ΠΌΠΎΠ½ΠΈ со systemd ΠΈΠ»ΠΈ β€žΠ½Π΅ Ρ‚ΠΈ Ρ‚Ρ€Π΅Π±Π° Docker Π·Π° ΠΎΠ²Π°!β€œ
  12. Пол Шајњон, β€žΡ‚Ρ€Π°Ρ˜Ρ --сСцомп-Π±ΠΏΡ„: ΠΏΠΎΠ³Π»Π΅Π΄ ΠΏΠΎΠ΄ Ρ…Π°ΡƒΠ±Π°Ρ‚Π°β€œ, https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€