рдкреБрд╕реНрддрдХ "рд▓рд┐рдирдХреНрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл"

рдкреБрд╕реНрддрдХ "рд▓рд┐рдирдХреНрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл"рдирдорд╕реНрдХрд╛рд░, рдЦрд╛рдмреНрд░реЛ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ! рдмреАрдкреАрдПрдл рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рджреЛрд╖ рдвреВрдВрдврдиреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ, рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рдбреЗрд╡рд┐рдб рдХреИрд▓рд╛рд╡реЗрд░рд╛ рдФрд░ рд▓реЛрд░реЗрдВрдЬреЛ рдлреЛрдВрдЯрд╛рдирд╛ рдЖрдкрдХреЛ рдмреАрдкреАрдПрдл рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди, рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ, рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред - рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - рдХрд░реНрдиреЗрд▓ рдХреЛ рдкреБрди: рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд░рд┐рдмреВрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд░реНрдиреЗрд▓ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред - рд╕реА, рдЧреЛ рдпрд╛ рдкрд╛рдпрдерди рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬреАрд╡рдирдЪрдХреНрд░ рдХрд╛ рд╕реНрд╡рд╛рдореА рдмрдирдХрд░ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦреЗрдВред

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реБрд░рдХреНрд╖рд╛, рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдФрд░ Seccomp

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

рд▓рд┐рдирдХреНрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ (рдПрд▓рдПрд╕рдПрдо) рдПрдХ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдирдХреАрдХреГрдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред LSM рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдЯреНрд░реА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ Apparmor, SELinux рдФрд░ Tomoyoред

рдЖрдЗрдП рд▓рд┐рдирдХреНрд╕ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдХреЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред

рдХреНрд╖рдорддрд╛рдУрдВ

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

Main.go рдирд╛рдо рдХреЗ рдПрдХ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

package main
import (
            "net/http"
            "log"
)
func main() {
     log.Fatalf("%v", http.ListenAndServe(":80", nil))
}

рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреЛрд░реНрдЯ 80 рдкрд░ рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдкреЛрд░реНрдЯ рд╣реИ)ред рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдЗрд╕реЗ рд╕рдВрдХрд▓рди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

$ go build -o capabilities main.go
$ ./capabilities

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдБрдХрд┐ рд╣рдо рд░реВрдЯ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдкреЛрд░реНрдЯ рдХреЛ рдмрд╛рдЗрдВрдб рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛:

2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1

рдХреИрдкрд╢ (рд╢реЗрд▓ рдореИрдиреЗрдЬрд░) рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╢реЗрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреВрд░реНрдг рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХреИрдк_рдиреЗрдЯ_рдмрд┐рдВрдб_рд╕рд░реНрд╡рд┐рд╕ рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдкреЛрд░реНрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреИрдкрд╢ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

# capsh --caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' 
   --keep=1 --user="nobody" 
   --addamb=cap_net_bind_service -- -c "./capabilities"

рдЖрдЗрдпреЗ рдЗрд╕ рдЯреАрдо рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдордЭрддреЗ рд╣реИрдВ.

  • рдХреИрдкрд╢ - рдХреИрдкрд╢ рдХреЛ рд╢реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • тАФcaps='cap_net_bind_service+eipcap_setpcap,cap_setuid,cap_setgid+ep' - рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╣рдо рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рд╣рдо рдХреИрдк_рдиреЗрдЯ_рдмрд┐рдВрдб_рд╕рд░реНрд╡рд┐рд╕ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд░реВрдЯ рдирд╣реАрдВ, рдЕрд░реНрдерд╛рддреН рдХреИрдк_рд╕реЗрдЯреБрдЗрдб рдФрд░ рдХреИрдк_рд╕реЗрдЯрдЧрд┐рдбред
  • тАФрдХреАрдк=1 тАФ рд╣рдо рд░реВрдЯ рдЦрд╛рддреЗ рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рд╕реНрдерд╛рдкрд┐рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ = "рдХреЛрдИ рдирд╣реАрдВ" - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  • тАФaddamb=cap_net_bind_service тАФ рд░реВрдЯ рдореЛрдб рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рд╢реЛрдзрди рд╕реЗрдЯ рдХрд░реЗрдВред
  • - -рд╕реА "./рдХреНрд╖рдорддрд╛рдПрдВ" - рдмрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВред

рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдХреНрд╖рдорддрд╛рдПрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ рдЬрдм рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрдиреНрд╣реЗрдВ execve() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рд╡реЗ рдХреНрд╖рдорддрд╛рдПрдБ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрдмрджреНрдз рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкрд░реНрдпрд╛рд╡рд░рдг рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВред

рдЖрдк рд╢рд╛рдпрдж рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ --caps рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж +eip рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред рдЗрди рдЭрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд╖рдорддрд╛:

-рд╕рдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдкреА);

- рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз (рдИ);

-рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (i)ред

рдЪреВрдБрдХрд┐ рд╣рдоcap_net_bind_service рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ e рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдХрдорд╛рдВрдб рдореЗрдВ рд╢реЗрд▓ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмрд╛рдЗрдирд░реА рдЪрд▓рд╛рдПрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ i рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреА рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╣рдордиреЗ рдпреВрдЖрдИрдбреА рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд┐рдпрд╛)ред рдпрд╣ рдХреИрдк_рдиреЗрдЯ_рдмрд╛рдЗрдВрдб_рд╕рд░реНрд╡рд┐рд╕+рдИрдЖрдИрдкреА рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

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

# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдордиреЗ рдХреИрдкрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд▓рд┐рдмрдХреИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╢реЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдореИрди 3 рд▓рд┐рдмрдХреИрдк рджреЗрдЦреЗрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЙрди рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд░рди рдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВред

рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо BCC рд╕рдХреНрд╖рдо рдЯреВрд▓ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХреИрдк_рдХреИрдкреЗрдмрд▓ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП kprobe рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

/usr/share/bcc/tools/capable
TIME      UID  PID   TID   COMM               CAP    NAME           AUDIT
10:12:53 0 424     424     systemd-udevd 12 CAP_NET_ADMIN         1
10:12:57 0 1103   1101   timesync        25 CAP_SYS_TIME         1
10:12:57 0 19545 19545 capabilities       10 CAP_NET_BIND_SERVICE 1

рд╣рдо рдХреИрдк_рдХреИрдкреЗрдмрд▓ рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ-рд▓рд╛рдЗрдирд░ kprobe рдХреЗ рд╕рд╛рде bpftrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

bpftrace -e 
   'kprobe:cap_capable {
      time("%H:%M:%S ");
      printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
    }' 
    | grep -i capabilities

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдХреНрд╖рдорддрд╛рдПрдВ kprobe рдХреЗ рдмрд╛рдж рд╕рдХреНрд╖рдо рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛:

12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 10 1

рдкрд╛рдБрдЪрд╡рд╛рдБ рдХреЙрд▓рдо рд╡рд╣ рдХреНрд╖рдорддрд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдирдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЪреВрдБрдХрд┐ рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЧреИрд░-рдСрдбрд┐рдЯ рдШрдЯрдирд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╣рдо рд╕рднреА рдЧреИрд░-рдСрдбрд┐рдЯ рдЬрд╛рдБрдЪреЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдСрдбрд┐рдЯ рдлрд╝реНрд▓реИрдЧ (рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЕрдВрддрд┐рдо) рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд╖рдорддрд╛ред рд╣рдорд╛рд░реА рд░реБрдЪрд┐ CAP_NET_BIND_SERVICE рдореЗрдВ рд╣реИ, рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 10 рдХреЗ рд╕рд╛рде include/uapi/linux/ability.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */
#define CAP_NET_BIND_SERVICE 10<source lang="go">

