рдЫреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл, рднрд╛рдЧ рд╢реВрдиреНрдп: рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл

рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ (рдмреАрдкреАрдПрдл) рдПрдХ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рддрдХрдиреАрдХреА рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдкрдиреНрдиреЗ рдкрд░ рд╣реИред рд╕рдореНрдореЗрд▓рди рдмреАрдкреАрдПрдл рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рд╕реЗ рднрд░реЗ рд░рд╣рддреЗ рд╣реИрдВред рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВрдЯреЗрдирд░ рдбреЗрд╡рд┐рдб рдорд┐рд▓рд░ рдиреЗ рд▓рд┐рдирдХреНрд╕ рдкреНрд▓рдВрдмрд░ 2018 рдореЗрдВ рдЕрдкрдиреА рдмрд╛рдд рдХрд╣реА "рдпрд╣ рдмрд╛рддрдЪреАрдд XDP рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ" (рдПрдХреНрд╕рдбреАрдкреА рдмреАрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ)ред рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ рд╣рдХрджрд╛рд░ рд╡рд╛рд░реНрддрд╛ рджреЗрддреЗ рд╣реИрдВ рд▓рд┐рдирдХреНрд╕ рдмреАрдкреАрдПрдл рд╕реБрдкрд░рдкрд╛рд╡рд░. рдЯреЛрдХреЗ рд╣реЛрдЗрд▓реИрдВрдб-рдЬреЛрд░реНрдЧреЗрдирд╕реЗрди рд╣рдВрд╕рддреЗ рд╣реБрдПрдХрд┐ рдХрд░реНрдиреЗрд▓ рдЕрдм рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдХрд░реНрдиреЗрд▓ рд╣реИред рдереЙрдорд╕ рдЧреНрд░рд╛рдл рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рд╣реИрдВ рдмреАрдкреАрдПрдл рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ.

рд╣реИрдмреЗ рдкрд░ рдЕрднреА рднреА рдмреАрдкреАрдПрдл рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдореИрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ, рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдпрд╣ рд▓реЗрдЦ, рд╢реВрдиреНрдп, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред tcpdump, seccomp, strace, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред

рдмреАрдкреАрдПрдл рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмреАрдкреАрдПрдл рдХреЗ рдореБрдЦреНрдп рдореМрдЬреВрджрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд╛рде @рдпреВрдХреЗрд░рд┐рдпреЛрдЯ, рдореИрдВрдиреЗ рдорд╣рд╛рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рдореНрдорд╛рди рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд╛рдо "рдЫреЛрдЯреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл" рд░рдЦрд╛ "рдЫреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ".

рдмреАрдкреАрдПрдл рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд╛рдареНрдпрдХреНрд░рдо(c)

рдЖрдзреБрдирд┐рдХ рдмреАрдкреАрдПрдл рддрдХрдиреАрдХ рдЗрд╕реА рдирд╛рдо рд╕реЗ рдкреБрд░рд╛рдиреА рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдЙрдиреНрдирдд рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдм рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдИ рдЧрдИ рдереА tcpdump, рддрдВрддреНрд░ seccomp, рд╕рд╛рде рд╣реА рдХрдо рдЬреНрдЮрд╛рдд рдореЙрдбреНрдпреВрд▓ рднреА xt_bpf рдХреЗ рд▓рд┐рдП iptables рдФрд░ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ cls_bpf. рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирдП рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдкреАрдЖрдИ рдпрдерд╛рд╡рдд рдмрдиреА рд╣реБрдИ рд╣реИ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдпреЛрдЧ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдЕрднреА рднреА рдкрд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ, рдореИрдВрдиреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдкрд┐рдЫрд▓реА рд╕рджреА рдХреЗ рдЕрд╕реНрд╕реА рдХреЗ рджрд╢рдХ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдкреНрд░рд╕рд┐рджреНрдз рд▓реЙрд░реЗрдВрд╕ рдмрд░реНрдХрд▓реЗ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИ рдХрд┐ рдкрд┐рдЫрд▓реА рд╕рджреА рдХреЗ рдЕрд╕реНрд╕реА рдХреЗ рджрд╢рдХ рдХреЗ рдЖрдзреБрдирд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░, рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реАрдПрд╕рдкреАрдПрдл (рд╕реАрдПрдордпреВ/рд╕реНрдЯреИрдирдлреЛрд░реНрдб рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░) рддрдХрдиреАрдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдерд╛, рдЕрд░реНрдерд╛рддред рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡рд╛рд▓реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореМрдЬреВрджрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рдорд╢реАрдиреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдереАрдВ рдФрд░ рдирдИ рдЖрд░рдЖрдИрдПрд╕рд╕реА рдорд╢реАрдиреЛрдВ рдкрд░ рдЙрддрдиреА рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдирд╣реАрдВ рдЪрд▓рддреА рдереАрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрд░реНрдХрд▓реЗ рд▓реИрдмреНрд╕ рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ, рдПрдХ рдирдИ рдмреАрдкреАрдПрдл (рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░) рддрдХрдиреАрдХ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЛрдЯреЛрд░реЛрд▓рд╛ 6502 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЬреИрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рд╡рд░реНрдХрд╣реЙрд░реНрд╕ рдРрдкреНрдкрд▓ II рдпрд╛ NES. рдирдИ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдиреЗ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджрд╕ рдЧреБрдирд╛ рдмрдврд╝рд╛ рджрд┐рдпрд╛ред

