рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реБрд░рдХреНрд╖рд╛, рдпрд╕рдХреЛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рд░ 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