рд░рдирд╕реА рдпрд╛ рдбреЙрдХрд░ рдЬреИрд╕реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХреЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред рдЬрдм рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдбреЙрдХрд░ рдЙрдиреНрд╣реЗрдВ --cap-add рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummy

рдпрд╣ рдХрдорд╛рдВрдб рдХрдВрдЯреЗрдирд░ рдХреЛ CAP_NET_ADMIN рдХреНрд╖рдорддрд╛ рджреЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдбрдореА0 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд▓рд┐рдВрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХреЗрдЧрд╛ред

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

Seccomp

Seccomp рдХрд╛ рдорддрд▓рдм рд╕рд┐рдХреНрдпреЛрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╣реИ рдФрд░ рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рдд рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ Seccomp рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ Linux рд╕реЗ рддреБрд▓рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛ рдЗрд╕реЗ рдЙрдирдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рддреА рд╣реИред

Seccomp рдФрд░ Linux рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ CAP_NET_ADMIN рдХреНрд╖рдорддрд╛ рджреЗрдирд╛ рдЪрд╛рд╣реЗрдВ, рд▓реЗрдХрд┐рди рдЙрд╕реЗ рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗрдВ, рд╕реНрд╡реАрдХрд╛рд░ рдФрд░ рд╕реНрд╡реАрдХрд╛рд░4 рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджреЗрдВред

Seccomp рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ SECCOMP_MODE_FILTER рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ BPF рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреИрдХреЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

PR_SET_SECCOMP рдСрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ prctl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Seccomp рдлрд╝рд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдПрдХ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд░реВрдк рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ seccomp_data рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ Seccomp рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд╕рдордп рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдФрд░ рдЕрдзрд┐рдХрддрдо рдЫрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ uint64 рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

linux/seccomp.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ seccomp_data рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

struct seccomp_data {
int nr;
      __u32 arch;
      __u64 instruction_pointer;
      __u64 args[6];
};

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓, рдЙрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдпрд╛ рджреЛрдиреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ Seccomp рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ (рд╕реНрдерд┐рддрд┐ рдХреЛрдб) рдореЗрдВ рд╕реЗ рдПрдХ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

- SECCOMP_RET_KILL_PROCESS - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

- SECCOMP_RET_KILL_THREAD - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

тАФ SECCOMP_RET_KILL тАФ SECCOMP_RET_KILL_THREAD рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо, рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ред

- SECCOMP_RET_TRAP - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рдФрд░ SIGSYS (рдЦрд░рд╛рдм рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓) рд╕рд┐рдЧреНрдирд▓ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

- SECCOMP_RET_ERRNO - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ SECCOMP_RET_DATA рдлрд╝рд┐рд▓реНрдЯрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд░рдиреЛ рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдорд╛рди рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╣реИред

- SECCOMP_RET_TRACE - рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - PTRACE_O_TRACESECCOMP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ptrace рдЯреНрд░реЗрд╕рд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЯреНрд░реИрд╕рд░ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ, рдЗрд░рдиреЛ рдХреЛ -ENOSYS рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

- SECCOMP_RET_LOG - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдФрд░ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

- SECCOMP_RET_ALLOW - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

ptrace рдЯреНрд░реЗрд╕реА рдирд╛рдордХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИред рдЯреНрд░реЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЯреНрд░реЗрд╕реА рдХреЗ рдореЗрдореЛрд░реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Seccomp рд╕рдВрджрд░реНрдн рдореЗрдВ, SECCOMP_RET_TRACE рд╕реНрдерд┐рддрд┐ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рдкрд░ ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреНрд░реЗрд╕рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

Seccomp рддреНрд░реБрдЯрд┐рдпрд╛рдБ

рд╕рдордп-рд╕рдордп рдкрд░, Seccomp рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ SECCOMP_RET_ERRNO рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, seccomp рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ 1 рдХреЗ рдмрдЬрд╛рдп -0 рд▓реМрдЯрд╛рдПрдЧрд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╕рдВрднрд╡ рд╣реИрдВ:

- рдЖрд╕рд╛рди - рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ CAP_SYS_ADMIN рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ prctl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ no_new_privs рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ);

- EFAULT - рдкрд╛рд░рд┐рдд рддрд░реНрдХ (seccomp_data рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рддрд░реНрдХ) рдХрд╛ рдХреЛрдИ рд╡реИрдз рдкрддрд╛ рдирд╣реАрдВ рд╣реИ;

тАФ EINVAL тАФ рдпрд╣рд╛рдБ рдЪрд╛рд░ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

-рдЕрдиреБрд░реЛрдзрд┐рдд рдСрдкрд░реЗрд╢рди рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдпрд╛ рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ;

-рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЭрдВрдбреЗ рдЕрдиреБрд░реЛрдзрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИрдВ;

-рдСрдкрд░реЗрд╢рди рдореЗрдВ BPF_ABS рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЬреЛ seccomp_data рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ;

-рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ;

тАФ ENOMEM тАФ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ;

- EOPNOTSUPP - рдСрдкрд░реЗрд╢рди рдиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ SECCOMP_GET_ACTION_AVAIL рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЙрдкрд▓рдмреНрдз рдереА, рд▓реЗрдХрд┐рди рдХрд░реНрдиреЗрд▓ рддрд░реНрдХреЛрдВ рдореЗрдВ рд░рд┐рдЯрд░реНрди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ;

тАФ ESRCH тАФ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ;

- ENOSYS - SECCOMP_RET_TRACE рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдХреЛрдИ рдЯреНрд░реЗрд╕рд░ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИред

prctl рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рд▓реБрдУрдВ, рдЬреИрд╕реЗ рдмрд╛рдЗрдЯ рдПрдВрдбрд┐рдпрдирдиреЗрд╕, рдереНрд░реЗрдб рдирд╛рдо, рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрдгрдирд╛ рдореЛрдб (рд╕реЗрдХрдХреЙрдореНрдк), рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░, рдкрд░реНрдлрд╝ рдИрд╡реЗрдВрдЯ рдЗрддреНрдпрд╛рджрд┐ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ (рд╕реЗрдЯ рдФрд░ рдкреНрд░рд╛рдкреНрдд) рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

Seccomp рдЖрдкрдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рддрдХрдиреАрдХ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред Seccomp рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕реАрдзреЗ Seccomp рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдП рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдмреАрдкреАрдПрдл рд╕реЗрдХреЙрдореНрдк рдлрд╝рд┐рд▓реНрдЯрд░ рдЙрджрд╛рд╣рд░рдг

рдпрд╣рд╛рдВ рд╣рдо рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рджреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрд░реНрдерд╛рддреН:

- рд╣рдо рдПрдХ Seccomp BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╡рд╛рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;

- prctl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░реЗрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реЗ рд╣реЗрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

#include <errno.h>
#include <linux/audit.h>
#include <linux/bpf.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <unistd.h>

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд░реНрдиреЗрд▓ CONFIG_SECCOMP рдФрд░ CONFIG_SECCOMP_FILTER рдХреЛ y рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░реНрдпрд╢реАрд▓ рдорд╢реАрди рдкрд░ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP

рд╢реЗрд╖ рдХреЛрдб рджреЛ-рднрд╛рдЧ рд╡рд╛рд▓рд╛ install_filter рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдмреАрдкреАрдПрдл рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╣рдорд╛рд░реА рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИ:

static int install_filter(int nr, int arch, int error) {
  struct sock_filter filter[] = {
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, arch))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3),
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, nr))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),
  };

