"рд▓рд┐рдирдХреНрд╕ рдирд┐рдЧрд░рд╛рдиреА рдХреЛ рд▓рд╛рдЧреА BPF" рдмреБрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН

"рд▓рд┐рдирдХреНрд╕ рдирд┐рдЧрд░рд╛рдиреА рдХреЛ рд▓рд╛рдЧреА BPF" рдмреБрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реНрдирдорд╕реНрддреЗ рдЦрдмрд░рдмрд╛рд╕реАрд╣рд░реБ ! BPF рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХ рдордзреНрдпреЗ рдПрдХ рд╣реЛред рдпрд╕рдХреЛ рдЙрдЪрд┐рдд рдкреНрд░рдпреЛрдЧрд▓реЗ рдкреНрд░рдгрд╛рд▓реА рдЗрдиреНрдЬрд┐рдирд┐рдпрд░рд╣рд░реВрд▓рд╛рдИ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд░ рд╕рдмреИрднрдиреНрджрд╛ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдкрдирд┐ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдХрд░реНрдиреЗрд▓рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреБрдЧрдорди рд░ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ, рдХрд░реНрдиреЗрд▓рдорд╛ рдШрдЯрдирд╛рд╣рд░реВ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрди рдХреЛрдбрд╣рд░реВ рдХрд╕рд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ, рд░ рдзреЗрд░реИ рдХреБрд░рд╛рд╣рд░реВ рд╕рд┐рдХреНрдиреБрд╣реБрдиреЗрдЫред David Calavera рд░ Lorenzo Fontana рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ BPF рдХреЛ рд╢рдХреНрддрд┐ рдЕрдирд▓рдХ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рди, рдиреЗрдЯрд╡рд░реНрдХрд┐рдЩ, рд╕реБрд░рдХреНрд╖рд╛рдХреЛ рдЖрдлреНрдиреЛ рдЬреНрдЮрд╛рди рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реНред - рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреБрдЧрдорди рд░ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрди BPF рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред - рдХрд░реНрдиреЗрд▓ рдкреБрди: рдХрдореНрдкрд╛рдЗрд▓ рд╡рд╛ рдкреНрд░рдгрд╛рд▓реА рд░рд┐рдмреБрдЯ рдирдЧрд░реА рдХрд░реНрдиреЗрд▓ рдШрдЯрдирд╛рд╣рд░реВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрди рдХреЛрдб рдЗрдиреНрдЬреЗрдХреНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред - C, Go рд╡рд╛ Python рдорд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред - BPF рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬреАрд╡рдирдЪрдХреНрд░рдХреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓рд┐рдПрд░ рдирд┐рдпрдиреНрддреНрд░рдг рд▓рд┐рдиреБрд╣реЛрд╕реНред

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реБрд░рдХреНрд╖рд╛, рдпрд╕рдХреЛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рд░ Seccomp

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

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

рд▓рд┐рдирдХреНрд╕рдХреЛ рдХреНрд╖рдорддрд╛рд╣рд░реВ рдЫрд▓рдлрд▓ рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реМрдВред

рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ

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

main.go рдирд╛рдордХ 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 (рд╢реЗрд▓ рдкреНрд░рдмрдиреНрдзрдХ) рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ рдЬрд╕рд▓реЗ рдХреНрд╖рдорддрд╛рд╣рд░реВрдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯрдХреЛ рд╕рд╛рде рд╢реЗрд▓ рдЪрд▓рд╛рдЙрдБрдЫред

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

# 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"