рдмреАрдкреАрдПрдл рдорд╢реАрди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рд╣рдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП рдХрд╛рдордХрд╛рдЬреА рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдорд╢реАрди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ 32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░, рдПрдХ рд╕рдВрдЪрд╛рдпрдХ рдЙрдкрд▓рдмреНрдз рдереЗ A рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рд░рдЬрд┐рд╕реНрдЯрд░ X, 64 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдореЛрд░реА (16 рд╢рдмреНрдж), рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз, рдФрд░ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреА рдПрдХ рдЫреЛрдЯреА рдкреНрд░рдгрд╛рд▓реАред рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдк рдирд┐рд░реНрджреЗрд╢ рднреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдереЗ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдордп рдкрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП, рдЬрдВрдк рдХреЗрд╡рд▓ рдЖрдЧреЗ рдХреА рдУрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдпрд╛рдиреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд▓реВрдк рдмрдирд╛рдиреЗ рд╕реЗ рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдорд╢реАрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреАрдкреАрдПрдл рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рдХрд░реНрдиреЗрд▓ рддрдВрддреНрд░ (рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓), рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реЛрдб рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрд╡реЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдкрд░ рдЕрдЧрд▓реЗ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдЧрдорди рд╣реИ)ред рдЬрдм рдХреЛрдИ рдШрдЯрдирд╛ рдШрдЯрддреА рд╣реИ, рддреЛ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ), рдФрд░ рдорд╢реАрди рдореЗрдореЛрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдХрд╛ рдбреЗрдЯрд╛)ред

рдЙрдкрд░реЛрдХреНрдд рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛: рд╣рдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдХрдорд╛рдВрдб рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рддреБрд░рдВрдд рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреА рд╕рднреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореВрд▓ рд▓реЗрдЦ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдмреАрдПрд╕рдбреА рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░/рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг/рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ/рдлрд╝рд┐рд▓реНрдЯрд░.txt рдХрд░реНрдиреЗрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ libpcap: рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдкрджреНрдзрддрд┐, рдЬрд┐рд╕рдореЗрдВ рдмреАрдкреАрдПрдл рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдореИрдХрдХреИрди, рд╕реГрдЬрди рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ libpcap.

рдЕрдм рд╣рдо Linux рдкрд░ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ: tcpdump (libpcap), рд╕реЗрдХрдореНрдк, xt_bpf, cls_bpf.

рдЯреАрд╕реАрдкреАрдбрдореНрдк

рдмреАрдкреАрдПрдл рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреЛрдЧрд┐рддрд╛ tcpdump. рдФрд░, рдЪреВрдВрдХрд┐ рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рдФрд░ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдХрдИ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рдЕрдкрдирд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред

(рдореИрдВрдиреЗ рдЗрд╕ рдЖрд▓реЗрдЦ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЪрд▓рд╛рдП 5.6.0-rc6. рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред)

рдЙрджрд╛рд╣рд░рдг: IPv6 рдкреИрдХреЗрдЯ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рдирд╛

рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕рднреА IPv6 рдкреИрдХреЗрдЯ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ eth0. рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ tcpdump рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде ip6:

$ sudo tcpdump -i eth0 ip6

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, tcpdump рдлрд╝рд┐рд▓реНрдЯрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ ip6 рдмреАрдкреАрдПрдл рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрд░реНрдиреЗрд▓ рдкрд░ рднреЗрдЬреЗрдВ (рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВ)ред рдЯреАрд╕реАрдкреАрдбрдореНрдк: рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ). рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ eth0. рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ n, рдлрд┐рд░ рддрдХ n рдкреИрдХреЗрдЯ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ tcpdump.

рдЫреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл, рднрд╛рдЧ рд╢реВрдиреНрдп: рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл

рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреМрди рд╕рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ tcpdump рдХреА рдорджрдж рд╕реЗ tcpdump, рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддреЗ рд╣реИрдВ -d:

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

рд▓рд╛рдЗрди рдЬреАрд░реЛ рдкрд░ рд╣рдо рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ ldh [12], рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ"ред A рдЖрдзрд╛ рд╢рдмреНрдж (16 рдмрд┐рдЯреНрд╕) рдкрддрд╛ 12тАЭ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ x рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (x+1)рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХрд╛ рд╡рд╛рдВ рдмрд╛рдЗрдЯред рд╣рдо рдИрдерд░рдиреЗрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреИрдХреЗрдЯ рдкрдврд╝рддреЗ рд╣реИрдВ eth0рдФрд░ рдпрд╣ рд╕рд╛рдзрдирдкреИрдХреЗрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреИрдХреЗрдЯ рдореЗрдВ рдХреЛрдИ рд╡реАрдПрд▓рдПрдПрди рдЯреИрдЧ рдирд╣реАрдВ рд╣реИрдВ):

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

рддреЛ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж ldh [12] рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ A рд╡рд╣рд╛рдБ рдПрдХ рдореИрджрд╛рди рд╣реЛрдЧрд╛ Ether Type - рдЗрд╕ рдИрдерд░рдиреЗрдЯ рдлреНрд░реЗрдо рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдкреИрдХреЗрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ред рдкрдВрдХреНрддрд┐ 1 рдкрд░ рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ A (рдкреИрдХреЗрдЬ рдкреНрд░рдХрд╛рд░) рд╕реА 0x86ddрдФрд░ рдпрд╣ рдФрд░ рд╡рд╣рд╛рдБ рд╣реИ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рд╡рд╣ IPv6 рд╣реИред рд▓рд╛рдЗрди 1 рдкрд░, рддреБрд▓рдирд╛ рдХрдорд╛рдВрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛ рдФрд░ рдХреЙрд▓рдо рд╣реИрдВ - jt 2 ╨╕ jf 3 - рддреБрд▓рдирд╛ рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдЬрд┐рди рдЕрдВрдХреЛрдВ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (A == 0x86dd) рдФрд░ рдЕрд╕рдлрд▓. рддреЛ, рдПрдХ рд╕рдлрд▓ рдорд╛рдорд▓реЗ (рдЖрдИрдкреАрд╡реА 6) рдореЗрдВ рд╣рдо рд▓рд╛рдЗрди 2 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдЕрд╕рдлрд▓ рдорд╛рдорд▓реЗ рдореЗрдВ - рд▓рд╛рдЗрди 3 рдкрд░ред рд▓рд╛рдЗрди 3 рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб 0 рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ (рдкреИрдХреЗрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рди рдмрдирд╛рдПрдВ), рд▓рд╛рдЗрди 2 рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ 262144 (рдЕрдзрд┐рдХрддрдо 256 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдкреИрдХреЗрдЬ рдореБрдЭреЗ рдХреЙрдкреА рдХрд░реЗрдВ)ред

рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг: рд╣рдо рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ рджреНрд╡рд╛рд░рд╛ рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ 666 рдХреЗ рд╕рд╛рде рд╕рднреА рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЖрдИрдкреАрд╡реА4 рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдИрдкреАрд╡реА6 рдорд╛рдорд▓рд╛ рд╕рд░рд▓ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рдпрдВ 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 рдкрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рдВрдЪ рдХрд░ рд▓реА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЖрдИрдкреАрд╡реА4 рдкреИрдХреЗрдЯ рд╣реИ (рдИрдерд░ рдкреНрд░рдХрд╛рд░ = 0x800) рдФрд░ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ A рдкреИрдХреЗрдЯ рдХреА 24рд╡реАрдВ рдмрд╛рдЗрдЯ. рд╣рдорд╛рд░рд╛ рдкреИрдХреЗрдЬ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

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

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ A рдЖрдИрдкреА тАЛтАЛтАЛтАЛрд╣реЗрдбрд░ рдХрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдлрд╝реАрд▓реНрдб, рдЬреЛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ 0x6 (IPPROTO_TCP) рд▓рд╛рдЗрди 3 рдкрд░ред

рдкрдВрдХреНрддрд┐ 4 рдФрд░ 5 рдкрд░ рд╣рдо рдкрддреЗ 20 рдкрд░ рд╕реНрдерд┐рдд рдЖрдзреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ jset рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЭрдВрдбреЗ - рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рд╕реНрдХ рдкрд╣рдирдирд╛ jset рддреАрди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд╕рд╛рдлрд╝ рд╣реЛ рдЧрдП рд╣реИрдВред рддреАрди рдореЗрдВ рд╕реЗ рджреЛ рдмрд┐рдЯреНрд╕ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдкреИрдХреЗрдЯ рдЦрдВрдбрд┐рдд рдЖрдИрдкреА рдкреИрдХреЗрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рдЯреБрдХрдбрд╝рд╛ рд╣реИред рддреАрд╕рд░рд╛ рдмрд┐рдЯ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЕрдзреВрд░реЗ рдпрд╛ рдЯреВрдЯреЗ рд╣реБрдП рдкреИрдХреЗрдЯреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреАрдиреЛрдВ рдмрд┐рдЯреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдкрдВрдХреНрддрд┐ 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)). рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдмреЛрдзрди рдпреЛрдЬрдирд╛ рдмреАрдкреАрдПрдл рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рдЬреЛрдбрд╝реА рдЧрдИ рдереА X (рд╕реВрдЪрдХрд╛рдВрдХ рд░рдЬрд┐рд╕реНрдЯрд░) рдЖрдИрдкреАрд╡реА4 рд╣реЗрдбрд░ рд▓рдВрдмрд╛рдИред

рддреЛ рдкрдВрдХреНрддрд┐ 7 рдкрд░ рд╣рдо рдЖрдзрд╛ рд╢рдмреНрдж рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ (X+16). рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдИрдерд░рдиреЗрдЯ рд╣реЗрдбрд░ 14 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ X рдЗрд╕рдореЗрдВ IPv4 рд╣реЗрдбрд░ рдХреА рд▓рдВрдмрд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╣рдо рдЗрд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ A рдЯреАрд╕реАрдкреА рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдЕрдВрдд рдореЗрдВ, рд▓рд╛рдЗрди 8 рдкрд░ рд╣рдо рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ рдХреА рддреБрд▓рдирд╛ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рд╛рдЗрди 9 рдпрд╛ 10 рдкрд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ - рдкреИрдХреЗрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЯреАрд╕реАрдкреАрдбрдореНрдк: рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рд╣рдо рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреИрд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, 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 рдЗрд╕рдореЗрдВ рдЪрд╛рд░ рдмреАрдкреАрдПрдл рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдФрд░ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ 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 (рд╕рднреА рдкреИрдХреЗрдЯ рдбреНрд░реЙрдк рдХрд░реЗрдВ), рд╕реЙрдХреЗрдЯ рдХреЛ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рд╕рднреА рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдШрдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП struct sock_fprog рдФрд░ рдПрдХ рдЦреБрд▓рд╛ рд╕реЙрдХреЗрдЯ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЙрдХреЗрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ setsockopt.

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдлрд┐рд▓реНрдЯрд░ рдХреЛ рд╕рд┐рд░реНрдл рдХрдЪреНрдЪрд╛ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рд╕реЙрдХреЗрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдпреВрдбреАрдкреА рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИред (рдореИрдВрдиреЗ рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реАрдВ рддрд╛рдХрд┐ рд▓реЗрдЦ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рди рд╣реЛред)

рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА setsockopt рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рд╕реЙрдХреЗрдЯ(7), рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ struct sock_fprog рдмрд┐рдирд╛ рдорджрдж рдХреЗ tcpdump рд╣рдо рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ.

рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдФрд░ XNUMXрд╡реАрдВ рд╕рджреА

рдмреАрдкреАрдПрдл рдХреЛ 1997 рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╡рд░реНрдХрд╣реЙрд░реНрд╕ рдмрдирд╛ рд░рд╣рд╛ libpcap рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ (рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рд▓рд┐рдирдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди, рдереЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рдмрджрд▓реА)ред рдмреАрдкреАрдПрдл рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдЧрдВрднреАрд░ рд╕рдВрдХреЗрдд 2011 рдореЗрдВ рдЖрдпрд╛, рдЬрдм рдПрд░рд┐рдХ рдбреБрдорд╛рдЬрд╝реЗрдЯ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдкреИрдЪ, рдЬреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЬрд╕реНрдЯ рдЗрди рдЯрд╛рдЗрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ - рдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдореВрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ x86_64 рдХреЛрдб.

JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдерд╛: 2012 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗрдХрдВрдб, рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрдирд╡рд░реА 2013 рдореЗрдВ рд╡рд╣рд╛рдБ рдерд╛ рдЬреЛрдбрд╝рд╛ рдореЙрдбреНрдпреВрд▓ xt_bpf, рдЬреЛ рдЖрдкрдХреЛ рдирд┐рдпрдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ iptables рдмреАрдкреАрдПрдл рдХреА рдорджрдж рд╕реЗ, рдФрд░ рдЕрдХреНрдЯреВрдмрд░ 2013 рдореЗрдВ рдерд╛ рдЬреЛрдбрд╝рд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рднреА cls_bpf, рдЬреЛ рдЖрдкрдХреЛ BPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рдо рдЬрд▓реНрдж рд╣реА рдЗрди рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реАрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рдмреАрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреНрд╖рдорддрд╛рдПрдВ libpcap рд╕реАрдорд┐рдд (рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг: рдлрд╝рд┐рд▓реНрдЯрд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ libpcap рдХреЗрд╡рд▓ рджреЛ рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ - 0 рдпрд╛ 0x40000) рдпрд╛ рдЖрдо рддреМрд░ рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ seccomp рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдЖрдЗрдП рдмреАрдкреАрдПрдл рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

   16    8    8     32
| code | jt | jf |  k  |

рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ 64 рдмрд┐рдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ 16 рдмрд┐рдЯреНрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рдлрд┐рд░ рджреЛ рдЖрда-рдмрд┐рдЯ рдЗрдВрдбреЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВ, jt ╨╕ jf, рдФрд░ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП 32 рдмрд┐рдЯреНрд╕ K, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдорд╛рдВрдб рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрджреЗрд╢ ret, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ 6, рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ K. рд╕реА рдореЗрдВ, рдПрдХ рдПрдХрд▓ рдмреАрдкреАрдПрдл рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

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 рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЖрдк рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реЗрдВрдмрд▓рд░ рдФрд░ рдбрд┐рдмрдЧрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдбрд┐рдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ 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>,..., рдЯреАрд╕реАрдкреА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реЛрдЧрд╛

$ 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, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдЦрдВрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред

рд▓рд┐рдирдХреНрд╕ рдФрд░ рдиреЗрдЯрд╕реНрдирд┐рдл-рдПрдирдЬреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди

рдорд╛рдирдХ рдмреАрдкреАрдПрдл рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдирдХреНрд╕ рдФрд░ tools/bpf/bpf_asm рд╕рдорд░реНрдерди рдФрд░ рдЧреИрд░ рдорд╛рдирдХ рд╕реЗрдЯ. рдореВрд▓ рд░реВрдк рд╕реЗ, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ struct sk_buff, рдЬреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрджреЗрд╢ рднреА рд╣реИрдВ ldw cpu рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рд╣реЛрдЧрд╛ A рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо raw_smp_processor_id(). (рдмреАрдкреАрдПрдл рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрди рдЧреИрд░-рдорд╛рдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдореЗрдореЛрд░реА, рд╕рдВрд░рдЪрдирд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред) рдпрд╣рд╛рдВ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдкреИрдХреЗрдЯ рд╣реЗрдбрд░ poff, рдкреЗрд▓реЛрдб рдСрдлрд╕реЗрдЯ:

ld poff
ret a