рдирд┐рд░реНрджреЗрд╢ linux/filter.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд BPF_STMT рдФрд░ BPF_JUMP рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдЖрдЗрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдЧреМрд░ рдХрд░реЗрдВред

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arc))) - рд╕рд┐рд╕реНрдЯрдо BPF_LD рд╕реЗ BPF_W рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдФрд░ рдЬрдорд╛ рд╣реЛрддрд╛ рд╣реИ, рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдСрдлрд╕реЗрдЯ BPF_ABS рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, рдЖрд░реНрдХ, 0, 3) - BPF_JEQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ BPF_K рд╕рдВрдЪрд╛рдпрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдорд╛рди рдЖрд░реНрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдСрдлрд╕реЗрдЯ 0 рдкрд░ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдХреВрджрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдСрдлрд╕реЗрдЯ 3 рдкрд░ рдХреВрджрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрд░реНрдХ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - BPF_LD рд╕реЗ BPF_W рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдФрд░ рдЬрдорд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ BPF_ABS рдХреЗ рдирд┐рд╢реНрдЪрд┐рдд рдСрдлрд╕реЗрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рд╣реИред

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рдХреА рддреБрд▓рдирд╛ nr рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рди рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ SECCOMP_RET_ALLOW рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (рддреНрд░реБрдЯрд┐ рдФрд░ SECCOMP_RET_DATA)) - BPF_RET рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рдЪрд░ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ SECCOMP_RET_ERRNO рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - BPF_RET рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ SECCOMP_RET_ALLOW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

SECCOMP рд╕реАрдмреАрдкреАрдПрдл рд╣реИ
рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдИрдПрд▓рдПрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рд┐рдд рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмрдЬрд╛рдп рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рд░рдг рд╣реИрдВред

тАв рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Seccomp cBPF (рдХреНрд▓рд╛рд╕рд┐рдХ BPF) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рди рдХрд┐ eBPF рдХрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ: рдЗрд╕рдореЗрдВ рдХреЛрдИ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЪрд╛рдпрдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

тАв рджреВрд╕рд░рд╛, Seccomp рд╕реАрдзреЗ BPF рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореИрдХреНрд░реЛрдЬрд╝ рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░-рдЕрдиреБрдХреВрд▓ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЫрджреНрдо рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:

if (arch != AUDIT_ARCH_X86_64) {
    return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
    return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;

рд╕реЙрдХреЗрдЯ_рдлрд╝рд┐рд▓реНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ sock_fprog рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд▓рдВрдмрд╛рдИ рд╣реЛред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

struct sock_fprog prog = {
   .len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
   .filter = filter,
};

install_filter рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рдо рдмрдЪрд╛ рд╣реИ - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрд╡рдпрдВ рд▓реЛрдб рдХрд░реЗрдВ! рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ PR_SET_SECCOMP рдХреЛ рд▓реЗрддреЗ рд╣реБрдП, prctl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдореЛрдб рдХреЛ SECCOMP_MODE_FILTER рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ sock_fprog рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЧ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ:

  if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
    perror("prctl(PR_SET_SECCOMP)");
    return 1;
  }
  return 0;
}

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ install_filter рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП PR_SET_NO_NEW_PRIVS рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП prctl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪреЗрдВ рдЬрд╣рд╛рдВ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ install_filter рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд prctl рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рд╣рдо install_filter рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП X86-64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рд░рд╛рдЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ рдФрд░ рдмрд╕ рдПрдХ рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬреЛ рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗред рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ:

int main(int argc, char const *argv[]) {
  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
   perror("prctl(NO_NEW_PRIVS)");
   return 1;
  }
   install_filter(__NR_write, AUDIT_ARCH_X86_64, EPERM);
  return system(argv[1]);
 }

рдЖрдПрдБ рд╢реБрд░реВ рдХрд░реЗрдВред рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдпрд╛ рддреЛ clang рдпрд╛ gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ main.c рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ:

clang main.c -o filter-write

рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдордиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рднреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рджреЗ - ls рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╡рд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ:

ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Apr 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Apr 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Apr 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Apr 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Apr 28 21:08 main.c

рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ! рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд░реИрдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: рд╣рдо рдмрд╕ рдЙрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

./filter-write "ls -la"

рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

strace -f ./filter-write "ls -la"

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

[pid 25099] write(2, "ls: ", 4) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "write error", 11) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "n", 1) = -1 EPERM (Operation not permitted)

рдЕрдм рдЖрдк рд╕рдордЭ рдЧрдП рд╣реИрдВ рдХрд┐ Seccomp BPF рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдмреАрдкреАрдПрдл рдХреЗ рдмрдЬрд╛рдп рдИрдмреАрдкреАрдПрдл рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рдИрдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╕рдордп, рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╢рд╛рд╕рдХреАрдп рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдХрдерди рдЖрдо рддреМрд░ рдкрд░ рд╕рддреНрдп рд╣реИ, рдХрд░реНрдиреЗрд▓ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ eBPF рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрди рддрдВрддреНрд░реЛрдВ рдХреЛ рдмреАрдкреАрдПрдл рдПрд▓рдПрд╕рдПрдо рдЯреНрд░реИрдк рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмреАрдкреАрдПрдл рдПрд▓рдПрд╕рдПрдо рдЬрд╛рд▓

рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдирд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд▓рдПрд╕рдПрдо рдЬрд╛рд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╣реБрдХ рдХреЙрд▓ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реИред рдПрд▓рдПрд╕рдПрдо рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рдкрд░рдд рд╡рд┐рднрд┐рдиреНрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред

рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдХрд░реНрдиреЗрд▓ рдореЗрдВ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рд╛рдд рд╣реБрдХ рд╣реИрдВ, рдФрд░ SELinux рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд LSM рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЯреНрд░реИрдкреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб include/linux/security.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдЯреНрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ:

extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);

рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

- рд╕реБрд░рдХреНрд╖рд╛_рдмреАрдкреАрдПрдл - рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдмреАрдкреАрдПрдл рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ;

- рд╕реБрд░рдХреНрд╖рд╛_рдмреАрдкреАрдПрдл_рдореИрдк - рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрдм рд▓реМрдЯрд╛рддрд╛ рд╣реИ;

- Security_bpf_prog - рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрдм рд▓реМрдЯрд╛рддрд╛ рд╣реИ;

- рд╕реБрд░рдХреНрд╖рд╛_рдмреАрдкреАрдПрдл_рдореИрдк_рдЖрд▓реЛрдХ - рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдмреАрдкреАрдПрдл рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ;

- рд╕реБрд░рдХреНрд╖рд╛_рдмреАрдкреАрдПрдл_рдореИрдк_рдлреНрд░реА - рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдмреАрдкреАрдПрдл рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░ рд╕рд╛рдл рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ;

тАФ Security_bpf_prog_alloc тАФ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрджрд░ рд╕реБрд░рдХреНрд╖рд╛ рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рд░рдВрдн рдХреА рдЧрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВ;

- Security_bpf_prog_free - рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрджрд░ рд╕реБрд░рдХреНрд╖рд╛ рдлрд╝реАрд▓реНрдб рд╕рд╛рдлрд╝ рд╣реЛ рдЧрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВред

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

рд╕рд╛рд░рд╛рдВрд╢

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

рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

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

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

┬╗рдкреБрд╕реНрддрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдкреНрд░рдХрд╛рд╢рдХ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ
┬╗ рд▓реЗрдЦ-рд╕реВрдЪреА
┬╗ рдЕрдВрд╢

рдЦрд╛рдмреНрд░реЛрдЭрд┐рдЯреЗрд▓реЗ рдХреЗ рд▓рд┐рдП рдХреВрдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 25% рдХреА рдЫреВрдЯ - Linux

рдкреБрд╕реНрддрдХ рдХреЗ рдХрд╛рдЧрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдкрд░, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдкреБрд╕реНрддрдХ рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреА рдЬрд╛рдПрдЧреАред

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

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