рдмрд░реНрдХрд▓реЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░реНрд╕ (BPF) рд╣реЗ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдЖрд╣реЗ рдЬреЗ рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдкрд╛рд╕реВрди рдЗрдВрдЧреНрд░рдЬреА-рднрд╛рд╖реЗрдЪреНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдкрд╛рдирд╛рдВрд╡рд░ рдЖрд╣реЗ. рдкрд░рд┐рд╖рджрд╛ BPF рдЪреНрдпрд╛ рд╡рд╛рдкрд░ рдЖрдгрд┐ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЕрд╣рд╡рд╛рд▓рд╛рдВрдиреА рднрд░рд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдбреЗрд╡реНрд╣рд┐рдб рдорд┐рд▓рд░, рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВрдЯреЗрдирд░, рд▓рд┐рдирдХреНрд╕ рдкреНрд▓рдВрдмрд░реНрд╕ 2018 рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреЗ рднрд╛рд╖рдг рдХреЙрд▓ рдХрд░рддреЗ
Habr├й рд╡рд░ BPF рдЪреЗ рдЕрджреНрдпрд╛рдк рдХреЛрдгрддреЗрд╣реА рдкрджреНрдзрддрд╢реАрд░ рд╡рд░реНрдгрди рдирд╛рд╣реА, рдЖрдгрд┐ рдореНрд╣рдгреВрдирдЪ рд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рдорд╛рд▓рд┐рдХреЗрдд рдореА рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рдмрджреНрджрд▓ рдмреЛрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди, рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рд╡рд┐рдХрд╛рд╕ рд╕рд╛рдзрдирд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░реЗрди рдЖрдгрд┐ BPF рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрдгрд┐ рд╕рд░рд╛рд╡рд╛рдЪреНрдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдВрдЪреА рд░реВрдкрд░реЗрд╖рд╛ рд╕рд╛рдВрдЧреЗрди. рд╣рд╛ рд▓реЗрдЦ, рд╢реВрдиреНрдп, рдорд╛рд▓рд┐рдХреЗрддреАрд▓, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдЖрдгрд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕рд╛рдВрдЧрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рддрддреНрддреНрд╡рд╛рдВрдЪреЗ рд░рд╣рд╕реНрдп рджреЗрдЦреАрд▓ рдкреНрд░рдХрдЯ рдХрд░рддреЛ. tcpdump
, seccomp
, strace
, рдЖрдгрд┐ рдмрд░реЗрдЪ рдХрд╛рд╣реА.
рдмреАрдкреАрдПрдлрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рд╕рдореБрджрд╛рдпрд╛рджреНрд╡рд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдмреАрдкреАрдПрдлрдЪреЗ рдореБрдЦреНрдп рд╡рд┐рджреНрдпрдорд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд рдЖрдгрд┐ рдореНрд╣рдгреВрди рдкрд░рд╡рд╛рдирдЧреАрд╕рд╣
BPF рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рддреАрд▓ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрд░реНрд╕ (c)
рдЖрдзреБрдирд┐рдХ BPF рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╣реЗ рддреНрдпрд╛рдЪ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдЬреБрдиреНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреА рд╕реБрдзрд╛рд░рд┐рдд рдЖрдгрд┐ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЖрд╡реГрддреНрддреА рдЖрд╣реЗ, рдЬреНрдпрд╛рд▓рд╛ рдЖрддрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдореНрд╣рдгрддрд╛рдд рдЧреЛрдВрдзрд│ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА. рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреБрдХреНрддрддрд╛ рддрдпрд╛рд░ рдХреЗрд▓реА рдЧреЗрд▓реА tcpdump
, рдпрдВрддреНрд░рдгрд╛ seccomp
, рддрд╕реЗрдЪ рдХрдореА рдЬреНрдЮрд╛рдд рдореЙрдбреНрдпреВрд▓реНрд╕ xt_bpf
рддреЗ iptables
рдЖрдгрд┐ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ cls_bpf
. рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рдЖрдкреЛрдЖрдк рдирд╡реАрди рд╕реНрд╡рд░реВрдкрд╛рдд рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд, рддрдерд╛рдкрд┐, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдПрдкреАрдЖрдп рдХрд╛рдпрдо рдЖрд╣реЗ рдЖрдгрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрд╕рд╛рдареА рдирд╡реАрди рдЙрдкрдпреЛрдЧ, рдЬрд╕реЗ рдЖрдкрдг рдпрд╛ рд▓реЗрдЦрд╛рдд рдкрд╛рд╣реВ, рдЕрдЬреВрдирд╣реА рд╢реЛрдзрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗрдд. рдпрд╛ рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рдЖрдгрд┐ рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рдЪреЗ рдЕрдиреБрд╕рд░рдг рдХреЗрд▓реНрдпрд╛рдореБрд│реЗ, рддреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреБрдирд┐рдХ рд╕реНрд╡рд░реВрдкрд╛рдд рдХрд╕реЗ рдЖрдгрд┐ рдХрд╛ рд╡рд┐рдХрд╕рд┐рдд рдЭрд╛рд▓реЗ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдИрд▓, рдореА рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдмрджреНрджрд▓рдЪреНрдпрд╛ рд▓реЗрдЦрд╛рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд▓реЗ.
рдЧреЗрд▓реНрдпрд╛ рд╢рддрдХрд╛рдЪреНрдпрд╛ рдРрдВрд╢реАрдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА, рдкреНрд░рд╕рд┐рджреНрдз рд▓реЙрд░реЗрдиреНрд╕ рдмрд░реНрдХрд▓реЗ рдкреНрд░рдпреЛрдЧрд╢рд╛рд│реЗрддреАрд▓ рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдирд╛ рдЧреЗрд▓реНрдпрд╛ рд╢рддрдХрд╛рдЪреНрдпрд╛ рдРрдВрд╢реАрдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рдЙрддреНрддрд░рд╛рд░реНрдзрд╛рдд рдЖрдзреБрдирд┐рдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреЕрдХреЗрдЯреНрд╕ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╕реЗ рдлрд┐рд▓реНрдЯрд░ рдХрд░рд╛рдпрдЪреЗ рдпрд╛ рдкреНрд░рд╢реНрдирд╛рдд рд░рд╕ рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓рд╛. рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрдЪреА рдореВрд│ рдХрд▓реНрдкрдирд╛, рдореВрд│рдд: CSPF (CMU/Stanford Packet Filter) рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдордзреНрдпреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реА рдЧреЗрд▓реА, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЯреНрд╕ рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рд▓рд╡рдХрд░ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреЗ, рдореНрд╣рдгрдЬреЗ. рдХрд░реНрдирд▓ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ, рдХрд╛рд░рдг рдпрд╛рдореБрд│реЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдгреЗ рдЯрд╛рд│рд▓реЗ рдЬрд╛рддреЗ. рдХрд░реНрдирд▓ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХреЛрдб рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд░рдирдЯрд╛рдЗрдо рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕рдБрдбрдмреЙрдХреНрд╕ рдХреЗрд▓реЗрд▓реЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╡рд╛рдкрд░рд▓реЗ рдЧреЗрд▓реЗ.
рддрдерд╛рдкрд┐, рд╡рд┐рджреНрдпрдорд╛рди рдлрд┐рд▓реНрдЯрд░реНрд╕рд╕рд╛рдареА рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╕реНрдЯреЕрдХ-рдЖрдзрд╛рд░рд┐рдд рдорд╢реАрдирд╡рд░ рдЪрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реНрдпрд╛ рд╣реЛрддреНрдпрд╛ рдЖрдгрд┐ рдирд╡реАрди RISC рдорд╢реАрдирд╡рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдиреЗ рдЪрд╛рд▓рдд рдирд╛рд╣реАрдд. рдкрд░рд┐рдгрд╛рдореА, рдмрд░реНрдХрд▓реЗ рд▓реЕрдмрдордзреАрд▓ рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рддреВрди, рдПрдХ рдирд╡реАрди рдмреАрдкреАрдПрдл (рдмрд░реНрдХрд▓реЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░) рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рдЬреНрдпрд╛рдЪреЗ рдЖрднрд╛рд╕реА рдорд╢реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЛрдЯреЛрд░реЛрд▓рд╛ 6502 рдкреНрд░реЛрд╕реЗрд╕рд░рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ рдЧреЗрд▓реЗ - рдЕрд╢рд╛ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЙрддреНрдкрд╛рджрдирд╛рдВрдЪреЗ рд╡рд░реНрдХрд╣реЛрд░реНрд╕.
рдмреАрдкреАрдПрдл рдорд╢реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░
рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрди рдЖрдореНрд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рд╢реА рдХрд╛рд░реНрдпрд╢реАрд▓ рдорд╛рд░реНрдЧрд╛рдиреЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК. рддрдерд╛рдкрд┐, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЕрд╕реЗ рдореНрд╣рдгреВрдпрд╛ рдХреА рдорд╢реАрдирдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рд╡реЗрд╢рдпреЛрдЧреНрдп рджреЛрди 32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддреЗ, рдПрдХ рд╕рдВрдЪрдпрдХ A
рдЖрдгрд┐ рдЗрдВрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ X
, 64 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдорд░реА (16 рд╢рдмреНрдж), рд▓реЗрдЦрди рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд╡рд╛рдЪрдирд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз, рдЖрдгрд┐ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдорд╛рдВрдбрдЪреА рдПрдХ рдЫреЛрдЯреА рдкреНрд░рдгрд╛рд▓реА. рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдВрдордзреНрдпреЗ рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрдВрдк рд╕реВрдЪрдирд╛ рджреЗрдЦреАрд▓ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреНрдпрд╛, рдкрд░рдВрддреБ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реЗрд│реЗрд╡рд░ рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рдЪреА рд╣рдореА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдЬрдВрдк рдлрдХреНрдд рдкреБрдвреЗ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдореНрд╣рдгрдЬреЗ, рд╡рд┐рд╢реЗрд╖рддрдГ, рд▓реВрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рдордирд╛рдИ рд╣реЛрддреА.
рдорд╢реАрди рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдг рдпреЛрдЬрдирд╛ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ BPF рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рд╡рд╛рдкрд░реВрди рдХрд╛рд╣реА рдХрд░реНрдирд▓ рдореЗрдХреЕрдирд┐рдЭрдо (рдЬрд╕реЗ рдХреА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓), рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЛрдб рдХрд░рддреЗ рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рдХрд╛рд╣реА рд╕рд╛рдареА рдХрд░реНрдирд▓рдордзреАрд▓ рдЗрд╡реНрд╣реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░рд▓рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЗрд╡реНрд╣реЗрдВрдЯ рдореНрд╣рдгрдЬреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдбрд╡рд░реАрд▓ рдкреБрдвреАрд▓ рдкреЕрдХреЗрдЯрдЪреЗ рдЖрдЧрдорди). рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреА рдШрдЯрдирд╛ рдШрдбрддреЗ, рддреЗрд╡реНрд╣рд╛ рдХрд░реНрдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡рддреЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рджреБрднрд╛рд╖реНрдпрд╛рдордзреНрдпреЗ), рдЖрдгрд┐ рдорд╢реАрди рдореЗрдорд░реА рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕рддреЗ рдХрд╛рд╣реА рд╕рд╛рдареА рдХрд░реНрдирд▓ рдореЗрдорд░реА рдкреНрд░рджреЗрд╢ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЗрдирдХрдорд┐рдВрдЧ рдкреЕрдХреЗрдЯрдЪрд╛ рдбреЗрдЯрд╛).
рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реАрд▓ рдЧреЛрд╖реНрдЯреА рдкреБрд░реЗрд╕реЗ рдЕрд╕рддреАрд▓: рдЖрд╡рд╢реНрдпрдХрддреЗрдиреБрд╕рд╛рд░ рдЖрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдо рдЖрдгрд┐ рдХрдорд╛рдВрдб рдлреЙрд░рдореЕрдЯрд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК. рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдЪреНрдпрд╛ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдордЪрд╛ рддрд╛рдмрдбрддреЛрдм рдЕрднреНрдпрд╛рд╕ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рддреАрд▓ рд╕рд░реНрд╡ рдХреНрд╖рдорддрд╛ рдЬрд╛рдгреВрди рдШреНрдпрд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░ рддреБрдореНрд╣реА рдореВрд│ рд▓реЗрдЦ рд╡рд╛рдЪреВ рд╢рдХрддрд╛. libpcap
: рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░рд╕рд╛рдареА рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрджреНрдзрддlibpcap
.
рдЖрдореНрд╣реА рдЖрддрд╛ рд▓рд┐рдирдХреНрд╕рд╡рд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ: tcpdump
(libpcap
), seccomp, xt_bpf
, cls_bpf
.
tcpdump
рдмреАрдкреАрдПрдлрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрд╕рд╛рдареА рдлреНрд░рдВрдЯрдПрдВрдбрдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рд╕рдорд╛рдВрддрд░рдкрдгреЗ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ - рдПрдХ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреБрдХреНрддрддрд╛ tcpdump
. рдЖрдгрд┐, рд╣реЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬреБрдиреЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рдкреНрд░рд╕рд┐рджреНрдз рдЙрджрд╛рд╣рд░рдг рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЕрдиреЗрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯреАрдорд╡рд░ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ, рдЖрдореНрд╣реА рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪрд╛ рдЖрдордЪрд╛ рдЕрднреНрдпрд╛рд╕ рд╕реБрд░реВ рдХрд░реВ.
(рдореА рд▓рд┐рдирдХреНрд╕рд╡рд░ рдпрд╛ рд▓реЗрдЦрд╛рддреАрд▓ рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ рдЪрд╛рд▓рд╡рд▓реА 5.6.0-rc6
. рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рд╡рд╛рдЪрдиреАрдпрддреЗрд╕рд╛рдареА рдХрд╛рд╣реА рдХрдорд╛рдВрдбреНрд╕рдЪреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдкрд╛рджрд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ.)
рдЙрджрд╛рд╣рд░рдг: IPv6 рдкреЕрдХреЗрдЯрдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдгреЗ
рдЪрд▓рд╛ рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛ рдХреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЗрдВрдЯрд░рдлреЗрд╕рд╡рд░ рд╕рд░реНрд╡ IPv6 рдкреЕрдХреЗрдЯреНрд╕ рдкрд╣рд╛рдпрдЪреЗ рдЖрд╣реЗрдд eth0
. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдкрдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ tcpdump
рд╕рд╛рдзреНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рд╕рд╣ ip6
:
$ sudo tcpdump -i eth0 ip6
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ tcpdump
рдлрд┐рд▓реНрдЯрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ ip6
BPF рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрд╛рдЗрдЯрдХреЛрдбрдордзреНрдпреЗ рдЖрдгрд┐ рдХрд░реНрдирд▓рд╡рд░ рдкрд╛рдард╡рд╛ (рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рддрдкрд╢реАрд▓ рдкрд╣рд╛ 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
(рдкреЕрдХреЗрдЬ рдкреНрд░рдХрд╛рд░) c 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
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)
). рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рд╣реА рдЕреЕрдбреНрд░реЗрд╕рд┐рдВрдЧ рдпреЛрдЬрдирд╛ рдмреАрдкреАрдПрдлрдордзреНрдпреЗ рдЕрдЪреВрдХрдкрдгреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ X
(рдЗрдВрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░) IPv4 рд╢реАрд░реНрд╖рд▓реЗрдЦ рд▓рд╛рдВрдмреА.
рддрд░ ренрд╡реНрдпрд╛ рдУрд│реАрд╡рд░ рдЖрдкрдг рдЕрд░реНрдзрд╛ рд╢рдмреНрдж рдпреЗрдереЗ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЛ (X+16)
. рдЗрдерд░рдиреЗрдЯ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдиреЗ 14 рдмрд╛рдЗрдЯреНрд╕ рд╡реНрдпрд╛рдкрд▓реЗрд▓реЗ рдЖрд╣реЗрдд рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рдгреЗ, рдЖрдгрд┐ X
IPv4 рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдЪреА рд▓рд╛рдВрдмреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ, рдЖрдореНрд╣реА рд╕рдордЬрддреЛ рдХреА рдордзреНрдпреЗ A
TCP рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ рд▓реЛрдб рдХреЗрд▓реЗ рдЖрд╣реЗ:
14 X 2 2
|ethernet header|ip header|source port|destination port|
рд╢реЗрд╡рдЯреА, 8 рд╡реНрдпрд╛ рдУрд│реАрд╡рд░ рдЖрдореНрд╣реА рдЗрдЪреНрдЫрд┐рдд рдореВрд▓реНрдпрд╛рд╕рд╣ рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЛ рдЖрдгрд┐ 9 рдХрд┐рдВрд╡рд╛ 10 рд╡реНрдпрд╛ рдУрд│реАрдВрд╡рд░ рдЖрдореНрд╣реА рдкрд░рд┐рдгрд╛рдо рдкрд░рдд рдХрд░рддреЛ - рдкреЕрдХреЗрдЯ рдХреЙрдкреА рдХрд░рд╛рдпрдЪреЗ рдХреА рдирд╛рд╣реА.
Tcpdump: рд▓реЛрдб рд╣реЛрдд рдЖрд╣реЗ
рдорд╛рдЧреАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рд╡рд┐рд╢реЗрд╖рдд: рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрд╕рд╛рдареА рдХрд░реНрдирд▓рдордзреНрдпреЗ рдмреАрдкреАрдПрдл рдмрд╛рдпрдХреЛрдб рдХрд╕реЗ рд▓реЛрдб рдХрд░рддреЛ рдпрд╛рдмрджреНрджрд▓ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдирд╛рд╣реА. рд╕рд╛рдзрд╛рд░рдгрддрдГ рдмреЛрд▓рд╛рддрд╛рдВрдиреА, tcpdump
рдЕрдиреЗрдХ рд╕рд┐рд╕реНрдЯреАрдорд╡рд░ рдЖрдгрд┐ рдлрд┐рд▓реНрдЯрд░рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреЛрд░реНрдЯ рдХреЗрд▓реЗрд▓реЗ tcpdump
libpcap
libpcap
, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдЧреЛрд╖реНрдЯреА рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:
- рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рд╛
pcap_t
рдЗрдВрдЯрд░рдлреЗрд╕ рдирд╛рд╡рд╛рд╡рд░реВрди: ,pcap_create
- рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдХреНрд░рд┐рдп рдХрд░рд╛:
,pcap_activate
- рдлрд┐рд▓реНрдЯрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛:
,pcap_compile
- рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рд╛:
.pcap_setfilter
рдХрд╛рд░реНрдп рдХрд╕реЗ рдЖрд╣реЗ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА pcap_setfilter
рд▓рд┐рдирдХреНрд╕ рдордзреНрдпреЗ рд▓рд╛рдЧреВ, рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ strace
(рдХрд╛рд╣реА рдУрд│реА рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реНрдпрд╛ рдЖрд╣реЗрдд):
$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768) = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...
рдЖрдЙрдЯрдкреБрдЯрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рджреЛрди рдУрд│реАрдВрд╡рд░ рдЖрдкрдг рддрдпрд╛рд░ рдХрд░рддреЛ eth0
... рдкрд╛рд╕реВрди ip
рдЪрд╛рд░ BPF рд╕реВрдЪрдирд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддрд┐рд╕рд▒реНрдпрд╛ рдУрд│реАрд╡рд░ рдЖрдкрдг рдкрд░реНрдпрд╛рдп рдХрд╕рд╛ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ рддреЗ рдкрд╛рд╣реВ SO_ATTACH_FILTER
setsockopt
рдЖрдореНрд╣реА 4 рд▓рд╛рдВрдмреАрдЪрд╛ рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ. рд╣реЗ рдЖрдордЪреЗ рдлрд┐рд▓реНрдЯрд░ рдЖрд╣реЗ.
рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрдордзреНрдпреЗ, рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░рдгреЗ рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рдиреЗрд╣рдореАрдЪ рдЕрдгреВ рдСрдкрд░реЗрд╢рди рдореНрд╣рдгреВрди рд╣реЛрддреЗ рдЖрдгрд┐ рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЛрдб рдХрд░рдгреЗ рдЖрдгрд┐ рдЗрд╡реНрд╣реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░рд▓рд╛ рдмрдВрдзрдирдХрд╛рд░рдХ рдХрд░рдгреЗ рд╡реЗрд│реЗрдд рд╡реЗрдЧрд│реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
рд▓рдкрд▓реЗрд▓реЗ рд╕рддреНрдп
рдЖрдЙрдЯрдкреБрдЯрдЪреА рдереЛрдбреА рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдЖрд╡реГрддреНрддреА рдЕрд╕реЗ рджрд┐рд╕рддреЗ:
$ 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
(рд╕рд░реНрд╡ рдкреЕрдХреЗрдЯреНрд╕ рдбреНрд░реЙрдк рдХрд░рд╛), рд╕реЙрдХреЗрдЯрд▓рд╛ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдбрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рдЖрдгрд┐ рдорд╛рдЧреАрд▓ рдлрд┐рд▓реНрдЯрд░реНрд╕рдордзреВрди рд░рд╛рд╣рд┐рд▓реЗрд▓реА рд╕рд░реНрд╡ рдкреЕрдХреЗрдЯреНрд╕ рд╡рдЬрд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЗ.
рдПрдХрдВрджрд░реАрдд, рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд╛рдкрд░реВрди рд▓рд┐рдирдХреНрд╕рд╡рд░ рдкреЕрдХреЗрдЬреЗрд╕ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдордЪреНрдпрд╛рдХрдбреЗ рд╕рдВрд░рдЪрдиреЗрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдлрд┐рд▓реНрдЯрд░ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬрд╕реЗ рдХреА struct sock_fprog
рдЖрдгрд┐ рдПрдХ рдУрдкрди рд╕реЙрдХреЗрдЯ, рдЬреНрдпрд╛рдирдВрддрд░ рдлрд┐рд▓реНрдЯрд░рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рд╕реЙрдХреЗрдЯрд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ setsockopt
.
рд╡рд┐рд╢реЗрд╖ рдореНрд╣рдгрдЬреЗ, рдлрд┐рд▓реНрдЯрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реЙрдХреЗрдЯрд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдХреЗрд╡рд│ рдХрдЪреНрдЪрд╛ рдирд╛рд╣реА. рдпреЗрдереЗ
рд╡рд╛рдкрд░рд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓ setsockopt
рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдкрд╣рд╛ struct sock_fprog
рдорджрддреАрд╢рд┐рд╡рд╛рдп tcpdump
рдЖрдореНрд╣реА рд╡рд┐рднрд╛рдЧрд╛рдд рдмреЛрд▓реВ
рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЖрдгрд┐ 21 рд╡реЗ рд╢рддрдХ
BPF 1997 рдордзреНрдпреЗ рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рддреЗ рдХрд╛рд░реНрдпрд░рдд рдЖрд╣реЗ libpcap
рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд┐рд╢реЗрд╖ рдмрджрд▓рд╛рдВрд╢рд┐рд╡рд╛рдп (рд▓рд┐рдирдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрджрд▓, рдЕрд░реНрдерд╛рддрдЪ, x86_64
рдХреЛрдб
рдЬреЗрдЖрдпрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рд╕рд╛рдЦрд│реАрддреАрд▓ рдкрд╣рд┐рд▓реЗ рд╣реЛрддреЗ: 2012 рдордзреНрдпреЗ xt_bpf
, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд┐рдпрдо рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ iptables
BPF рдЪреНрдпрд╛ рдорджрддреАрдиреЗ, рдЖрдгрд┐ рдСрдХреНрдЯреЛрдмрд░ 2013 рдордзреНрдпреЗ рд╣реЛрддреЗ cls_bpf
, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ BPF рд╡рд╛рдкрд░реВрди рд░рд╣рджрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.
рдЖрдореНрд╣реА рд▓рд╡рдХрд░рдЪ рд╣реА рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ, рдкрд░рдВрддреБ рдкреНрд░рдердо BPF рд╕рд╛рдареА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╕реЗ рд▓рд┐рд╣рд╛рд╡реЗ рдЖрдгрд┐ рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛рд╡реЗ рд╣реЗ рд╢рд┐рдХрдгреЗ рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓, рдХрд╛рд░рдг рд▓рд╛рдпрдмреНрд░рд░реАрджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреНрд╖рдорддрд╛ libpcap
рдорд░реНрдпрд╛рджрд┐рдд (рд╕рд╛рдзреЗ рдЙрджрд╛рд╣рд░рдг: рдлрд┐рд▓реНрдЯрд░ рд╡реНрдпреБрддреНрдкрдиреНрди libpcap
рдлрдХреНрдд рджреЛрди рдореВрд▓реНрдпреЗ рдкрд░рдд рдХрд░реВ рд╢рдХрддрд╛рдд - 0 рдХрд┐рдВрд╡рд╛ 0x40000) рдХрд┐рдВрд╡рд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ, seccomp рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реАрдд.
рдЖрдордЪреНрдпрд╛ рд╕реНрд╡рдд: рдЪреНрдпрд╛ рд╣рд╛рддрд╛рдВрдиреА рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
рдЪрд▓рд╛ рдмреАрдкреАрдПрдл рдирд┐рд░реНрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рдмрд╛рдпрдирд░реА рд╕реНрд╡рд░реВрдкрд╛рд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдКрдпрд╛, рд╣реЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ:
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,
рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдЪреНрдпрд╛ рд╕реЛрдпреАрд╕рд╛рдареА, рднрд┐рдиреНрди рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:
$ 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
, рдЬрд╕реЗ рдЖрдореНрд╣реА рдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдХреЗрд▓реЗ.
рд▓рд┐рдирдХреНрд╕ рдЖрдгрд┐ рдиреЗрдЯрд╕реНрдирд┐рдл-рдПрдирдЬреА рд╡рд┐рд╕реНрддрд╛рд░
рдорд╛рдирдХ рдмреАрдкреАрдПрдл рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд▓рд┐рдирдХреНрд╕ рдЖрдгрд┐ 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 рдлрд┐рд▓реНрдЯрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд▓реА, рдЬреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдиреБрдордд рд╕рд┐рд╕реНрдЯреАрдо рдХреЙрд▓реНрд╕рдЪрд╛ рд╕рдВрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рдпреЗрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдпреБрдХреНрддрд┐рд╡рд╛рджрд╛рдВрдЪреА рддрдкрд╛рд╕рдгреА рджреЗрдЦреАрд▓ рдХрд░рддрд╛ рдпреЗрддреЗ. (рдордЬреЗрдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ, рдХреНрд░реЛрдо рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдкреИрдХреА рдПрдХ рд╣реЛрддрд╛, рдЖрдгрд┐ рдХреНрд░реЛрдо рд▓реЛрдХ рд╕рдзреНрдпрд╛ BPF рдЪреНрдпрд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд KRSI рдпрдВрддреНрд░рдгрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдд рдЖрд╣реЗрдд рдЖрдгрд┐ Linux рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓реНрд╕рдЪреНрдпрд╛ рд╕рд╛рдиреБрдХреВрд▓рдирд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдд тАЛтАЛрдЖрд╣реЗрдд.) рдЕрддрд┐рд░рд┐рдХреНрдд рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд▓рд┐рдВрдХреНрд╕ рд╢реЗрд╡рдЯреА рдЖрдврд│реВ рд╢рдХрддрд╛рдд. рд▓реЗрдЦрд╛рдЪрд╛.
рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА seccomp рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рд╣рдмрд╡рд░ рдЖрдзреАрдЪ рд▓реЗрдЦ рдЖрд▓реЗ рдЖрд╣реЗрдд, рдХрджрд╛рдЪрд┐рдд рдХреЛрдгреАрддрд░реА рдЦрд╛рд▓реАрд▓ рдЙрдкрд╡рд┐рднрд╛рдЧ рд╡рд╛рдЪрдгреНрдпрд╛рдкреВрд░реНрд╡реА (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдРрд╡рдЬреА) рддреЗ рд╡рд╛рдЪреВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕реЗрд▓. рд▓реЗрдЦрд╛рдд
рдкреБрдвреЗ рдЖрдкрдг рдлрд┐рд▓реНрдЯрд░ рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ рдЖрдгрд┐ рд▓реЛрдб рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ seccomp
рдмреЗрдЕрд░ рд╕реА рдордзреНрдпреЗ рдЖрдгрд┐ рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░реВрди libseccomp
рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реНрдпрд╛рдпрд╛рдЪреЗ рдлрд╛рдпрджреЗ рдЖрдгрд┐ рддреЛрдЯреЗ рдХрд╛рдп рдЖрд╣реЗрдд рдЖрдгрд┐ рд╢реЗрд╡рдЯреА, seccomp рдкреНрд░реЛрдЧреНрд░рд╛рдорджреНрд╡рд╛рд░реЗ рдХрд╕рд╛ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ рддреЗ рдкрд╛рд╣реВрдпрд╛ strace
.
seccomp рд╕рд╛рдареА рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдгреЗ рдЖрдгрд┐ рд▓реЛрдб рдХрд░рдгреЗ
BPF рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдкреНрд░рдердо seccomp рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╛рд╣реВ. рддреБрдореНрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрддрд░рд╛рд╡рд░ рдлрд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╕рд░реНрд╡ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдмрдВрдзрд╛рдВрдЪрд╛ рд╡рд╛рд░рд╕рд╛ рдШреЗрддреАрд▓. рд╣реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ seccomp(2)
seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)
рдЬреЗрдереЗ &filter
- рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рдВрд░рдЪрдиреЗрдЪреЗ рд╕реВрдЪрдХ рдЖрд╣реЗ struct sock_fprog
, рдореНрд╣рдгрдЬреЗ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо.
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
рд▓рд┐рдирдХреНрд╕рд╡рд░реАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреНрдпрд╛ рд╡рд░реНрддрдирд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдПрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╕рд╛рдзрди рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдЕрдиреЗрдХрд╛рдВрдиреА рдпрд╛рдмрджреНрджрд▓ рдРрдХрд▓реЗ рдЖрд╣реЗ 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
. рдЬреНрдпрд╛рдиреЗ рд╣реЗ рдЖрддрд╛рдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд▓реЗ рдЖрд╣реЗ рддреНрдпрд╛рдВрдиреА рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рддрддреНрддреНрд╡рд╛рдмрджреНрджрд▓ рдЖрдзреАрдЪ рд╕реНрдкрд╖реНрдЯ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ: iptables рдирд┐рдпрдо рдореНрд╣рдгреВрди BPF bytecode рдЪрд╛рд▓рд╡рд╛. рддреБрдореНрд╣реА рдПрдХ рдирд╡реАрди рдирд┐рдпрдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпрд╛рдкреНрд░рдорд╛рдгреЗ:
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 рдкреЕрдХреЗрдЯреНрд╕ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдд рдЖрд╣реЛрдд. рдореЙрдбреНрдпреВрд▓рдордзреАрд▓ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд╕рд╛рдареА рд╕рдВрджрд░реНрдн xt_bpf
, рдЕрд░реНрдерд╛рддрдЪ, рдкреЕрдХреЗрдЯ рдбреЗрдЯрд╛рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░рддреЗ, iptables рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, IPv4 рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕. рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреВрди рдкрд░рддрд╛рд╡рд╛ рдореВрд▓реНрдп false
рдореНрд╣рдгрдЬреЗ рдкреЕрдХреЗрдЯ рдЬреБрд│рдд рдирд╛рд╣реА.
рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рдореЙрдбреНрдпреВрд▓ xt_bpf
рд╡рд░реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдлрд┐рд▓реНрдЯрд░рдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ. рдХреНрд▓рд╛рдЙрдбрдлреЗрдЕрд░рдордзреАрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ. рдЕрд▓реАрдХрдбреЗ рдкрд░реНрдпрдВрдд рддреНрдпрд╛рдВрдиреА рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░рд▓реЗ xt_bpf
DDoS рд╣рд▓реНрд▓реНрдпрд╛рдВрдкрд╛рд╕реВрди рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рд▓реЗрдЦрд╛рдд bpfgen
рддреБрдореНрд╣реА рдирд╛рд╡рд╛рд╕рд╛рдареА DNS рдХреНрд╡реЗрд░реАрд╢реА рдЬреБрд│рдгрд╛рд░рд╛ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ habr.com
:
$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax
lb_0:
ld [x + 0]
jneq #0x04686162, lb_1
ld [x + 4]
jneq #0x7203636f, lb_1
ldh [x + 8]
jneq #0x6d00, lb_1
ret #65535
lb_1:
ret #0
рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрдкрдг рдкреНрд░рдердо рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рд▓реЛрдб рдХрд░рддреЛ X
рдУрд│реАрдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд x04habrx03comx00
UDP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрдгрд┐ рдирдВрддрд░ рд╡рд┐рдирдВрддреА рддрдкрд╛рд╕рд╛: 0x04686162 <-> "x04hab"
рдЖрдгрд┐ рдпрд╛рдкреНрд░рдорд╛рдгреЗ.
рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ, рдХреНрд▓рд╛рдЙрдбрдлреЗрдЕрд░рдиреЗ p0f -> BPF рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓рд╛. рд▓реЗрдЦрд╛рдд
$ ./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,
...
рд╕рдзреНрдпрд╛ рдХреНрд▓рд╛рдЙрдбрдлреЗрдЕрд░ рд╡рд╛рдкрд░рдд рдирд╛рд╣реА xt_bpf
, рддреЗ XDP рд╡рд░ рдЧреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ - BPF рдЪреА рдирд╡реАрди рдЖрд╡реГрддреНрддреА рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд░реНрдпрд╛рдпрд╛рдВрдкреИрдХреА рдПрдХ, рдкрд╣рд╛.
cls_bpf
рдХрд░реНрдирд▓рдордзреНрдпреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рд╢реЗрд╡рдЯрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдЖрд╣реЗ cls_bpf
рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рд╡рд╛рд╣рддреВрдХ рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдкреНрд░рдгрд╛рд▓реАрд╕рд╛рдареА, 2013 рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ рд╕рдВрдХрд▓реНрдкрдирд╛рддреНрдордХрдкрдгреЗ рдкреНрд░рд╛рдЪреАрди cls_u32
.
рддрдерд╛рдкрд┐, рдЖрдореНрд╣реА рдЖрддрд╛ рдХрд╛рдорд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░ рдирд╛рд╣реА cls_bpf
, рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдмрджреНрджрд▓ рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реАрд╣реА рджреЗрдгрд╛рд░ рдирд╛рд╣реА - рдЖрдореНрд╣реА рдЖрдзреАрдЪ рд╕рд░реНрд╡ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╢реА рдкрд░рд┐рдЪрд┐рдд рдЭрд╛рд▓реЛ рдЖрд╣реЛрдд. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд BPF рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рдпрд╛ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддреНрдпрд╛рд▓рд╛ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│рд╛ рднреЗрдЯреВ.
рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рди рдмреЛрд▓рдгреНрдпрд╛рдЪреЗ рдЖрдгрдЦреА рдПрдХ рдХрд╛рд░рдг c cls_bpf
рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рд▓рд╛рдЧреВ рд╣реЛрдгреНрдпрд╛рдЪрд╛ рд╡реНрдпрд╛рдкреНрддреА рдкреВрд░реНрдгрдкрдгреЗ рд╕рдВрдХреБрдЪрд┐рдд рдЖрд╣реЗ: рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреЕрдХреЗрдЬрдордзреАрд▓ рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рдХреЙрд▓ рджрд░рдореНрдпрд╛рди рд╕реНрдерд┐рддреА рд╡рд╛рдЪрд╡реВ рд╢рдХрдд рдирд╛рд╣реАрдд.
рддреНрдпрд╛рдореБрд│реЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд▓рд╛ рдирд┐рд░реЛрдк рдШреЗрдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдХрдбреЗ рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ.
рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд▓рд╛ рдирд┐рд░реЛрдк
рдирд╡реНрд╡рджрдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╡рд┐рдХрд╕рд┐рдд рдЭрд╛рд▓реЗрд▓реЗ рдмреАрдкреАрдПрдл рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдПрдХ рдЪрддреБрд░реНрдерд╛рдВрд╢ рд╢рддрдХ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдХрд╕реЗ рдЬрдЧрд▓реЗ рдЖрдгрд┐ рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд рдирд╡реАрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕реЗ рд╕рд╛рдкрдбрд▓реЗ рддреЗ рдЖрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗ. рддрдерд╛рдкрд┐, рд╕реНрдЯреЕрдХ рдорд╢реАрдиреНрд╕рдкрд╛рд╕реВрди RISC рдордзреАрд▓ рд╕рдВрдХреНрд░рдордгрд╛рдкреНрд░рдорд╛рдгреЗрдЪ, рдЬреНрдпрд╛рдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рд╕рд╛рдареА рдкреНрд░реЗрд░рдгрд╛ рдореНрд╣рдгреВрди рдХрд╛рдо рдХреЗрд▓реЗ, 32 рдЪреНрдпрд╛ рджрд╢рдХрд╛рдд 64-рдмрд┐рдЯ рдордзреВрди XNUMX-рдмрд┐рдЯ рдорд╢реАрдирдордзреНрдпреЗ рд╕рдВрдХреНрд░рдордг рдЭрд╛рд▓реЗ рдЖрдгрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдК рд▓рд╛рдЧрд▓реЗ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЪреНрдпрд╛ рдХреНрд╖рдорддрд╛ рдЦреВрдк рдорд░реНрдпрд╛рджрд┐рдд рдЖрд╣реЗрдд, рдЖрдгрд┐ рдХрд╛рд▓рдмрд╛рд╣реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд - рдЖрдордЪреНрдпрд╛рдХрдбреЗ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рд╡рд░ рдХреЙрд▓ рджрд░рдореНрдпрд╛рди рд╕реНрдерд┐рддреА рдЬрддрди рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдирд╛рд╣реА, рдереЗрдЯ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА, рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рдЪреА рдХреЛрдгрддреАрд╣реА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА. рдХрд░реНрдирд▓рд╕рд╣, рдорд░реНрдпрд╛рджрд┐рдд рд╕рдВрдЦреНрдпреЗрдЪреНрдпрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлреАрд▓реНрдб рд╡рд╛рдЪрдгреНрдпрд╛рд╢рд┐рд╡рд╛рдп sk_buff
рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреА рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рдиреНрд╕ рд▓рд╛рдБрдЪ рдХреЗрд▓реНрдпрд╛рдиреЗ, рддреБрдореНрд╣реА рдкреЕрдХреЗрдЯреНрд╕рдЪреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА.
рдЦрд░реЗрддрд░, рд╕рдзреНрдпрд╛ рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрдЪреЗ рдЬреЗ рдХрд╛рд╣реА рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ рддреЗ рдПрдкреАрдЖрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрд╣реЗ, рдЖрдгрд┐ рдХрд░реНрдирд▓рдЪреНрдпрд╛ рдЖрдд рд╕рд░реНрд╡ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕, рдордЧ рддреЗ рд╕реЙрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░реНрд╕ рдХрд┐рдВрд╡рд╛ рд╕реЗрдХрдХреЙрдореНрдк рдлрд┐рд▓реНрдЯрд░реНрд╕ рдЕрд╕реЛрдд, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдпрд╛ рдирд╡реАрди рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. (рд╣реЗ рдиреЗрдордХреЗ рдХрд╕реЗ рдШрдбрддреЗ рдпрд╛рдмрджреНрджрд▓ рдЖрдкрдг рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдд рдмреЛрд▓реВ.)
рдирд╡реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдордзреНрдпреЗ рд╕рдВрдХреНрд░рдордг 2013 рдордзреНрдпреЗ рд╕реБрд░реВ рдЭрд╛рд▓реЗ, рдЬреЗрд╡реНрд╣рд╛ рдЕреЕрд▓реЗрдХреНрд╕реА рд╕реНрдЯрд╛рд░реЛрд╡реЛрдЗрдЯреЛрд╡реНрд╣рдиреЗ рдмреАрдкреАрдПрдл рдЕрджреНрдпрддрди рдпреЛрдЬрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗрд▓реА. 2014 рдордзреНрдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреЕрдЪ
рдпрд╛ рдорд╛рд▓рд┐рдХреЗрддреАрд▓ рдкреБрдвреАрд▓ рд▓реЗрдЦ рдирд╡реАрди рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рддреАрд▓, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЕрдВрддрд░реНрдЧрдд BPF, рдирдВрддрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд BPF рдЖрдгрд┐ рдЖрддрд╛ рдлрдХреНрдд BPF рдореНрд╣рдгреВрди рдУрд│рдЦрд▓реЗ рдЬрд╛рддреЗ.
рд╕рдВрджрд░реНрдн
- рд╕реНрдЯреАрд╡реНрд╣рди рдореЕрдХрдХреЗрди рдЖрдгрд┐ рд╡реНрд╣реЕрди рдЬреЗрдХрдмрд╕рди, "рдж рдмреАрдПрд╕рдбреА рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░: рдП рдиреНрдпреВ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдлреЙрд░ рдпреБрдЬрд░-рд▓реЗрд╡реНрд╣рд▓ рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░",
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
- рдПрдХ seccomp рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди:
https://lwn.net/Articles/656307/
https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
habr: рдХрдВрдЯреЗрдирд░ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд╛: seccomp habr: systemd рд╕рд╣ рдбрд┐рдорди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ "рдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА!" - рдкреЙрд▓ рдЪреИрдЧрдиреЙрди, "strace --seccomp-bpf: рдЕ рд▓реБрдХ рдЕрдВрдбрд░ рдж рд╣реБрдб",
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
netsniff-ng
:http://netsniff-ng.org/
рд╕реНрддреНрд░реЛрдд: www.habr.com