BPF рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ tcpdump, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреИрдХреЗрдЬ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ netsniff-ng, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЙрдиреНрдирдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢рд╛рдорд┐рд▓ рд╣реИ netsniff-ng, рдЬрд┐рд╕рдореЗрдВ рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкреНрд░рднрд╛рд╡реА рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬрдирд░реЗрдЯрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╣реИ tools/bpf/bpf_asm, рдПрдХ рдмреАрдкреАрдПрдл рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ bpfc. рдкреИрдХреЗрдЬ рдореЗрдВ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рднреА рджреЗрдЦреЗрдВред

рд╕реЗрдХрдВрдб

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдордирдорд╛рдиреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдФрд░ рдирдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ seccomp рддрдХрдиреАрдХ рд╣реИ, рдЬреЛ рдмреАрдкреАрдПрдл рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрдкрд▓рдмреНрдз рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рддрд░реНрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рдФрд░ рд╕реЗрдЯ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рджреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЙрд╕рдХреЗ рд╡рдВрд╢рдЬред

seccomp рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг 2005 рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рдерд╛ - рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд╕реЗрдЯ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛: read, write, exit ╨╕ sigreturn, рдФрд░ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕реЗ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ SIGKILL. рд╣рд╛рд▓рд╛рдБрдХрд┐, 2012 рдореЗрдВ, seccomp рдиреЗ BPF рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реА, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЕрдиреБрдордд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛, рдФрд░ рдХреНрд░реЛрдо рд▓реЛрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмреАрдкреАрдПрдл рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХреЗрдЖрд░рдПрд╕рдЖрдИ рддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдирдХреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣реЗ рд╣реИрдВред) рдЕрддрд┐рд░рд┐рдХреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдВрдХ рдЕрдВрдд рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдЦ рдХрд╛.

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдм рдкрд░ seccomp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдореМрдЬреВрдж рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдЦрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп) рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рд▓реЗрдЦ рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛: seccomp 2007 рд╕рдВрд╕реНрдХрд░рдг рдФрд░ BPF (рдлрд╝рд┐рд▓реНрдЯрд░ libseccomp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рджреЛрдиреЛрдВ рдореЗрдВ seccomp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, Docker рдХреЗ рд╕рд╛рде seccomp рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдордбреА рдХреЗ рд╕рд╛рде рдбреЗрдореЙрди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдпрд╛ "рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЙрдХрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!" рдЗрд╕рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рд┐рд╕реНрдЯрдордбреА рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдореЙрди рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рдпрд╛ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЖрдЧреЗ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдФрд░ рд▓реЛрдб рдХрд░реЗрдВ seccomp рдирдВрдЧреЗ C рдореЗрдВ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ 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() рдЧреБрдард▓реА. (рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдореВрд▓ рдХрдорд┐рдЯ рдореЗрдВ рдЬрд┐рд╕рдиреЗ seccomp рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реА рдереА, рд╡реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдП 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

рдореВрд▓ рдХреЛрдб рдпрд╛ рдмреАрдкреАрдПрдл рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдХрднреА-рдХрднреА рдкреЛрд░реНрдЯреЗрдмрд▓ рдФрд░/рдпрд╛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдЧрд╛ 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 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рдЖрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рдбрд╛рдпрд▓ рдХрд░рдХреЗ рдмреАрдкреАрдПрдл рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

$ 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

рдЖрдк рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рддреЗрдЬреА рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдЬрдВрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, jmp A рдпрд╛ jmp [label+X]) рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рднреА рд╕рдВрдХреНрд░рдордг рд╕реНрдерд┐рд░ рд╣реИрдВред

рд╕реЗрдХреЙрдореНрдк рдФрд░ рд╕реНрдЯреНрд░реЗрд╕

рдЙрдкрдпреЛрдЧрд┐рддрд╛ рддреЛ рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ 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 рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╣рд╛рд▓ рд╣реА рдХреА рд░рд┐рдкреЛрд░реНрдЯ. рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ seccomp рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЖрдЬ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдЖрдИрдкреА рд╣реЗрдбрд░ рдХреЗ 6 рдмрд┐рдЯреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрди рдкрд░ рдПрдХ рдорд╛рд╕реНрдХ рд▓рдЧрд╛рддрд╛ рд╣реИ 0xFF (рдзреАрдореА рдмрд╛рдЗрдЯ рд▓реЗрдВ)ред рдпрд╣ рдХреНрд╖реЗрддреНрд░ protocol рдЖрдИрдкреА тАЛтАЛрд╣реЗрдбрд░ рдФрд░ рд╣рдо рдЗрд╕рдХреА рддреБрд▓рдирд╛ 1 (рдЖрдИрд╕реАрдПрдордкреА) рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдХрдИ рдЪреЗрдХ рдХреЛ рдПрдХ рдирд┐рдпрдо рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдСрдкрд░реЗрдЯрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ @ - рдПрдХреНрд╕ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдо

iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"

рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯреАрд╕реАрдкреА рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ 0x29. рдореИрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдРрд╕реЗ рдирд┐рдпрдореЛрдВ рдХреЛ рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рдмреАрдкреАрдПрдл - рднреВрд▓рд╛ рд╣реБрдЖ рдмрд╛рдЗрдЯрдХреЛрдб, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рдирд┐рдпрдо рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд▓рд┐рдВрдХ рд╣реИрдВ xt_u32. рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рднреА рджреЗрдЦреЗрдВред

2013 рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрдЬрд╛рдп рдореЙрдбреНрдпреВрд▓ xt_u32 рдЖрдк рдмреАрдкреАрдПрдл рдЖрдзрд╛рд░рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ xt_bpf. рдЬрд┐рд╕рдиреЗ рднреА рдЗрд╕реЗ рдЕрдм рддрдХ рдкрдврд╝рд╛ рд╣реИ рдЙрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдЖрдИрдкреАрдЯреЗрдмрд▓реНрд╕ рдирд┐рдпрдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рдирдпрд╛ рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рд╕рднреА рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн xt_bpfрдмреЗрд╢рдХ, рдЖрдИрдкреАрдЯреЗрдмрд▓реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдИрдкреАрд╡реА4 рд╣реЗрдбрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдмреВрд▓рд┐рдпрдирдЬрд╣рд╛рдВ false рдпрд╛рдиреА рдкреИрдХреЗрдЯ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдпрд╛.

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ xt_bpf рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдХреНрд▓рд╛рдЙрдбрдлрд╝реЗрдпрд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рд╣рд╛рд▓ рддрдХ рд╡реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗ xt_bpf DDoS рд╣рдорд▓реЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП. рд▓реЗрдЦ рдореЗрдВ рдмреАрдкреАрдПрдл рдЯреВрд▓реНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рд╡реЗ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ (рдФрд░ рдХреНрдпреЛрдВ) рд╡реЗ рдмреАрдкреАрдПрдл рдлрд╝рд┐рд▓реНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдРрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ bpfgen рдЖрдк рдПрдХ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдирд╛рдо рдХреЗ рд▓рд┐рдП DNS рдХреНрд╡реЗрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ habr.com:

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

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

lb_1:
    ret #0

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ X рд▓рд╛рдЗрди рдкрддреЗ рдХреА рд╢реБрд░реБрдЖрдд x04habrx03comx00 UDP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрджрд░ рдФрд░ рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: 0x04686162 <-> "x04hab" рдЖрджрд┐

рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж, рдХреНрд▓рд╛рдЙрдбрдлрд╝реЗрдпрд░ рдиреЗ p0f -> BPF рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдЦ рдореЗрдВ рдкреА0рдПрдл рдмреАрдкреАрдПрдл рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рд╡реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ 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,
...

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрд▓рд╛рдЙрдбрдлрд╝реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ xt_bpf, рдЪреВрдБрдХрд┐ рд╡реЗ XDP рдореЗрдВ рдЪрд▓реЗ рдЧрдП - BPF рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рджреЗрдЦреЗрдВред L4Drop: XDP DDoS рд╢рдорди.

cls_bpf

рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рд┐рдпрд░ рд╣реИ cls_bpf рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдЯреНрд░реИрдлрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, 2013 рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдЪреАрди рдХреА рдЬрдЧрд╣ рд▓реЗ рд▓реА рдЧрдИ cls_u32.

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рд╣рдо рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ cls_bpf, рдЪреВрдВрдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рд╣рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЧрд╛ - рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП рдмрд╛рдж рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдо рдЗрд╕ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рд┐рдпрд░ рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдорд┐рд▓реЗрдВрдЧреЗред

рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рд╕реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг cls_bpf рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХрд╛ рджрд╛рдпрд░рд╛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рд╣реИ: рд╢рд╛рд╕реНрддреНрд░реАрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреИрдХреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реЗрдЬ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ рдЕрдм рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдУрд░ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЛ рд╡рд┐рджрд╛рдИ

рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдирдмреНрдмреЗ рдХреЗ рджрд╢рдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдмреАрдкреАрдПрдл рддрдХрдиреАрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдЪреМрдерд╛рдИ рд╕рджреА рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реА рдФрд░ рдЕрдВрдд рддрдХ рдирдП рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╛рдП рдЧрдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдЯреИрдХ рдорд╢реАрдиреЛрдВ рд╕реЗ рдЖрд░рдЖрдИрдПрд╕рд╕реА рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рдорд╛рди, рдЬреЛ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рдерд╛, 32 рдХреЗ рджрд╢рдХ рдореЗрдВ 64-рдмрд┐рдЯ рд╕реЗ XNUMX-рдмрд┐рдЯ рдорд╢реАрдиреЛрдВ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реБрдЖ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИрдВ, рдФрд░ рдкреБрд░рд╛рдиреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╛рддрдЪреАрдд рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде, рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ sk_buff рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдХреЗ, рдЖрдк рдкреИрдХреЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╛ рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдПрдкреАрдЖрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдХреНрд▓рд╛рд╕рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдЪрд╛рд╣реЗ рд╡рд╣ рд╕реЙрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ рдпрд╛ рд╕реЗрдХрдХреЙрдореНрдк рдлрд┐рд▓реНрдЯрд░ рд╣реЛрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдирдП рдкреНрд░рд╛рд░реВрдк, рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдмреАрдкреАрдПрдл рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред (рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред)

рдПрдХ рдирдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди 2013 рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдЬрдм рдПрд▓реЗрдХреНрд╕реА рд╕реНрдЯрд╛рд░реЛрд╡реЛрдЗрдЯреЛрд╡ рдиреЗ рдмреАрдкреАрдПрдл рдЕрджреНрдпрддрди рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ред 2014 рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдЪ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрд╛ рдореВрд▓ рдореЗрдВ. рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпреЛрдЬрдирд╛ рдХреЗрд╡рд▓ 64-рдмрд┐рдЯ рдорд╢реАрдиреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдереА, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрди рдЕрдиреБрдХреВрд▓рди рдиреЗ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рдирдП рдЕрдзреНрдпрд╛рдп рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ред

рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЖрдЧреЗ рдХреЗ рд▓реЗрдЦ рдирдИ рддрдХрдиреАрдХ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╢реБрд░реВ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдмреАрдкреАрдПрдл, рдлрд┐рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдФрд░ рдЕрдм рдХреЗрд╡рд▓ рдмреАрдкреАрдПрдл рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрджрд░реНрднреЛрдВ

  1. рд╕реНрдЯреАрд╡рди рдореИрдХреНрдХреЗрди рдФрд░ рд╡реИрди рдЬреИрдХрдмрд╕рди, "рдмреАрдПрд╕рдбреА рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрддрд░реАрдп рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░", 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. рдЖрдИрдкреАрдЯреЗрдмрд▓ рдпреВ32 рдореИрдЪ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓.
  5. рдмреАрдкреАрдПрдл - рднреВрд▓рд╛ рд╣реБрдЖ рдмрд╛рдЗрдЯрдХреЛрдб: https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
  6. рдмреАрдкреАрдПрдл рдЯреВрд▓ рдХрд╛ рдкрд░рд┐рдЪрдп: 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: рд╕рд┐рд╕реНрдЯрдордбреА рдХреЗ рд╕рд╛рде рдбреЗрдореЙрди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдпрд╛ "рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЙрдХрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!"
  12. рдкреЙрд▓ рдЪреИрдЧреНрдирди, "рд╕реНрдЯреНрд░реЗрд╕--рд╕реЗрдХрдореНрдк-рдмреАрдкреАрдПрдл: рдП рд▓реБрдХ рдЕрдВрдбрд░ рдж рд╣реБрдб", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