рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ (рдмреАрдкреАрдПрдл) рдПрдХ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рддрдХрдиреАрдХреА рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдкрдиреНрдиреЗ рдкрд░ рд╣реИред рд╕рдореНрдореЗрд▓рди рдмреАрдкреАрдПрдл рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рд╕реЗ рднрд░реЗ рд░рд╣рддреЗ рд╣реИрдВред рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВрдЯреЗрдирд░ рдбреЗрд╡рд┐рдб рдорд┐рд▓рд░ рдиреЗ рд▓рд┐рдирдХреНрд╕ рдкреНрд▓рдВрдмрд░ 2018 рдореЗрдВ рдЕрдкрдиреА рдмрд╛рдд рдХрд╣реА
рд╣реИрдмреЗ рдкрд░ рдЕрднреА рднреА рдмреАрдкреАрдПрдл рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдореИрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ, рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдпрд╣ рд▓реЗрдЦ, рд╢реВрдиреНрдп, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред tcpdump
, seccomp
, strace
, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред
рдмреАрдкреАрдПрдл рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмреАрдкреАрдПрдл рдХреЗ рдореБрдЦреНрдп рдореМрдЬреВрджрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд╛рде
рдмреАрдкреАрдПрдл рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд╛рдареНрдпрдХреНрд░рдо(c)
рдЖрдзреБрдирд┐рдХ рдмреАрдкреАрдПрдл рддрдХрдиреАрдХ рдЗрд╕реА рдирд╛рдо рд╕реЗ рдкреБрд░рд╛рдиреА рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдЙрдиреНрдирдд рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдм рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдИ рдЧрдИ рдереА tcpdump
, рддрдВрддреНрд░ seccomp
, рд╕рд╛рде рд╣реА рдХрдо рдЬреНрдЮрд╛рдд рдореЙрдбреНрдпреВрд▓ рднреА xt_bpf
рдХреЗ рд▓рд┐рдП iptables
рдФрд░ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ cls_bpf
. рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирдП рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдкреАрдЖрдИ рдпрдерд╛рд╡рдд рдмрдиреА рд╣реБрдИ рд╣реИ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдпреЛрдЧ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдЕрднреА рднреА рдкрд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ, рдореИрдВрдиреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдкрд┐рдЫрд▓реА рд╕рджреА рдХреЗ рдЕрд╕реНрд╕реА рдХреЗ рджрд╢рдХ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдкреНрд░рд╕рд┐рджреНрдз рд▓реЙрд░реЗрдВрд╕ рдмрд░реНрдХрд▓реЗ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИ рдХрд┐ рдкрд┐рдЫрд▓реА рд╕рджреА рдХреЗ рдЕрд╕реНрд╕реА рдХреЗ рджрд╢рдХ рдХреЗ рдЖрдзреБрдирд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░, рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реАрдПрд╕рдкреАрдПрдл (рд╕реАрдПрдордпреВ/рд╕реНрдЯреИрдирдлреЛрд░реНрдб рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░) рддрдХрдиреАрдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдерд╛, рдЕрд░реНрдерд╛рддред рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡рд╛рд▓реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореМрдЬреВрджрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рдорд╢реАрдиреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдереАрдВ рдФрд░ рдирдИ рдЖрд░рдЖрдИрдПрд╕рд╕реА рдорд╢реАрдиреЛрдВ рдкрд░ рдЙрддрдиреА рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдирд╣реАрдВ рдЪрд▓рддреА рдереАрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрд░реНрдХрд▓реЗ рд▓реИрдмреНрд╕ рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ, рдПрдХ рдирдИ рдмреАрдкреАрдПрдл (рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░) рддрдХрдиреАрдХ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЛрдЯреЛрд░реЛрд▓рд╛ 6502 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЬреИрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рд╡рд░реНрдХрд╣реЙрд░реНрд╕
рдмреАрдкреАрдПрдл рдорд╢реАрди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рд╣рдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП рдХрд╛рдордХрд╛рдЬреА рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдорд╢реАрди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ 32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░, рдПрдХ рд╕рдВрдЪрд╛рдпрдХ рдЙрдкрд▓рдмреНрдз рдереЗ A
рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рд░рдЬрд┐рд╕реНрдЯрд░ X
, 64 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдореЛрд░реА (16 рд╢рдмреНрдж), рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз, рдФрд░ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреА рдПрдХ рдЫреЛрдЯреА рдкреНрд░рдгрд╛рд▓реАред рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдк рдирд┐рд░реНрджреЗрд╢ рднреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдереЗ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдордп рдкрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП, рдЬрдВрдк рдХреЗрд╡рд▓ рдЖрдЧреЗ рдХреА рдУрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдпрд╛рдиреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд▓реВрдк рдмрдирд╛рдиреЗ рд╕реЗ рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдорд╢реАрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреАрдкреАрдПрдл рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рдХрд░реНрдиреЗрд▓ рддрдВрддреНрд░ (рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓), рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реЛрдб рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрд╡реЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдкрд░ рдЕрдЧрд▓реЗ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдЧрдорди рд╣реИ)ред рдЬрдм рдХреЛрдИ рдШрдЯрдирд╛ рдШрдЯрддреА рд╣реИ, рддреЛ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ), рдФрд░ рдорд╢реАрди рдореЗрдореЛрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдХрд╛ рдбреЗрдЯрд╛)ред
рдЙрдкрд░реЛрдХреНрдд рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛: рд╣рдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдХрдорд╛рдВрдб рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рддреБрд░рдВрдд рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреА рд╕рднреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореВрд▓ рд▓реЗрдЦ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ 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
рдФрд░ рдпрд╣ 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
рдкрдВрдХреНрддрд┐ 4 рдФрд░ 5 рдкрд░ рд╣рдо рдкрддреЗ 20 рдкрд░ рд╕реНрдерд┐рдд рдЖрдзреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ jset
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗрдЯ рд╣реИ jset
рддреАрди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд╕рд╛рдлрд╝ рд╣реЛ рдЧрдП рд╣реИрдВред рддреАрди рдореЗрдВ рд╕реЗ рджреЛ рдмрд┐рдЯреНрд╕ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдкреИрдХреЗрдЯ рдЦрдВрдбрд┐рдд рдЖрдИрдкреА рдкреИрдХреЗрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рдЯреБрдХрдбрд╝рд╛ рд╣реИред рддреАрд╕рд░рд╛ рдмрд┐рдЯ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЕрдзреВрд░реЗ рдпрд╛ рдЯреВрдЯреЗ рд╣реБрдП рдкреИрдХреЗрдЯреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреАрдиреЛрдВ рдмрд┐рдЯреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдкрдВрдХреНрддрд┐ 6 тАЛтАЛрд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ldxb 4*([14]&0xf)
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ X
рдкреИрдХреЗрдЯ рдХреЗ рдкрдВрджреНрд░рд╣рд╡реЗрдВ рдмрд╛рдЗрдЯ рдХреЗ рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рдХреЛ 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
рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ struct sock_fprog
рдмрд┐рдирд╛ рдорджрдж рдХреЗ tcpdump
рд╣рдо рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ
рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдФрд░ XNUMXрд╡реАрдВ рд╕рджреА
рдмреАрдкреАрдПрдл рдХреЛ 1997 рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╡рд░реНрдХрд╣реЙрд░реНрд╕ рдмрдирд╛ рд░рд╣рд╛ libpcap
рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ (рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рд▓рд┐рдирдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди, x86_64
рдХреЛрдб.
JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдерд╛: 2012 рдореЗрдВ 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;
}
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдЬрд╛рдирддреЗ рд╣реИрдВ 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
рдирдВрдЧреЗ 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()
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
рдореВрд▓ рдХреЛрдб рдпрд╛ рдмреАрдкреАрдПрдл рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдХрднреА-рдХрднреА рдкреЛрд░реНрдЯреЗрдмрд▓ рдФрд░/рдпрд╛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдЧрд╛
рдЖрдЗрдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрдж рдХреА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЧрдИ рд╣реИ
#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
рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
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 рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдЦ рдореЗрдВ
$ ./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
, рдЪреВрдВрдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рд╣рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЧрд╛ - рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП рдмрд╛рдж рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдо рдЗрд╕ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рд┐рдпрд░ рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдорд┐рд▓реЗрдВрдЧреЗред
рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рд╕реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг cls_bpf
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХрд╛ рджрд╛рдпрд░рд╛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рд╣реИ: рд╢рд╛рд╕реНрддреНрд░реАрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреИрдХреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реЗрдЬ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ рдЕрдм рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдУрд░ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЛ рд╡рд┐рджрд╛рдИ
рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдирдмреНрдмреЗ рдХреЗ рджрд╢рдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдмреАрдкреАрдПрдл рддрдХрдиреАрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдЪреМрдерд╛рдИ рд╕рджреА рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реА рдФрд░ рдЕрдВрдд рддрдХ рдирдП рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╛рдП рдЧрдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдЯреИрдХ рдорд╢реАрдиреЛрдВ рд╕реЗ рдЖрд░рдЖрдИрдПрд╕рд╕реА рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рдорд╛рди, рдЬреЛ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рдерд╛, 32 рдХреЗ рджрд╢рдХ рдореЗрдВ 64-рдмрд┐рдЯ рд╕реЗ XNUMX-рдмрд┐рдЯ рдорд╢реАрдиреЛрдВ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реБрдЖ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИрдВ, рдФрд░ рдкреБрд░рд╛рдиреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╛рддрдЪреАрдд рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде, рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ sk_buff
рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдХреЗ, рдЖрдк рдкреИрдХреЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдХрд╛ рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдПрдкреАрдЖрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдХреНрд▓рд╛рд╕рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдЪрд╛рд╣реЗ рд╡рд╣ рд╕реЙрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ рдпрд╛ рд╕реЗрдХрдХреЙрдореНрдк рдлрд┐рд▓реНрдЯрд░ рд╣реЛрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдирдП рдкреНрд░рд╛рд░реВрдк, рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдмреАрдкреАрдПрдл рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред (рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред)
рдПрдХ рдирдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди 2013 рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдЬрдм рдПрд▓реЗрдХреНрд╕реА рд╕реНрдЯрд╛рд░реЛрд╡реЛрдЗрдЯреЛрд╡ рдиреЗ рдмреАрдкреАрдПрдл рдЕрджреНрдпрддрди рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ред 2014 рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдЪ
рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЖрдЧреЗ рдХреЗ рд▓реЗрдЦ рдирдИ рддрдХрдиреАрдХ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╢реБрд░реВ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдмреАрдкреАрдПрдл, рдлрд┐рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдФрд░ рдЕрдм рдХреЗрд╡рд▓ рдмреАрдкреАрдПрдл рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрджрд░реНрднреЛрдВ
- рд╕реНрдЯреАрд╡рди рдореИрдХреНрдХреЗрди рдФрд░ рд╡реИрди рдЬреИрдХрдмрд╕рди, "рдмреАрдПрд╕рдбреА рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрддрд░реАрдп рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░",
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/ рдЖрдИрдкреАрдЯреЗрдмрд▓ рдпреВ32 рдореИрдЪ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ .- рдмреАрдкреАрдПрдл - рднреВрд▓рд╛ рд╣реБрдЖ рдмрд╛рдЗрдЯрдХреЛрдб:
https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
- рдмреАрдкреАрдПрдл рдЯреВрд▓ рдХрд╛ рдкрд░рд┐рдЪрдп:
https://blog.cloudflare.com/introducing-the-bpf-tools/
bpf_cls
:http://man7.org/linux/man-pages/man8/tc-bpf.8.html
- рдПрдХ рд╕реЗрдХрдВрдбрдХреЙрдореНрдк рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди:
https://lwn.net/Articles/656307/
https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
habr: рдХрдВрдЯреЗрдирд░ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛: seccomp habr: рд╕рд┐рд╕реНрдЯрдордбреА рдХреЗ рд╕рд╛рде рдбреЗрдореЙрди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдпрд╛ "рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЙрдХрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!" - рдкреЙрд▓ рдЪреИрдЧреНрдирди, "рд╕реНрдЯреНрд░реЗрд╕--рд╕реЗрдХрдореНрдк-рдмреАрдкреАрдПрдл: рдП рд▓реБрдХ рдЕрдВрдбрд░ рдж рд╣реБрдб",
https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
netsniff-ng
:http://netsniff-ng.org/
рд╕реНрд░реЛрдд: www.habr.com