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

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

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рд╕реБрд░рдХреНрд╖рд╛, рддреНрдпрд╛рдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдЖрдгрд┐ Seccomp

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

рд▓рд┐рдирдХреНрд╕ рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреА рдореЙрдбреНрдпреБрд▓реНрд╕ (LSM) рд╣реЗ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЖрд╣реЗ рдЬреЗ рдлрдВрдХреНрд╢рдиреНрд╕рдЪрд╛ рдПрдХ рд╕рдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рдЬреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рд╡рд┐рд╡рд┐рдз рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреЗрд▓реНрд╕ рдкреНрд░рдорд╛рдгрд┐рдд рдкрджреНрдзрддреАрдиреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. LSM рдереЗрдЯ рдХрд░реНрдирд▓ рд╕реЛрд░реНрд╕ рдЯреНрд░реАрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдЬрд╕реЗ рдХреА Apparmor, SELinux рдЖрдгрд┐ Tomoyo.

рдЪрд▓рд╛ рд▓рд┐рдирдХреНрд╕рдЪреНрдпрд╛ рдХреНрд╖рдорддрд╛рдВрд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛.

рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ

Linux рдЪреНрдпрд╛ рдХреНрд╖рдорддрд╛рдВрдЪреЗ рд╕рд╛рд░ рд╣реЗ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдирд╕рд▓реЗрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреНрдпрд╛ рд╣реЗрддреВрд╕рд╛рдареА 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 (рд╢реЗрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ) рд╣реЗ рдПрдХ рд╕рд╛рдзрди рдЖрд╣реЗ рдЬреЗ рдХреНрд╖рдорддрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд╕рд╣ рд╢реЗрд▓ рдЪрд╛рд▓рд╡рддреЗ.

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдзреАрдЪ рдирдореВрдж рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд╕рдВрдкреВрд░реНрдг рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдгреНрдпрд╛рдРрд╡рдЬреА, рддреБрдореНрд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЗрддрд░ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреАрдВрд╕рд╣ 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 рдзреНрд╡рдЬрд╛рдиреЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╢реЗрд╡рдЯреА, рдЖрдореНрд╣рд╛рд▓рд╛ p рд╕рд╣ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд╕рдХреНрд╖рдо рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ (рдЖрдореНрд╣реА рд╣реЗ UID рди рдмрджрд▓рддрд╛ рдХреЗрд▓реЗ рдЖрд╣реЗ). рд╣реЗ cap_net_bind_service+eip рд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддреЗ.

рддреБрдореНрд╣реА ss рд╡рд╛рдкрд░реВрди рдирд┐рдХрд╛рд▓ рддрдкрд╛рд╕реВ рд╢рдХрддрд╛. рдкреГрд╖реНрдард╛рд╡рд░ рдмрд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдЙрдЯрдкреБрдЯ рдереЛрдбреЗ рд▓рд╣рд╛рди рдХрд░реВ, рдкрд░рдВрддреБ рддреЗ 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

рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд рдЖрдореНрд╣реА рдХреЕрдкрд╢ рд╡рд╛рдкрд░рд▓реЗ, рдкрд░рдВрддреБ рддреБрдореНрд╣реА рд▓рд┐рдмрдХреЕрдк рд╡рд╛рдкрд░реВрди рд╢реЗрд▓ рд▓рд┐рд╣реВ рд╢рдХрддрд╛. рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА, 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

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 рдореНрд╣рдгрдЬреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЧрдгрди рдЖрдгрд┐ Linux рдХрд░реНрдирд▓рдордзреНрдпреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗрд▓рд╛ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░ рдЖрд╣реЗ рдЬреЛ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ. Seccomp рдХреНрд╖рдорддрд╛рдВрдордзреНрдпреЗ рд▓рд┐рдирдХреНрд╕рд╢реА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рдпреЗрдд рдЕрд╕рд▓реА рддрд░реА, рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рддреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рддреЗ рдЕрдзрд┐рдХ рд▓рд╡рдЪрд┐рдХ рдмрдирд╡рддреЗ.

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

Seccomp рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрджреНрдзрдд SECOMP_MODE_FILTER рдореЛрдбрдордзреНрдпреЗ рдХрд╛рд░реНрдпрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ BPF рдлрд┐рд▓реНрдЯрд░рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреЕрдХреЗрдЯреНрд╕рдкреНрд░рдорд╛рдгреЗрдЪ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

Seccomp рдлрд┐рд▓реНрдЯрд░реНрд╕ prctl рд╡рд╛рдкрд░реВрди PR_SET_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 рдкреЕрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдлрд┐рд▓реНрдЯрд░рдиреЗ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдХрд░реНрдирд▓рд▓рд╛ рдкреБрдвреЗ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╕рд╛рдВрдЧрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рд░рд┐рдЯрд░реНрди рд╡реНрд╣реЕрд▓реНрдпреВрдВрдкреИрдХреА рдПрдХ (рд╕реНрдерд┐рддреА рдХреЛрдб) рджреНрд╡рд╛рд░реЗ рд╡реНрдпрдХреНрдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