рдпреЛ рдЯреЛрд▓реАрд▓рд╛рдИ рдереЛрд░реИ рдмреБрдЭреМрдВред

  • capsh - рдЦреЛрд▓рдХреЛ рд░реВрдкрдорд╛ capsh рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  • тАФcaps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рднрдПрдХреЛрд▓реЗ (рд╣рд╛рдореА рд░реВрдЯрдХреЛ рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрди рдЪрд╛рд╣рдБрджреИрдиреМрдВ), рд╣рд╛рдореА cap_net_bind_service рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ root to nobody, рдЕрд░реНрдерд╛рддреН cap_setuid рд░ cap_setgidред
  • тАФkeep=1 тАФ рд╣рд╛рдореА рд░реВрдЯ рдЦрд╛рддрд╛рдмрд╛рдЯ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрджрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХреНрд╖рдорддрд╛рд╣рд░реВ рд░рд╛рдЦреНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред
  • тАФuser=тАЬрдХреБрдиреИ рдкрдирд┐тАЭ тАФ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдЙрдиреЗ рдЕрдиреНрддрд┐рдо рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрд╣реА рдкрдирд┐ рд╣реБрдиреЗрдЫреИрдиред
  • тАФaddamb=cap_net_bind_service тАФ рд░реВрдЯ рдореЛрдбрдмрд╛рдЯ рд╕реНрд╡рд┐рдЪ рдЧрд░реЗрдкрдЫрд┐ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХреНрд╖рдорддрд╛рд╣рд░реВрдХреЛ рдХреНрд▓рд┐рдпрд░рд┐рдЩ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  • - -c "./capabilities" - рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред

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

--caps рд╡рд┐рдХрд▓реНрдкрдорд╛ рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрдкрдЫрд┐ рддрдкрд╛рдИрдВ +eip рдХреЛ рдЕрд░реНрде рдХреЗ рд╣реЛ рднрдиреЗрд░ рд╕реЛрдЪрд┐рд░рд╣рдиреБрднрдПрдХреЛ рдЫред рдпреА рдЭрдгреНрдбрд╛рд╣рд░реВ рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ:

- рд╕рдХреНрд░рд┐рдп рд╣реБрдиреБрдкрд░реНрдЫ (p);

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

-рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (i) рджреНрд╡рд╛рд░рд╛ рд╡рдВрд╢рд╛рдиреБрдЧрдд рд╣реБрди рд╕рдХреНрдЫред

рдХрд┐рдирдХрд┐ рд╣рд╛рдореА cap_net_bind_service рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рд╣рд╛рдореАрд▓реЗ рдпреЛ рдИ рдлреНрд▓реНрдпрд╛рдЧрдХреЛ рд╕рд╛рде рдЧрд░реНрдиреБрдкрд░реНрдЫред рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдХрдорд╛рдгреНрдбрдорд╛ рд╢реЗрд▓ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫреМрдВред рдпрд╕рд▓реЗ рдХреНрд╖рдорддрд╛рд╣рд░реВ рдмрд╛рдЗрдирд░реА рдЪрд▓рд╛рдЙрдиреЗрдЫ рд░ рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ i рдЭрдгреНрдбрд╛рдХреЛ рд╕рд╛рде рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЕрдиреНрддрдорд╛, рд╣рд╛рдореА рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ (рд╣рд╛рдореАрд▓реЗ UID рдкрд░рд┐рд╡рд░реНрддрди рдирдЧрд░реАрдХрди рдпреЛ рдЧрд░реНрдпреМрдВ) p. рдпреЛ cap_net_bind_service+eip рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫред

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

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

рдпрд╕ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд╣рд╛рдореАрд▓реЗ рдХреНрдпрд╛рдкрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреМрдВ, рддрд░ рддрдкрд╛рдИрд▓реЗ libcap рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╢реЗрд▓ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдердк рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд▓рд╛рдЧрд┐, man 3 libcap рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВ рд▓реЗрдЦреНрджрд╛, рдкреНрд░рд╛рдп: рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓рд╛рдИ рдХрд╛рд░реНрдпрдХреНрд░рдорд▓рд╛рдИ рдЪрд▓реНрдиреЗ рд╕рдордпрдорд╛ рдЪрд╛рд╣рд┐рдиреЗ рд╕рдмреИ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рдерд╛рд╣рд╛ рд╣реБрдБрджреИрдиред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпреА рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрди рд╕рдХреНрдЫред

рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдХреНрд╖рдорддрд╛рд╣рд░реВ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА BCC рд╕рдХреНрд╖рдо рдЙрдкрдХрд░рдг рд▓рд┐рди рд╕рдХреНрдЫреМрдВ, рдЬрд╕рд▓реЗ cap_capable рдХрд░реНрдиреЗрд▓ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ 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

рд╣рд╛рдореАрд▓реЗ cap_capable рдХрд░реНрдиреЗрд▓ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдПрдХ-рд▓рд╛рдЗрдирд░ 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

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

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 рдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреЗрдХрд╛ рдЫреМрдВ, рдпрд╕рд▓рд╛рдИ рдлрд╛рдЗрд▓рдорд╛ рд╕рдорд╛рд╡реЗрд╢/uapi/linux/ability.h рд▓рд╛рдИ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ 10 рдорд╛ рд░рд╣реЗрдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдбрдорд╛ рд╕реНрдерд┐рд░ рд░реВрдкрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ:

