āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž, āĻāĻ° āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻāĻŦāĻ āĻ¸ā§āĻāĻŽāĻĒ
BPF āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻļā§āĻ˛āĻ¤āĻž, āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž, āĻŦāĻž āĻāĻ¤āĻŋ āĻŦāĻ˛āĻŋāĻĻāĻžāĻ¨ āĻāĻžāĻĄāĻŧāĻž āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻāĻ°āĻžāĻ° āĻāĻāĻāĻŋ āĻļāĻā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§ āĻāĻĒāĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻāĻ āĻāĻžāĻ°āĻŖā§, āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§āĻ°āĻž āĻā§āĻŦā§āĻāĻŋāĻ˛ āĻ¯ā§ BPF āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻā§āĻ˛āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ Seccomp āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°ā§ Seccomp-āĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨āĻ¤āĻž āĻāĻ¨ā§āĻ¨āĻ¤ āĻāĻ°āĻ¤ā§ āĻāĻ° āĻŦāĻšā§āĻŽā§āĻā§āĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻ§āĻžāĻ°āĻŖāĻž āĻšāĻŦā§, āĻ¯āĻž Seccomp BPF āĻ¨āĻžāĻŽā§āĻ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤āĨ¤ āĻāĻ āĻ āĻ§ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻāĻŽāĻ°āĻž Seccomp āĻāĻŋ āĻāĻŦāĻ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¤āĻž āĻŦā§āĻ¯āĻžāĻā§āĻ¯āĻž āĻāĻ°āĻŦāĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻĒāĻ¨āĻŋ āĻļāĻŋāĻāĻŦā§āĻ¨ āĻāĻŋāĻāĻžāĻŦā§ BPF āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ Seccomp āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻ˛āĻŋāĻāĻ¤ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻ¸ā§āĻ°āĻā§āĻˇāĻž āĻŽāĻĄāĻŋāĻāĻ˛āĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻ āĻ¨ā§āĻ¤āĻ°ā§āĻā§āĻā§āĻ¤ āĻŦāĻŋāĻ˛ā§āĻ-āĻāĻ¨ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻšā§āĻāĻā§āĻ˛āĻŋ āĻĻā§āĻāĻŦāĨ¤
āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻ¸āĻŋāĻāĻŋāĻāĻ°āĻŋāĻāĻŋ āĻŽāĻĄāĻŋāĻāĻ˛ (LSM) āĻšāĻ˛ āĻāĻāĻāĻŋ āĻĢā§āĻ°ā§āĻŽāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ¯āĻž āĻĢāĻžāĻāĻļāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§ āĻ¯āĻž āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻŽāĻŋāĻ¤ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻŽāĻĄā§āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ LSM āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¸ā§āĻ°ā§āĻ¸ āĻā§āĻ°āĻŋāĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¯ā§āĻŽāĻ¨ Apparmor, SELinux āĻāĻŦāĻ TomoyoāĨ¤
āĻāĻ˛ā§āĻ¨ āĻļā§āĻ°ā§ āĻāĻ°āĻž āĻ¯āĻžāĻ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§āĻ° āĻā§āĻˇāĻŽāĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻ˛ā§āĻāĻ¨āĻž āĻāĻ°ā§āĨ¤
āĻ¸ā§āĻ¯ā§āĻ
āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§āĻ° āĻā§āĻˇāĻŽāĻ¤āĻžāĻ° āĻ¸āĻžāĻ°āĻŽāĻ°ā§āĻŽ āĻšāĻ˛ āĻ¯ā§ āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻžāĻ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻŦāĻŋāĻšā§āĻ¨ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻāĻŋāĻ¤ā§ āĻšāĻŦā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸ā§āĻ āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§ āĻ¸ā§āĻ¯ā§āĻāĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ¨āĻž āĻāĻ°ā§, āĻŦāĻž āĻ āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻŋāĻā§ āĻŦāĻŋāĻļā§āĻˇ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻāĻ°ā§, āĻāĻā§āĻ°āĻŽāĻŖā§āĻ° āĻ¸āĻŽā§āĻāĻžāĻŦāĻ¨āĻž āĻšā§āĻ°āĻžāĻ¸ āĻāĻ°ā§ āĻāĻŦāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻŋāĻā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻžāĻ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°āĻžāĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻ¯āĻŧāĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻ¯āĻĻāĻŋ āĻāĻĒāĻ¨āĻžāĻ° āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋāĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĒā§āĻ°ā§āĻ āĻā§āĻ˛āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¯āĻŧ, 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 â āĻ°ā§āĻ āĻ ā§āĻ¯āĻžāĻāĻžāĻāĻ¨ā§āĻ āĻĨā§āĻā§ āĻ¸ā§āĻ¯ā§āĻāĻ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŽāĻ°āĻž āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻž āĻā§āĻˇāĻŽāĻ¤āĻž āĻ°āĻžāĻāĻ¤ā§ āĻāĻžāĻāĨ¤
- âāĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§=âāĻā§āĻ¨āĻ āĻ¨āĻ¯āĻŧâ â āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻļā§āĻˇ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻā§āĻ āĻšāĻŦā§ āĻ¨āĻžāĨ¤
- â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
āĻāĻ āĻāĻĻāĻžāĻšāĻ°āĻŖā§ āĻāĻŽāĻ°āĻž capsh āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻāĻŋ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻĒāĻ¨āĻŋ 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
āĻāĻāĻŋ āĻ¨āĻŋāĻā§āĻ° āĻŽāĻ¤ āĻāĻŋāĻā§ āĻāĻāĻāĻĒā§āĻ āĻāĻ°āĻŦā§ āĻ¯āĻĻāĻŋ 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, āĻāĻāĻŋ āĻĢāĻžāĻāĻ˛ā§āĻ° āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¸ā§āĻ°ā§āĻ¸ āĻā§āĻĄā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻ§ā§āĻ°ā§āĻŦāĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ Include/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 āĻā§āĻˇāĻŽāĻ¤āĻž āĻĻā§āĻŦā§, āĻāĻāĻŋ āĻĄāĻžāĻŽāĻŋ0 āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ˛āĻŋāĻā§āĻ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻžāĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻŦā§āĨ¤
āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻŦāĻŋāĻāĻžāĻā§ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻŋāĻāĻ¯āĻŧā§āĻ° āĻŽāĻ¤ā§ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻā§āĻ˛āĻŋ āĻā§āĻāĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¤āĻž āĻĻā§āĻāĻžāĻ¯āĻŧ, āĻ¤āĻŦā§ āĻāĻāĻāĻŋ āĻāĻŋāĻ¨ā§āĻ¨ āĻā§āĻļāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¯āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋāĻā§ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻāĻŋāĻāĻāĻžāĻŦā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤
āĻ¸ā§āĻāĻāĻŽā§āĻĒ
Seccomp āĻšāĻ˛ āĻ¸āĻŋāĻāĻŋāĻāĻ° āĻāĻŽā§āĻĒāĻŋāĻāĻāĻŋāĻ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ¸ā§āĻ¤āĻ° āĻ¯āĻž āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯āĻž āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻĻā§āĻ° āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ˛ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋāĻ Seccomp āĻā§āĻˇāĻŽāĻ¤āĻžāĻ° āĻĻāĻŋāĻ āĻĨā§āĻā§ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¤ā§āĻ˛āĻ¨ā§āĻ¯āĻŧ, āĻ¤āĻŦā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ˛ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻā§āĻˇāĻŽāĻ¤āĻž āĻāĻāĻŋāĻā§ āĻ¤āĻžāĻĻā§āĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻ āĻ¨ā§āĻ āĻŦā§āĻļāĻŋ āĻ¨āĻŽāĻ¨ā§āĻ¯āĻŧ āĻāĻ°ā§ āĻ¤ā§āĻ˛ā§āĨ¤
Seccomp āĻāĻŦāĻ Linux āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻā§āĻ˛āĻŋ āĻĒāĻžāĻ°āĻ¸ā§āĻĒāĻ°āĻŋāĻāĻāĻžāĻŦā§ āĻāĻāĻā§āĻāĻŋāĻ¯āĻŧāĻž āĻ¨āĻ¯āĻŧ āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻāĻāĻ¯āĻŧ āĻĒāĻ¨ā§āĻĨāĻž āĻĨā§āĻā§ āĻāĻĒāĻā§āĻ¤ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻ¸āĻžāĻĨā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻā§ CAP_NET_ADMIN āĻā§āĻˇāĻŽāĻ¤āĻž āĻĻāĻŋāĻ¤ā§ āĻāĻžāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŋāĻā§ āĻ¸āĻā§āĻ āĻ¸āĻāĻ¯ā§āĻ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻžāĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻŦā§āĻ¨ āĻ¨āĻž, āĻ ā§āĻ¯āĻžāĻāĻ¸ā§āĻĒā§āĻ āĻāĻŦāĻ āĻ ā§āĻ¯āĻžāĻāĻ¸ā§āĻĒā§āĻ4 āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ˛ āĻŦā§āĻ˛āĻ āĻāĻ°ā§āĨ¤
Seccomp āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ SECOMP_MODE_FILTER āĻŽā§āĻĄā§ āĻāĻžāĻ āĻāĻ°āĻž BPF āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋāĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§, āĻāĻŦāĻ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ˛ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻŋāĻ āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ¤ā§āĻ āĻ¸āĻā§āĻāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤
Seccomp āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋ PR_SET_SECCOMP āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ prctl āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋ āĻāĻāĻāĻŋ 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 āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻ°āĻŋāĻāĻžāĻ°ā§āĻ¨ āĻŽāĻžāĻ¨ā§āĻ° āĻ āĻāĻļāĻāĻŋ errno āĻŽāĻžāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ° āĻ¸ā§āĻĨāĻžāĻ¨ā§ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¤ā§āĻ°ā§āĻāĻŋāĻ° āĻāĻžāĻ°āĻŖā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻāĻ°ā§, āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻ¤ā§āĻ°ā§āĻāĻŋāĻ° āĻŽāĻžāĻ¨ āĻĢā§āĻ°āĻ¤ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¤ā§āĻ°ā§āĻāĻŋ āĻ¸āĻāĻā§āĻ¯āĻžāĻ° āĻāĻāĻāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻŦāĻŋāĻāĻžāĻā§ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧ.
- 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 āĻšāĻ˛ āĻāĻāĻāĻŋ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋ āĻ¯āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŦāĻā§āĻ¸ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻŋāĻāĻžāĻļ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤ āĻāĻāĻ¨ āĻĻā§āĻāĻž āĻ¯āĻžāĻ 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;
āĻ¸āĻā§āĻ_āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻāĻžāĻ āĻžāĻŽā§āĻ¤ā§ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻā§āĻĄ āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻžāĻ° āĻĒāĻ°ā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻā§āĻĄ āĻāĻŦāĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°ā§āĻ° āĻāĻŖāĻ¨āĻžāĻā§āĻ¤ āĻĻā§āĻ°ā§āĻā§āĻ¯ āĻ¸āĻš āĻāĻāĻāĻŋ sock_fprog āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻ āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ°āĻāĻŋ āĻĒāĻ°ā§ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻā§āĻˇāĻŖāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¯ā§āĻā§āĻ¤āĻŋ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨:
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% āĻāĻžāĻĄāĻŧ - āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸
āĻŦāĻāĻāĻŋāĻ° āĻāĻžāĻāĻā§āĻ° āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖā§āĻ° āĻ
āĻ°ā§āĻĨ āĻĒā§āĻ°āĻĻāĻžāĻ¨ā§āĻ° āĻĒāĻ°ā§, āĻāĻāĻāĻŋ āĻāĻ˛ā§āĻāĻā§āĻ°āĻ¨āĻŋāĻ āĻŦāĻ āĻ-āĻŽā§āĻāĻ˛ā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻŦā§āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com