- 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 рд╕рдВрджрд░реНрднрд╛рдордзреНрдпреЗ, SECOMP_RET_TRACE рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдбрджреНрд╡рд╛рд░реЗ рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реНрдпрд╛рд╡рд░ ptrace рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рддреНрдпрд╛рдореБрд│реЗ рдЯреНрд░реЗрд╕рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдгреНрдпрд╛рдкрд╛рд╕реВрди рд░реЛрдЦреВ рд╢рдХрддреЛ рдЖрдгрд┐ рд╕реНрд╡рддрдГрдЪреЗ рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддреЛ.

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 рд╡рд░ рдкреБрдвреАрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рд╡рд░ рдЙрдбреА рдорд╛рд░рддреЗ, рдЕрдиреНрдпрдерд╛ рдХрдорд╛рди рдЬреБрд│рдд рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ рддреНрд░реБрдЯреА рдЯрд╛рдХрдгреНрдпрд╛рд╕рд╛рдареА рдСрдлрд╕реЗрдЯ 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 рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рд╢реА рддреБрд▓рдирд╛ рдХрд░рддреЗ. рдЬрд░ рддреЗ рд╕рдорд╛рди рдЕрд╕рддреАрд▓, рддрд░ рдкреБрдвреАрд▓ рд╕реВрдЪрдирд╛рдВрдХрдбреЗ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЕрдХреНрд╖рдо рдХрд░рддреЗ, рдЕрдиреНрдпрдерд╛ 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;

рд╕реЙрдХреЗрдЯ_рдлрд┐рд▓реНрдЯрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдордзреНрдпреЗ рдлрд┐рд▓реНрдЯрд░ рдХреЛрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдб рдЖрдгрд┐ рдлрд┐рд▓реНрдЯрд░рдЪреА рдЧрдгрдирд╛ рдХреЗрд▓реЗрд▓реА рд▓рд╛рдВрдмреА рдЕрд╕рд▓реЗрд▓рд╛ рд╕реЙрдХ_рдПрдлрдкреНрд░реЛрдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирдВрддрд░ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рдШреЛрд╖рдгрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпреБрдХреНрддрд┐рд╡рд╛рдж рдореНрд╣рдгреВрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

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

install_filter рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рдлрдХреНрдд рдПрдХ рдЧреЛрд╖реНрдЯ рдмрд╛рдХреА рдЖрд╣реЗ - рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрд╡рддрдГ рд▓реЛрдб рдХрд░рд╛! рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА prctl рд╡рд╛рдкрд░рддреЛ, рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЧрдгрдХреАрдп рдореЛрдбрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА PR_SET_SECCOMP рд╣рд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди рдШреЗрддреЛ. рдордЧ рдЖрдореНрд╣реА рдореЛрдбрд▓рд╛ 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]);
 }

рдЪрд▓рд╛ рд╕реБрд░реВ рдХрд░реБрдпрд╛. рдЖрдордЪрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА 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 рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рд╕рдордЬрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдХрд╛рдп рдХрд░реВ рд╢рдХрддрд╛ рдпрд╛рдЪреА рдЪрд╛рдВрдЧрд▓реА рдХрд▓реНрдкрдирд╛ рдЖрд╣реЗ. рдкрдг рддреБрдореНрд╣рд╛рд▓рд╛ cBPF рдРрд╡рдЬреА eBPF рдЪреА рдкреВрд░реНрдг рд╢рдХреНрддреА рд╡рд╛рдкрд░реВрди рддреЗрдЪ рд╕рд╛рдзреНрдп рдХрд░рд╛рдпрд▓рд╛ рдЖрд╡рдбрдгрд╛рд░ рдирд╛рд╣реА рдХрд╛?

eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдмрджреНрджрд▓ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛рдирд╛, рдмрд╣реБрддреЗрдХ рд▓реЛрдХ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛рдд рдХреА рддреЗ рдлрдХреНрдд рддреЗ рд▓рд┐рд╣рд┐рддрд╛рдд рдЖрдгрд┐ рдкреНрд░рд╢рд╛рд╕рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░рд╛рдВрд╕рд╣ рд▓реЛрдб рдХрд░рддрд╛рдд. рд╣реЗ рд╡рд┐рдзрд╛рди рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рдЦрд░реЗ рдЕрд╕рд▓реЗ рддрд░реА, рдХрд░реНрдирд▓ рд╡рд┐рд╡рд┐рдз рд╕реНрддрд░рд╛рдВрд╡рд░ eBPF рд╡рд╕реНрддреВрдВрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпрдВрддреНрд░рдгрд╛рдВрдЪрд╛ рд╕рдВрдЪ рд▓рд╛рдЧреВ рдХрд░рддреЗ. рдпрд╛ рдпрдВрддреНрд░рдгрд╛рдВрдирд╛ BPF LSM рд╕рд╛рдкрд│реЗ рдореНрд╣рдгрддрд╛рдд.

BPF LSM рд╕рд╛рдкрд│реЗ

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

рд▓реЗрдЦрдирд╛рдЪреНрдпрд╛ рд╡реЗрд│реА, рдХрд░реНрдирд▓рдордзреНрдпреЗ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдорд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдд рд╣реБрдХ рдЖрд╣реЗрдд рдЖрдгрд┐ SELinux рд╣реЗ рдПрдХрдореЗрд╡ рдЕрдВрдЧрднреВрдд LSM рдЖрд╣реЗ рдЬреЗ рддреНрдпрд╛рдВрдирд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ.

рд╕рд╛рдкрд│реНрдпрд╛рдВрдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдлрд╛рдЗрд▓рдордзреАрд▓ рдХрд░реНрдирд▓ рдЯреНрд░реАрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ/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% рд╕реВрдЯ - linux

рдкреБрд╕реНрддрдХрд╛рдЪреА рдХрд╛рдЧрджреА рдЖрд╡реГрддреНрддреА рднрд░рд▓реНрдпрд╛рдирдВрддрд░, рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдкреБрд╕реНрддрдХ рдИ-рдореЗрд▓рджреНрд╡рд╛рд░реЗ рдкрд╛рдард╡рд▓реЗ рдЬрд╛рдИрд▓.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