/* 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 рдХреНрд╖рдорддрд╛ рджрд┐рдиреЗрдЫ, рдпрд╕рд▓реЗ dummy0 рдЗрдиреНрдЯрд░рдлреЗрд╕ рдердкреНрди рдиреЗрдЯрд╡рд░реНрдХ рд▓рд┐рдЩреНрдХ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

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

рд╕реЗрдХрдореНрдк

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

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

Seccomp рдлрд┐рд▓реНрдЯрд░рд┐рдЩ рд╡рд┐рдзрд┐ SECOMP_MODE_FILTER рдореЛрдбрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ BPF рдлрд┐рд▓реНрдЯрд░рд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫ, рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдлрд┐рд▓реНрдЯрд░рд┐рдЩ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╕реНрддреИ рдЧрд░реА рдЧрд░рд┐рдиреНрдЫред

Seccomp рдлрд┐рд▓реНрдЯрд░рд╣рд░реВ PR_SET_SECCOMP рд╕рдЮреНрдЪрд╛рд▓рди рдорд╛рд░реНрдлрдд prctl рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓реЛрдб рд╣реБрдиреНрдЫрдиреНред рдпреА рдлрд┐рд▓реНрдЯрд░рд╣рд░реВрд▓реЗ BPF рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд░реВрдк рд▓рд┐рдиреНрдЫрдиреН рдЬреБрди рдкреНрд░рддреНрдпреЗрдХ Seccomp рдкреНрдпрд╛рдХреЗрдЯрдХреЛ рд▓рд╛рдЧрд┐ seccomp_data рд╕рдВрд░рдЪрдирд╛рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░рд┐рдиреНрдЫред рдпреЛ рд╕рдВрд░рдЪрдирд╛рд▓реЗ рд╕рдиреНрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдкреНрд░рдгрд╛рд▓реА рдХрд▓рдХреЛ рд╕рдордпрдорд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕реВрдЪрдХ, рд░ рдЕрдзрд┐рдХрддрдо рдЫрд╡рдЯрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рддрд░реНрдХрд╣рд░реВ, uint64 рдХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрдХреНрдд рдЧрд░рд┐рдиреНрдЫред

рдпреЛ linux/seccomp.h рдлрд╛рдЗрд▓рдорд╛ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдбрдмрд╛рдЯ seccomp_data рд╕рдВрд░рдЪрдирд╛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

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

рддрдкрд╛рдИрд▓реЗ рдпрд╕ рд╕рдВрд░рдЪрдирд╛рдмрд╛рдЯ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд╣рд╛рдореА рдкреНрд░рдгрд╛рд▓реА рдХрд▓, рдпрд╕рдХреЛ рддрд░реНрдХ, рд╡рд╛ рджреБрд╡реИрдХреЛ рд╕рдВрдпреЛрдЬрдирджреНрд╡рд╛рд░рд╛ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

рдкреНрд░рддреНрдпреЗрдХ Seccomp рдкреНрдпрд╛рдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдкрдЫрд┐, рдлрд┐рд▓реНрдЯрд░рд▓реЗ рдЕрдиреНрддрд┐рдо рдирд┐рд░реНрдгрдп рдЧрд░реНрди рд░ рдХрд░реНрдиреЗрд▓рд▓рд╛рдИ рдЕрд░реНрдХреЛ рдХреЗ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреБрдкрд░реНрджрдЫред рдЕрдиреНрддрд┐рдо рдирд┐рд░реНрдгрдп рдлрд┐рд░реНрддрд╛ рдорд╛рди (рд╕реНрдерд┐рддрд┐ рдХреЛрдб) рдордзреНрдпреЗ рдПрдХ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдЧрд░рд┐рдПрдХреЛ рдЫред

- SECOMP_RET_KILL_PROCESS - рдпрд╕ рдХрд╛рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирдЧрд░рд┐рдПрдХреЛ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реЗрдкрдЫрд┐ рддреБрд░реБрдиреНрддреИ рд╕рдореНрдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдорд╛рд░реНрдЫред

- SECOMP_RET_KILL_THREAD - рдпрд╕ рдХрд╛рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирднрдПрдХреЛ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реЗрдкрдЫрд┐ рддреБрд░реБрдиреНрддреИ рд╣рд╛рд▓рдХреЛ рдереНрд░реЗрдб рдмрдиреНрдж рдЧрд░реНрджрдЫред

тАФ SECOMP_RET_KILL тАФ SECOMP_RET_KILL_THREAD рдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдирд╛рдо, рдкрдЫрд╛рдбрд┐ рдЕрдиреБрдХреВрд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЫреЛрдбрд┐рдпреЛред

- SECOMP_RET_TRAP - рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдирд┐рд╖реЗрдзрд┐рдд рдЫ, рд░ SIGSYS (рдЦрд░рд╛рдм рдкреНрд░рдгрд╛рд▓реА рдХрд▓) рд╕рд┐рдЧреНрдирд▓ рдпрд╕рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрдорд╛ рдкрдард╛рдЗрдиреНрдЫред

- SECOMP_RET_ERRNO - рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рд░ SECOMP_RET_DATA рдлрд┐рд▓реНрдЯрд░ рд░рд┐рдЯрд░реНрди рдорд╛рдирдХреЛ рдЕрдВрд╢ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рд▓рд╛рдИ рддреНрд░реБрдЯрд┐ рдорд╛рдирдХреЛ рд░реВрдкрдорд╛ рдкрдард╛рдЗрдиреНрдЫред рддреНрд░реБрдЯрд┐рдХреЛ рдХрд╛рд░рдгрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджреИ, рдлрд░рдХ рддреНрд░реБрдЯрд┐ рдорд╛рдирд╣рд░реВ рдлрд░реНрдХрд╛рдЗрдиреНрдЫред рдЕрд░реНрдХреЛ рдЦрдгреНрдбрдорд╛ рддреНрд░реБрдЯрд┐ рдирдореНрдмрд░рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫред

- SECOMP_RET_TRACE - рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ ptrace рдЯреНрд░реЗрд╕рд░рд▓рд╛рдИ рд╕реВрдЪрд┐рдд рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ - PTRACE_O_TRACESECCOMP рддреНрдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЗрд░реНрди рд░ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реБрдБрджрд╛ рдЕрд╡рд░реЛрдз рдЧрд░реНрдиред рдпрджрд┐ рдЯреНрд░реЗрд╕рд░ рдЬрдбрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рднрдиреЗ, рддреНрд░реБрдЯрд┐ рдлрд░реНрдХрд╛рдЗрдиреНрдЫ, рддреНрд░реБрдЯрд┐ -ENOSYS рдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдЫреИрдиред

- SECOMP_RET_LOG - рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рд╕рдорд╛рдзрд╛рди рднрдпреЛ рд░ рд▓рдЧ рдЧрд░рд┐рдпреЛред

- SECOMP_RET_ALLOW - рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдорд╛рддреНрд░ рдЕрдиреБрдорддрд┐ рдЫред

ptrace рдЯреНрд░реЗрд╕ рднрдирд┐рдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рдЯреНрд░реЗрд╕рд┐рдЩ рдореЗрдХрд╛рдирд┐рдЬрдорд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рд╣реЛ, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд╛рдИ рдирд┐рдЧрд░рд╛рдиреА рд░ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рдХреЛ рд╕рд╛рдеред рдЯреНрд░реЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдорд▓реЗ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд╛рдИ рдкреНрд░рднрд╛рд╡ рдкрд╛рд░реНрди рд╕рдХреНрдЫ рд░ рдЯреНрд░реЗрд╕реАрдХреЛ рдореЗрдореЛрд░реА рджрд░реНрддрд╛рд╣рд░реВ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрди рд╕рдХреНрдЫред Seccomp рд╕рдиреНрджрд░реНрднрдорд╛, ptrace рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рдЬрдм SECOMP_RET_TRACE рд╕реНрдерд┐рддрд┐ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдЧрд░рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдЯреНрд░реЗрд╕рд░рд▓реЗ рдкреНрд░рдгрд╛рд▓реА рдХрд▓рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд░ рдЖрдлреНрдиреИ рддрд░реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрдирдмрд╛рдЯ рд░реЛрдХреНрди рд╕рдХреНрдЫред

Seccomp рддреНрд░реБрдЯрд┐рд╣рд░реВ

рд╕рдордп-рд╕рдордпрдорд╛, Seccomp рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреБрд╣реБрдиреЗрдЫ, рдЬреБрди SECOMP_RET_ERRNO рдкреНрд░рдХрд╛рд░рдХреЛ рдлрд┐рд░реНрддреА рдорд╛рдирджреНрд╡рд╛рд░рд╛ рдкрд╣рд┐рдЪрд╛рди рдЧрд░рд┐рдиреНрдЫред рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрди, seccomp рдкреНрд░рдгрд╛рд▓реА рдХрд▓ 1 рдХреЛ рд╕рдЯреНрдЯрд╛ -0 рдлрд░реНрдХрд╛рдЙрдиреЗрдЫред

рдирд┐рдореНрди рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕рдореНрднрд╡ рдЫрдиреН:

- EACCESS - рдХрд▓рд░рд▓рд╛рдИ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рдЫреИрдиред рдпреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╣реБрдиреНрдЫ рдХрд┐рдирднрдиреЗ рдпрд╕рдорд╛ CAP_SYS_ADMIN рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░рд╣рд░реВ рдЫреИрдирдиреН рд╡рд╛ prctl рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ no_new_privs рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди (рд╣рд╛рдореА рдпрд╕ рдмрд╛рд░реЗ рдкрдЫрд┐ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ);

тАФ EFAULT тАФ рдкрд╛рд░рд┐рдд рддрд░реНрдХрд╣рд░реВ (seccomp_data рд╕рдВрд░рдЪрдирд╛рдорд╛ args) рд╕рдБрдЧ рд╡реИрдз рдареЗрдЧрд╛рдирд╛ рд╣реБрдБрджреИрди;

- EINVAL - рдпрд╣рд╛рдБ рдЪрд╛рд░ рдХрд╛рд░рдг рд╣реБрди рд╕рдХреНрдЫ:

- рдЕрдиреБрд░реЛрдз рдЧрд░рд┐рдПрдХреЛ рдЕрдкрд░реЗрд╢рди рдЕрдЬреНрдЮрд╛рдд рдЫ рд╡рд╛ рд╣рд╛рд▓рдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдЫреИрди;

- рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЭрдгреНрдбрд╛рд╣рд░реВ рдЕрдиреБрд░реЛрдз рдЧрд░рд┐рдПрдХреЛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдиреНрдп рдЫреИрдирдиреН;

-рд╕рдЮреНрдЪрд╛рд▓рдирд▓реЗ BPF_ABS рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рддрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдлрд╕реЗрдЯрдорд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреН, рдЬреБрди seccomp_data рд╕рдВрд░рдЪрдирд╛рдХреЛ рдЖрдХрд╛рд░ рднрдиреНрджрд╛ рдмрдвреА рд╣реБрди рд╕рдХреНрдЫ;

-рдлрд┐рд▓реНрдЯрд░рдорд╛ рдкрдард╛рдЗрдПрдХрд╛ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХрддрдо рднрдиреНрджрд╛ рдмрдвреА рдЫ;

тАФ ENOMEM тАФ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдЫреИрди;

- EOPNOTSUPP - рдЕрдкрд░реЗрд╕рдирд▓реЗ рд╕рдВрдХреЗрдд рдЧрд░реНтАНрдпреЛ рдХрд┐ SECOMP_GET_ACTION_AVAIL рд╕рдБрдЧ рдХрд╛рд░реНрдп рдЙрдкрд▓рдмреНрдз рдерд┐рдпреЛ, рддрд░ рдХрд░реНрдиреЗрд▓рд▓реЗ рддрд░реНрдХрд╣рд░реВрдорд╛ рдлрд┐рд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди;

тАФ ESRCH тАФ рдЕрд░реНрдХреЛ рд╕реНрдЯреНрд░рд┐рдо рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрджрд╛ рд╕рдорд╕реНрдпрд╛ рдЖрдпреЛ;

- ENOSYS - SECOMP_RET_TRACE рдХрд╛рд░реНрдпрдорд╛ рд╕рдВрд▓рдЧреНрди рдХреБрдиреИ рдЯреНрд░реЗрд╕рд░ рдЫреИрдиред

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

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

BPF 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 рдкреНрд░рдХрд╛рд░реНрдп рд╣реЛред рдкрд╣рд┐рд▓реЛ рднрд╛рдЧрд▓реЗ рд╣рд╛рдореНрд░реЛ BPF рдлрд┐рд▓реНрдЯрд░рд┐рдЩ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд╕реВрдЪреА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ:

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, arch))) - рдкреНрд░рдгрд╛рд▓реА рд▓реЛрдб рд╣реБрдиреНрдЫ рд░ BPF_LD рдмрд╛рдЯ BPF_W рд╢рдмреНрджрдХреЛ рд░реВрдкрдорд╛ рдЬрдореНрдорд╛ рд╣реБрдиреНрдЫ, рдкреНрдпрд╛рдХреЗрдЯ рдбреЗрдЯрд╛ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдлрд╕реЗрдЯ BPF_ABS рдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрдиреНрдЫред

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

- 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 рдЪрд░рдХреЛ рдорд╛рдирд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдЫред рдпрджрд┐ рддрд┐рдиреАрд╣рд░реВ рдмрд░рд╛рдмрд░ рдЫрдиреН рднрдиреЗ, рдЕрд░реНрдХреЛ рдирд┐рд░реНрджреЗрд╢рдирдорд╛ рдЬрд╛рдиреНрдЫ рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдЕрд╕рдХреНрд╖рдо рдкрд╛рд░реНрдЫ, рдЕрдиреНрдпрдерд╛ SECOMP_RET_ALLOW рд╕рдБрдЧ рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ERRNO | (рддреНрд░реБрдЯрд┐ рд░ SECCOMP_RET_DATA)) - BPF_RET рд╕рдБрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рдЧрд░реНрджрдЫ рд░ рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рдЪрд░рдмрд╛рдЯ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд╕рд╛рде рддреНрд░реБрдЯрд┐ SECOMP_RET_ERRNO рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫред

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - BPF_RET рдХреЛ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рдЧрд░реНрджрдЫ рд░ SECCOMP_RET_ALLOW рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рдгрд╛рд▓реА рдХрд▓рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

SECOMP CBPF рд╣реЛ
рддрдкрд╛рдЗрдБ рд╕реЛрдЪрд┐рд░рд╣рдиреБ рднрдПрдХреЛ рд╣реБрди рд╕рдХреНрдЫ рдХрд┐рди рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд╕реВрдЪреА рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ ELF рд╡рд╕реНрддреБ рд╡рд╛ JIT рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ C рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд╕рдЯреНрдЯрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рдпрд╕рдХрд╛ рджреБрдИрд╡рдЯрд╛ рдХрд╛рд░рдг рдЫрдиреНред

тАв рд╕рдмреИрднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, 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;

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

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

install_filter рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдХреБрд░рд╛ рдмрд╛рдБрдХреА рдЫ - рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдлреИ рд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН! рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрдореНрдкреНрдпреБрдЯрд┐рдЩ рдореЛрдбрдорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдкрдХреЛ рд░реВрдкрдорд╛ PR_SET_SECCOMP рд▓рд┐рдБрджреИ prctl рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдореЛрдбрд▓рд╛рдИ SECOMP_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]);
 }

рд╕реБрд░реБ рдЧрд░реМрдВред рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдХреНрд▓рд╛рдЩреНрдЧ рд╡рд╛ 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)

рдЕрдм рддрдкрд╛рдИрдВрд▓реЗ рд╕реЗрдХрдореНрдк рдмреАрдкреАрдПрдлрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреА рдмреБрдЭреНрдиреБрднрдпреЛ рд░ рддрдкрд╛рдИрдВ рдпрд╕рдХреЛ рд╕рд╛рде рдХреЗ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рдЫред рддрд░ рдХреЗ рддрдкрд╛рдЗрдБ cBPF рдХреЛ рд╕рдЯреНрдЯрд╛ eBPF рд╕рдБрдЧ рдпрд╕рдХреЛ рдкреВрд░реНрдг рд╢рдХреНрддрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рди рдЪреАрдЬ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрди?

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

BPF LSM рдЬрд╛рд▓

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

рд▓реЗрдЦреНрдиреЗ рд╕рдордпрдорд╛, рдХрд░реНрдиреЗрд▓рд╕рдБрдЧ 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 тАФ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ BPF рдкреНрд░рдгрд╛рд▓реА рдХрд▓рд╣рд░реВрдХреЛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдЬрд╛рдБрдЪ рдЧрд░реНрдЫ;

- security_bpf_map - рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рдЬрдм рдХрд░реНрдиреЗрд▓рд▓реЗ рдирдХреНрд╕рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдлрд░реНрдХрд╛рдЙрдБрдЫ;

- security_bpf_prog - рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рдЬрдм рдХрд░реНрдиреЗрд▓рд▓реЗ eBPF рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдлрд░реНрдХрд╛рдЙрдБрдЫ;

тАФ security_bpf_map_alloc тАФ BPF рдирдХреНрд╕рд╛ рднрд┐рддреНрд░рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ;

- security_bpf_map_free - BPF рдирдХреНрд╕рд╛ рднрд┐рддреНрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░ рдЦрд╛рд▓реА рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ;

тАФ security_bpf_prog_alloc тАФ BPF рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рднрд┐рддреНрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рдЫреИрди рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ;

- security_bpf_prog_free - BPF рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рднрд┐рддреНрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░ рдЦрд╛рд▓реА рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред

рдЕрдм, рдпреА рд╕рдмреИ рджреЗрдЦреЗрд░, рд╣рд╛рдореА рдмреБрдЭреНрдЫреМрдВ: LSM BPF рдЗрдиреНрдЯрд░рд╕реЗрдкреНрдЯрд░рд╣рд░реВрдХреЛ рдкрдЫрд╛рдбрд┐рдХреЛ рд╡рд┐рдЪрд╛рд░ рдпреЛ рд╣реЛ рдХрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ eBPF рд╡рд╕реНрддреБрд▓рд╛рдИ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрди рд╕рдХреНрдЫрдиреН, рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрджреИ рдХрд┐ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рднрдПрдХрд╛рд╣рд░реВрд▓реЗ рдорд╛рддреНрд░ рдХрд╛рд░реНрдб рд░ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВрдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред

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

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

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

рдбреЗрднрд┐рдб рдХрд╛рд▓рд╛рд╡реЗрд░рд╛ Netlify рдорд╛ CTO рд╣реБрдиреБрд╣реБрдиреНрдЫред рдЙрд╣рд╛рдБрд▓реЗ рдбрдХрд░ рд╕рдорд░реНрдердирдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБрднрдпреЛ рд░ Runc, Go рд░ BCC рдЙрдкрдХрд░рдгрд╣рд░реВ, рд╕рд╛рдереИ рдЕрдиреНрдп рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕рдорд╛ рдпреЛрдЧрджрд╛рди рдЧрд░реНрдиреБрднрдпреЛред рдбрдХрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рд░ рдбрдХрд░ рдкреНрд▓рдЧрдЗрди рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдордХреЛ рд╡рд┐рдХрд╛рд╕рдорд╛ рдЙрдирдХреЛ рдХрд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдкрд░рд┐рдЪрд┐рддред рдбреЗрднрд┐рдб рдЬреНрд╡рд╛рд▓рд╛ рдЧреНрд░рд╛рдлрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдзреЗрд░реИ рднрд╛рд╡реБрдХ рдЫ рд░ рд╕рдзреИрдВ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрди рдЦреЛрдЬрд┐рд░рд╣реЗрдХреЛ рдЫред

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

┬╗ рдкреБрд╕реНрддрдХрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдпрд╣рд╛рдБ рдкрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ рдкреНрд░рдХрд╛рд╢рдХрдХреЛ тАЛтАЛрд╡реЗрдмрд╕рд╛рдЗрдЯ
┬╗ рд╕рд╛рдордЧреНрд░реАрдХреЛ рддрд╛рд▓рд┐рдХрд╛
┬╗ рдЕрдВрд╢

Khabrozhiteley рдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдкрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ 25% рдЫреБрдЯ - рд▓рд┐рдирдХреНрд╕

рдкреБрд╕реНрддрдХрдХреЛ рдкреЗрдкрд░ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рднреБрдХреНрддрд╛рдиреА рдЧрд░реЗрдкрдЫрд┐, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЛрдирд┐рдХ рдкреБрд╕реНрддрдХ рдЗ-рдореЗрд▓ рдорд╛рд░реНрдлрдд рдкрдард╛рдЗрдиреЗрдЫред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди