ืกืคืจ "BPF ืœื ื™ื˜ื•ืจ ืœื™ื ื•ืงืก"

ืกืคืจ "BPF ืœื ื™ื˜ื•ืจ ืœื™ื ื•ืงืก"ืฉืœื•ื ืชื•ืฉื‘ื™ ื—ื‘ืจื•! ื”ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช BPF ื”ื™ื ืื—ื“ ื”ืžืจื›ื™ื‘ื™ื ื”ื—ืฉื•ื‘ื™ื ื‘ื™ื•ืชืจ ืฉืœ ืœื™ื‘ืช ืœื™ื ื•ืงืก. ืฉื™ืžื•ืฉ ื ื›ื•ืŸ ื‘ื• ื™ืืคืฉืจ ืœืžื”ื ื“ืกื™ ืžืขืจื›ืช ืœืžืฆื•ื ืชืงืœื•ืช ื•ืœืคืชื•ืจ ืืคื™ืœื• ืืช ื”ื‘ืขื™ื•ืช ื”ืžื•ืจื›ื‘ื•ืช ื‘ื™ื•ืชืจ. ืชืœืžื“ ื›ื™ืฆื“ ืœื›ืชื•ื‘ ืชื•ื›ื ื™ื•ืช ื”ืžื ื˜ืจื•ืช ื•ืžืฉื ื•ืช ืืช ื”ืชื ื”ื’ื•ืช ื”ืœื™ื‘ื”, ื›ื™ืฆื“ ืœื™ื™ืฉื ื‘ื‘ื˜ื—ื” ืงื•ื“ ืœื ื™ื˜ื•ืจ ืื™ืจื•ืขื™ื ื‘ืงืจื ืœ ื•ืขื•ื“ ื•ืขื•ื“. ื“ื™ื•ื•ื™ื“ ืงืœืื•ื•ืจื” ื•ืœื•ืจื ืฆื• ืคื•ื ื˜ื ื” ื™ืขื–ืจื• ืœืš ืœืคืชื•ื— ืืช ื”ื›ื•ื— ืฉืœ BPF. ื”ืจื—ื‘ ืืช ื”ื™ื“ืข ืฉืœืš ื‘ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื‘ื™ืฆื•ืขื™ื, ืจืฉืชื•ืช, ืื‘ื˜ื—ื”. - ื”ืฉืชืžืฉ ื‘-BPF ื›ื“ื™ ืœืคืงื— ื•ืœืฉื ื•ืช ืืช ื”ื”ืชื ื”ื’ื•ืช ืฉืœ ืœื™ื‘ืช ืœื™ื ื•ืงืก. - ื”ื›ื ืก ืงื•ื“ ืœื ื™ื˜ื•ืจ ืžืื•ื‘ื˜ื— ืฉืœ ืื™ืจื•ืขื™ ืœื™ื‘ื” ืžื‘ืœื™ ืฆื•ืจืš ืœื”ื“ืจ ืžื—ื“ืฉ ืืช ื”ืœื™ื‘ื” ืื• ืœืืชื—ืœ ืืช ื”ืžืขืจื›ืช. - ื”ืฉืชืžืฉ ื‘ื“ื•ื’ืžืื•ืช ืงื•ื“ ื ื•ื—ื•ืช ื‘-C, Go ืื• Python. - ืงื— ืฉืœื™ื˜ื” ืขืœ ื™ื“ื™ ื‘ืขืœื•ืช ืขืœ ืžื—ื–ื•ืจ ื”ื—ื™ื™ื ืฉืœ ืชื•ื›ื ื™ืช BPF.

ืื‘ื˜ื—ืช ืœื™ื‘ืช ืœื™ื ื•ืงืก, ืชื›ื•ื ื•ืชื™ื” ื•-Secomp

BPF ืžืกืคืง ื“ืจืš ืจื‘ืช ืขื•ืฆืžื” ืœื”ืจื—ื™ื‘ ืืช ื”ืœื™ื‘ื” ืžื‘ืœื™ ืœื”ืงืจื™ื‘ ื™ืฆื™ื‘ื•ืช, ืื‘ื˜ื—ื” ืื• ืžื”ื™ืจื•ืช. ืžืกื™ื‘ื” ื–ื•, ืžืคืชื—ื™ ื”ืœื™ื‘ื” ื—ืฉื‘ื• ืฉื–ื” ื™ื”ื™ื” ืจืขื™ื•ืŸ ื˜ื•ื‘ ืœื”ืฉืชืžืฉ ื‘ืจื‘ืกื˜ื™ื•ืช ืฉืœื• ื›ื“ื™ ืœืฉืคืจ ืืช ื‘ื™ื“ื•ื“ ื”ืชื”ืœื™ืš ื‘-Seccomp ืขืœ ื™ื“ื™ ื”ื˜ืžืขืช ืžืกื ื ื™ Seccomp ื”ื ืชืžื›ื™ื ืขืœ ื™ื“ื™ ืชื•ื›ื ื™ื•ืช BPF, ื”ื™ื“ื•ืขื•ืช ื’ื ื‘ืฉื Seccomp BPF. ื‘ืคืจืง ื–ื” ื ืกื‘ื™ืจ ืžื”ื™ Seccomp ื•ื›ื™ืฆื“ ืžืฉืชืžืฉื™ื ื‘ื”. ืœืื—ืจ ืžื›ืŸ ืชืœืžื“ ื›ื™ืฆื“ ืœื›ืชื•ื‘ ืžืกื ื ื™ Seccomp ื‘ืืžืฆืขื•ืช ืชื•ื›ื ื™ื•ืช BPF. ืœืื—ืจ ืžื›ืŸ, ื ืกืชื›ืœ ืขืœ ื”-BPF ื”ืžื•ื‘ื ื™ื ื”ื›ืœื•ืœื™ื ื‘ืงืจื ืœ ืขื‘ื•ืจ ืžื•ื“ื•ืœื™ ืื‘ื˜ื—ื” ืฉืœ ืœื™ื ื•ืงืก.

ืžื•ื“ื•ืœื™ ืื‘ื˜ื—ื” ืฉืœ ืœื™ื ื•ืงืก (LSM) ื”ื ืžืกื’ืจืช ื”ืžืกืคืงืช ืกื˜ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื”ืŸ ื›ื“ื™ ืœื™ื™ืฉื ืžื•ื“ืœื™ื ืื‘ื˜ื—ื” ืฉื•ื ื™ื ื‘ืฆื•ืจื” ืกื˜ื ื“ืจื˜ื™ืช. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-LSM ื™ืฉื™ืจื•ืช ื‘ืขืฅ ื”ืžืงื•ืจ ืฉืœ ื”ืœื™ื‘ื”, ื›ื’ื•ืŸ Apparmor, SELinux ื•-Tomoyo.

ื‘ื•ืื• ื ืชื—ื™ืœ ื‘ื“ื™ื•ืŸ ื‘ื™ื›ื•ืœื•ืช ืฉืœ ืœื™ื ื•ืงืก.

ื™ื›ื•ืœื•ืช

ื”ืžื”ื•ืช ืฉืœ ื”ื™ื›ื•ืœื•ืช ืฉืœ ืœื™ื ื•ืงืก ื”ื™ื ืฉืขืœื™ืš ืœื”ืขื ื™ืง ืœืชื”ืœื™ืš ืœืœื ื”ืจืฉืื•ืช ื”ืจืฉืื” ืœื‘ืฆืข ืžืฉื™ืžื” ืžืกื•ื™ืžืช, ืืš ืžื‘ืœื™ ืœื”ืฉืชืžืฉ ื‘-suid ืœืžื˜ืจื” ื–ื•, ืื• ืœื”ืคื•ืš ืืช ื”ืชื”ืœื™ืš ืœืคืจื™ื‘ื™ืœื’ื™ ื‘ื“ืจืš ืื—ืจืช, ืžื” ืฉืžืคื—ื™ืช ืืช ื”ืืคืฉืจื•ืช ืœื”ืชืงืคื” ื•ืžืืคืฉืจ ืœืชื”ืœื™ืš ืœื‘ืฆืข ืžืฉื™ืžื•ืช ืžืกื•ื™ืžื•ืช. ืœื“ื•ื’ืžื”, ืื ื”ื™ื™ืฉื•ื ืฉืœืš ืฆืจื™ืš ืœืคืชื•ื— ืคื•ืจื˜ ืžื™ื•ื—ืก, ื ื ื™ื— 80, ื‘ืžืงื•ื ืœื”ืจื™ืฅ ืืช ื”ืชื”ืœื™ืš ื›ืฉื•ืจืฉ, ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืชืช ืœื• ืืช ื”ื™ื›ื•ืœืช CAP_NET_BIND_SERVICE.

ืฉืงื•ืœ ืชื•ื›ื ื™ืช Go ื‘ืฉื main.go:

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

ืชื•ื›ื ื™ืช ื–ื• ืžืฉืจืชืช ืฉืจืช HTTP ื‘ื™ืฆื™ืื” 80 (ื–ื•ื”ื™ ื™ืฆื™ืื” ืžื™ื•ื—ืกืช). ื‘ื“ืจืš ื›ืœืœ ืื ื• ืžืจื™ืฆื™ื ืื•ืชื• ืžื™ื“ ืœืื—ืจ ื”ืงื•ืžืคื™ืœืฆื™ื”:

$ 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:

# 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 - ื”ืฉืชืžืฉ ื‘ืงืืฉ ื›ืงืœื™ืคื”.
  • โ€”caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - ืžื›ื™ื•ื•ืŸ ืฉืขืœื™ื ื• ืœืฉื ื•ืช ืืช ื”ืžืฉืชืžืฉ (ืื™ื ื ื• ืจื•ืฆื™ื ืœื”ืคืขื™ืœ ื›-root), ื ืฆื™ื™ืŸ ืืช cap_net_bind_service ื•ืืช ื”ื™ื›ื•ืœืช ืœืฉื ื•ืช ื‘ืคื•ืขืœ ืืช ืžื–ื”ื” ื”ืžืฉืชืžืฉ ืž- ืฉื•ืจืฉ ืœืืฃ ืื—ื“, ื›ืœื•ืžืจ cap_setuid ื•-cap_setgid.
  • โ€”keep=1 โ€” ืื ื—ื ื• ืจื•ืฆื™ื ืœืฉืžื•ืจ ืขืœ ื”ื™ื›ื•ืœื•ืช ื”ืžื•ืชืงื ื•ืช ื‘ืขืช ืžืขื‘ืจ ืžื—ืฉื‘ื•ืŸ ื”ืฉื•ืจืฉ.
  • โ€”user="ืืฃ ืื—ื“" - ืžืฉืชืžืฉ ื”ืงืฆื” ืฉื™ืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช ื™ื”ื™ื” ืืฃ ืื—ื“.
  • โ€”addamb=cap_net_bind_service โ€” ื”ื’ื“ืจ ืืช ื ื™ืงื•ื™ ื”ื™ื›ื•ืœื•ืช ื”ืงืฉื•ืจื•ืช ืœืื—ืจ ืžืขื‘ืจ ืžืžืฆื‘ ืฉื•ืจืฉ.
  • - -c "./capabilities" - ืคืฉื•ื˜ ื”ืคืขืœ ืืช ื”ืชื•ื›ื ื™ืช.

ื™ื›ื•ืœื•ืช ืžืงื•ืฉืจื•ืช ื”ืŸ ืกื•ื’ ืžื™ื•ื—ื“ ืฉืœ ื™ื›ื•ืœื•ืช ืฉืขื•ื‘ืจื•ืช ื‘ื™ืจื•ืฉื” ืขืœ ื™ื“ื™ ืชื•ื›ื ื™ื•ืช ื™ืœื“ ื›ืืฉืจ ื”ืชื•ื›ื ื™ืช ื”ื ื•ื›ื—ื™ืช ืžื‘ืฆืขืช ืื•ืชืŸ ื‘ืืžืฆืขื•ืช execve(). ืจืง ื™ื›ื•ืœื•ืช ืฉืžื•ืชืจ ืœืฉื™ื™ืš, ืื• ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื›ื™ื›ื•ืœื•ืช ืกื‘ื™ื‘ื”, ื™ื›ื•ืœื•ืช ืœืขื‘ื•ืจ ื‘ื™ืจื•ืฉื”.

ืืชื” ื‘ื˜ื— ืชื•ื”ื” ืžื” ื”ืžืฉืžืขื•ืช ืฉืœ +eip ืœืื—ืจ ืฆื™ื•ืŸ ื”ื™ื›ื•ืœืช ื‘ืืคืฉืจื•ืช --caps. ื“ื’ืœื™ื ืืœื” ืžืฉืžืฉื™ื ื›ื“ื™ ืœืงื‘ื•ืข ืฉื”ื™ื›ื•ืœืช:

-ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžื•ืคืขืœ (p);

- ื–ืžื™ืŸ ืœืฉื™ืžื•ืฉ (ื”);

-ื™ื›ื•ืœ ืœืขื‘ื•ืจ ื‘ื™ืจื•ืฉื” ืขืœ ื™ื“ื™ ืชื”ืœื™ื›ื™ ืฆืืฆื (i).

ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืจื•ืฆื™ื ืœื”ืฉืชืžืฉ ื‘-cap_net_bind_service, ืขืœื™ื ื• ืœืขืฉื•ืช ื–ืืช ืขื ื”ื“ื’ืœ e. ืœืื—ืจ ืžื›ืŸ ื ืชื—ื™ืœ ืืช ื”ืžืขื˜ืคืช ื‘ืคืงื•ื“ื”. ื–ื” ื™ืจื™ืฅ ืืช ื”ื™ื›ื•ืœื•ืช ื”ื‘ื™ื ืืจื™ื•ืช ื•ืขืœื™ื ื• ืœืกืžืŸ ืื•ืชื” ื‘ื“ื’ืœ i. ืœื‘ืกื•ืฃ, ืื ื• ืจื•ืฆื™ื ืฉื”ืชื›ื•ื ื” ืชื”ื™ื” ืžื•ืคืขืœืช (ืขืฉื™ื ื• ื–ืืช ืžื‘ืœื™ ืœืฉื ื•ืช ืืช ื”-UID) ืขื p. ื–ื” ื ืจืื” ื›ืžื• 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, ืืฉืจ ืžื’ื“ื™ืจ ืืช kprobe ืขื‘ื•ืจ ืคื•ื ืงืฆื™ื™ืช ื”ืœื™ื‘ื” cap_capable:

/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

ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉื™ื’ ืืช ืื•ืชื• ื”ื“ื‘ืจ ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘-bpftrace ืขื kprobe ื—ื“-ืฉื ืชื™ ื‘ืคื•ื ืงืฆื™ื™ืช ื”ืงืจื ืœ cap_capable:

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

ื”ื™ื›ื•ืœื•ืช ืžื•ืคืขืœื•ืช ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื‘ื–ืžืŸ ืจื™ืฆื” ืขื‘ื•ืจ ืงื•ื ื˜ื™ื™ื ืจื™ื ื›ื’ื•ืŸ runC ืื• Docker ื›ื“ื™ ืœืืคืฉืจ ืœื”ื ืœืคืขื•ืœ ื‘ืžืฆื‘ ืœื ืžื•ื’ืŸ, ืืš ืžื•ืชืจื•ืช ืœื”ื ืจืง ืืช ื”ื™ื›ื•ืœื•ืช ื”ื“ืจื•ืฉื•ืช ืœื”ืคืขืœืช ืจื•ื‘ ื”ื™ื™ืฉื•ืžื™ื. ื›ืืฉืจ ืืคืœื™ืงืฆื™ื” ื“ื•ืจืฉืช ื™ื›ื•ืœื•ืช ืžืกื•ื™ืžื•ืช, Docker ื™ื›ื•ืœ ืœืกืคืง ืื•ืชืŸ ื‘ืืžืฆืขื•ืช --cap-add:

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

ืคืงื•ื“ื” ื–ื• ืชืขื ื™ืง ืœืžื›ื•ืœื” ืืช ื™ื›ื•ืœืช CAP_NET_ADMIN, ื•ืชืืคืฉืจ ืœื• ืœื”ื’ื“ื™ืจ ืงื™ืฉื•ืจ ืจืฉืช ืœื”ื•ืกืคืช ืžืžืฉืง dummy0.

ื”ืกืขื™ืฃ ื”ื‘ื ืžืจืื” ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ืชื›ื•ื ื•ืช ื›ื’ื•ืŸ ืกื™ื ื•ืŸ, ืืš ื‘ืืžืฆืขื•ืช ื˜ื›ื ื™ืงื” ืื—ืจืช ื”ืžืืคืฉืจืช ืœื ื• ืœื™ื™ืฉื ื‘ืื•ืคืŸ ืคืจื•ื’ืจืžื˜ื™ ืืช ื”ืžืกื ื ื™ื ืฉืœื ื•.

Secomp

Seccomp ืจืืฉื™ ืชื™ื‘ื•ืช ืฉืœ Secure Computing ื•ื”ื™ื ืฉื›ื‘ืช ืื‘ื˜ื—ื” ื”ืžื™ื•ืฉืžืช ื‘ืœื™ื‘ืช ืœื™ื ื•ืงืก ื”ืžืืคืฉืจืช ืœืžืคืชื—ื™ื ืœืกื ืŸ ืงืจื™ืื•ืช ืžืขืจื›ืช ืžืกื•ื™ืžื•ืช. ืœืžืจื•ืช ืฉ-Secomp ื“ื•ืžื” ื‘ื™ื›ื•ืœื•ืช ืœืœื™ื ื•ืงืก, ื”ื™ื›ื•ืœืช ืฉืœื” ืœื ื”ืœ ืฉื™ื—ื•ืช ืžืขืจื›ืช ืžืกื•ื™ืžื•ืช ื”ื•ืคื›ืช ืื•ืชื” ืœื’ืžื™ืฉื” ื”ืจื‘ื” ื™ื•ืชืจ ื‘ื”ืฉื•ื•ืื” ืืœื™ื”ืŸ.

ืชื›ื•ื ื•ืช Seccomp ื•-Linux ืื™ื ืŸ ืกื•ืชืจื•ืช ื–ื• ืืช ื–ื• ื•ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืžืฉืžืฉื•ืช ื™ื—ื“ ื›ื“ื™ ืœื”ืคื™ืง ืชื•ืขืœืช ืžืฉืชื™ ื”ื’ื™ืฉื•ืช. ืœื“ื•ื’ืžื”, ื™ื™ืชื›ืŸ ืฉืชืจืฆื” ืœืชืช ืœืชื”ืœื™ืš ืืช ื™ื›ื•ืœืช CAP_NET_ADMIN ืืš ืœื ืœืืคืฉืจ ืœื• ืœืงื‘ืœ ื—ื™ื‘ื•ืจื™ ืฉืงืข, ืœื—ืกื•ื ืืช ื”ืงื‘ืœื” ื•ืงื‘ืœืช ืงืจื™ืื•ืช ื”ืžืขืจื›ืช.

ืฉื™ื˜ืช ื”ืกื™ื ื•ืŸ ืฉืœ Seccomp ืžื‘ื•ืกืกืช ืขืœ ืžืกื ื ื™ BPF ื”ืคื•ืขืœื™ื ื‘ืžืฆื‘ SECCOMP_MODE_FILTER, ื•ืกื™ื ื•ืŸ ืฉื™ื—ื•ืช ื”ืžืขืจื›ืช ืžืชื‘ืฆืข ื‘ืื•ืชื• ืื•ืคืŸ ื›ืžื• ืขื‘ื•ืจ ืžื ื•ืช.

ืžืกื ื ื™ Seccomp ื ื˜ืขื ื™ื ื‘ืืžืฆืขื•ืช prctl ื“ืจืš ืคืขื•ืœืช PR_SET_SECCOMP. ืžืกื ื ื™ื ืืœื” ืœื•ื‘ืฉื™ื ืฆื•ืจื” ืฉืœ ืชื•ื›ื ื™ืช BPF ื”ืžื•ืคืขืœืช ืขื‘ื•ืจ ื›ืœ ื—ื‘ื™ืœืช Seccomp ื”ืžื™ื•ืฆื’ืช ืขืœ ื™ื“ื™ ืžื‘ื ื” seccomp_data. ืžื‘ื ื” ื–ื” ืžื›ื™ืœ ืืช ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ื”ืชื™ื™ื—ืกื•ืช, ืžืฆื‘ื™ืข ืœื”ื•ืจืื•ืช ื”ืžืขื‘ื“ ื‘ื–ืžืŸ ืงืจื™ืืช ื”ืžืขืจื›ืช, ื•ืžืงืกื™ืžื•ื ืฉื™ืฉื” ืืจื’ื•ืžื ื˜ื™ื ืฉืœ ืงืจื™ืืช ืžืขืจื›ืช, ื”ืžื‘ื•ื˜ืื™ื ื›-uint64.

ื›ืš ื ืจืื” ืžื‘ื ื” seccomp_data ืžืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืœื™ื‘ื” ื‘ืงื•ื‘ืฅ linux/seccomp.h:

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

ื›ืคื™ ืฉื ื™ืชืŸ ืœืจืื•ืช ืžืžื‘ื ื” ื–ื”, ืื ื• ื™ื›ื•ืœื™ื ืœืกื ืŸ ืœืคื™ ืงืจื™ืืช ื”ืžืขืจื›ืช, ื”ืืจื’ื•ืžื ื˜ื™ื ืฉืœื” ืื• ืฉื™ืœื•ื‘ ืฉืœ ืฉื ื™ื”ื.

ืœืื—ืจ ืงื‘ืœืช ื›ืœ ื—ื‘ื™ืœืช Seccomp, ื”ืžืกื ืŸ ื—ื™ื™ื‘ ืœื‘ืฆืข ืขื™ื‘ื•ื“ ื›ื“ื™ ืœืงื‘ืœ ื”ื—ืœื˜ื” ืกื•ืคื™ืช ื•ืœื•ืžืจ ืœืงืจื ืœ ืžื” ืœืขืฉื•ืช ื”ืœืื”. ื”ื”ื—ืœื˜ื” ื”ืกื•ืคื™ืช ืžืชื‘ื˜ืืช ื‘ืื—ื“ ืžืขืจื›ื™ ื”ื”ื—ื–ืจื” (ืงื•ื“ื™ ืกื˜ื˜ื•ืก).

- SECCOMP_RET_KILL_PROCESS - ื”ื•ืจื’ ืืช ื›ืœ ื”ืชื”ืœื™ืš ืžื™ื“ ืœืื—ืจ ืกื™ื ื•ืŸ ืงืจื™ืืช ืžืขืจื›ืช ืฉืœื ืžื‘ื•ืฆืขืช ื‘ื’ืœืœ ื–ื”.

- SECCOMP_RET_KILL_THREAD - ืžืกื™ื™ื ืืช ื”ืฉืจืฉื•ืจ ื”ื ื•ื›ื—ื™ ืžื™ื“ ืœืื—ืจ ืกื™ื ื•ืŸ ืงืจื™ืืช ืžืขืจื›ืช ืฉืœื ืžื‘ื•ืฆืขืช ื‘ื’ืœืœ ื–ื”.

โ€” SECCOMP_RET_KILL โ€” ื›ื™ื ื•ื™ ืขื‘ื•ืจ SECCOMP_RET_KILL_THREAD, ืฉืžืืœ ืœืชืื™ืžื•ืช ืœืื—ื•ืจ.

- SECCOMP_RET_TRAP - ืงืจื™ืืช ื”ืžืขืจื›ืช ืืกื•ืจื”, ื•ืื•ืช SIGSYS (ืฉื™ื—ืช ืžืขืจื›ืช ื’ืจื•ืขื”) ื ืฉืœื— ืœืžืฉื™ืžื” ืฉืงื•ืจืืช ืœื”.

- SECCOMP_RET_ERRNO - ืงืจื™ืืช ื”ืžืขืจื›ืช ืœื ืžื‘ื•ืฆืขืช, ื•ื—ืœืง ืžืขืจืš ื”ื—ื–ืจืช ื”ืžืกื ืŸ SECCOMP_RET_DATA ืžื•ืขื‘ืจ ืœืžืจื—ื‘ ื”ืžืฉืชืžืฉ ื›ืขืจืš ื”ืฉื’ื™ืื”. ื‘ื”ืชืื ืœืกื™ื‘ืช ื”ืฉื’ื™ืื”, ืžื•ื—ื–ืจื™ื ืขืจื›ื™ ืฉื’ื™ืื” ืฉื•ื ื™ื. ืจืฉื™ืžื” ืฉืœ ืžืกืคืจื™ ืฉื’ื™ืื•ืช ืžืกื•ืคืงืช ื‘ืกืขื™ืฃ ื”ื‘ื.

- SECCOMP_RET_TRACE - ืžืฉืžืฉ ื›ื“ื™ ืœื”ื•ื“ื™ืข โ€‹โ€‹ืœ-ptrace tracer ื‘ืืžืฆืขื•ืช - PTRACE_O_TRACESECCOMP ื›ื“ื™ ืœื™ื™ืจื˜ ื›ืืฉืจ ืžื‘ื•ืฆืขืช ืงืจื™ืืช ืžืขืจื›ืช ื›ื“ื™ ืœืจืื•ืช ื•ืœืฉืœื•ื˜ ื‘ืชื”ืœื™ืš ื–ื”. ืื ืžืขืงื‘ ืœื ืžื—ื•ื‘ืจ, ืžื•ื—ื–ืจืช ืฉื’ื™ืื”, errno ืžื•ื’ื“ืจ ืœ-ENOSYS, ื•ืงืจื™ืื” ืœืžืขืจื›ืช ืœื ืžื‘ื•ืฆืขืช.

- SECCOMP_RET_LOG - ืงืจื™ืืช ื”ืžืขืจื›ืช ื ืคืชืจื” ื•ื ืจืฉืžืช.

- SECCOMP_RET_ALLOW - ืงืจื™ืืช ื”ืžืขืจื›ืช ืคืฉื•ื˜ ืžื•ืชืจืช.

ptrace ื”ื™ื ืงืจื™ืืช ืžืขืจื›ืช ืœื”ื˜ืžืขืช ืžื ื’ื ื•ื ื™ ืžืขืงื‘ ื‘ืชื”ืœื™ืš ื”ื ืงืจื tracee, ืขื ื™ื›ื•ืœืช ื ื™ื˜ื•ืจ ื•ื‘ืงืจื” ืขืœ ื‘ื™ืฆื•ืข ื”ืชื”ืœื™ืš. ืชื•ื›ื ื™ืช ื”ืžืขืงื‘ ื™ื›ื•ืœื” ืœื”ืฉืคื™ืข ื‘ื™ืขื™ืœื•ืช ืขืœ ื”ื‘ื™ืฆื•ืข ื•ืœืฉื ื•ืช ืืช ืื•ื’ืจื™ ื”ื–ื™ื›ืจื•ืŸ ืฉืœ tracee. ื‘ื”ืงืฉืจ ืฉืœ Seccomp, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘-ptrace ื›ืืฉืจ ื”ื•ื ืžื•ืคืขืœ ืขืœ ื™ื“ื™ ืงื•ื“ ื”ืžืฆื‘ SECCOMP_RET_TRACE, ื›ืš ืฉื”-Tracer ื™ื›ื•ืœ ืœืžื ื•ืข ืืช ื‘ื™ืฆื•ืข ืงืจื™ืืช ื”ืžืขืจื›ืช ื•ืœื™ื™ืฉื ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœื”.

ืฉื’ื™ืื•ืช Secomp

ืžืขืช ืœืขืช, ืชื•ืš ื›ื“ื™ ืขื‘ื•ื“ื” ืขื Seccomp, ืชื™ืชืงืœื• ื‘ืฉื’ื™ืื•ืช ืฉื•ื ื•ืช, ืืฉืจ ืžื–ื•ื”ื•ืช ืขืœ ื™ื“ื™ ืขืจืš ื”ื—ื–ืจื” ืžืกื•ื’ SECCOMP_RET_ERRNO. ื›ื“ื™ ืœื“ื•ื•ื— ืขืœ ืฉื’ื™ืื”, ืงืจื™ืืช ื”ืžืขืจื›ืช ืฉืœ seccomp ืชื—ื–ื™ืจ -1 ื‘ืžืงื•ื 0.

ื”ืฉื’ื™ืื•ืช ื”ื‘ืื•ืช ืืคืฉืจื™ื•ืช:

- EACCESS - ื”ืžืชืงืฉืจ ืื™ื ื• ืจืฉืื™ ืœื‘ืฆืข ืฉื™ื—ืช ืžืขืจื›ืช. ื–ื” ืงื•ืจื” ื‘ื“ืจืš ื›ืœืœ ื‘ื’ืœืœ ืฉืื™ืŸ ืœื• ื”ืจืฉืื•ืช CAP_SYS_ADMIN ืื• ืฉ-no_new_privs ืœื ืžื•ื’ื“ืจ ื‘ืืžืฆืขื•ืช prctl (ื ื“ื‘ืจ ืขืœ ื–ื” ืžืื•ื—ืจ ื™ื•ืชืจ);

โ€” EFAULT โ€” ืœืืจื’ื•ืžื ื˜ื™ื ืฉืขื‘ืจื• (args ื‘ืžื‘ื ื” seccomp_data) ืื™ืŸ ื›ืชื•ื‘ืช ื—ื•ืงื™ืช;

- EINVAL - ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ื›ืืŸ ืืจื‘ืข ืกื™ื‘ื•ืช:

-ื”ืคืขื•ืœื” ื”ืžื‘ื•ืงืฉืช ืื™ื ื” ื™ื“ื•ืขื” ืื• ืื™ื ื” ื ืชืžื›ืช ืขืœ ื™ื“ื™ ื”ืœื™ื‘ื” ื‘ืชืฆื•ืจื” ื”ื ื•ื›ื—ื™ืช;

-ื”ื“ื’ืœื™ื ืฉืฆื•ื™ื ื• ืื™ื ื ืชืงืคื™ื ืขื‘ื•ืจ ื”ืคืขื•ืœื” ื”ืžื‘ื•ืงืฉืช;

-ื”ืคืขื•ืœื” ื›ื•ืœืœืช BPF_ABS, ืืš ื™ืฉ ื‘ืขื™ื•ืช ืขื ื”ื”ื™ืกื˜ ืฉืฆื•ื™ืŸ, ืฉืขืœื•ืœื•ืช ืœื—ืจื•ื’ ืžื’ื•ื“ืœ ืžื‘ื ื” seccomp_data;

-ืžืกืคืจ ื”ื”ื•ืจืื•ืช ื”ืžื•ืขื‘ืจื•ืช ืœืžืกื ืŸ ื—ื•ืจื’ ืžื”ืžืงืกื™ืžื•ื;

- ENOMEM - ืื™ืŸ ืžืกืคื™ืง ื–ื™ื›ืจื•ืŸ ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช;

- EOPNOTSUPP - ื”ืคืขื•ืœื” ืฆื™ื™ื ื” ืฉืขื SECCOMP_GET_ACTION_AVAIL ื”ืคืขื•ืœื” ื”ื™ื™ืชื” ื–ืžื™ื ื”, ืืš ื”ืงืจื ืœ ืื™ื ื• ืชื•ืžืš ื‘ื”ื—ื–ืจื•ืช ื‘ืืจื’ื•ืžื ื˜ื™ื;

- ESRCH - ื”ืชืจื—ืฉื” ื‘ืขื™ื” ื‘ืขืช ืกื ื›ืจื•ืŸ ื–ืจื ืื—ืจ;

- ENOSYS - ืื™ืŸ ืžืขืงื‘ ืžืฆื•ืจืฃ ืœืคืขื•ืœืช SECCOMP_RET_TRACE.

prctl ื”ื™ื ืงืจื™ืืช ืžืขืจื›ืช ื”ืžืืคืฉืจืช ืœืชื•ื›ื ื™ืช ืžืจื—ื‘ ืžืฉืชืžืฉ ืœืชืคืขืœ (ืœื”ื’ื“ื™ืจ ื•ืœื”ืฉื™ื’) ื”ื™ื‘ื˜ื™ื ืกืคืฆื™ืคื™ื™ื ืฉืœ ืชื”ืœื™ืš, ื›ืžื• ืกื•ืฃ ื‘ืชื™ื, ืฉืžื•ืช ืฉืจืฉื•ืจื™ื, ืžืฆื‘ ื—ื™ืฉื•ื‘ ืžืื•ื‘ื˜ื— (Seccomp), ื”ืจืฉืื•ืช, ืื™ืจื•ืขื™ Perf ื•ื›ื•'.

Secomp ืื•ืœื™ ื ืจืื™ืช ืœืš ื›ืžื• ื˜ื›ื ื•ืœื•ื’ื™ื™ืช ืืจื’ื– ื—ื•ืœ, ืื‘ืœ ื”ื™ื ืœื. Seccomp ื”ื•ื ื›ืœื™ ืขื–ืจ ื”ืžืืคืฉืจ ืœืžืฉืชืžืฉื™ื ืœืคืชื— ืžื ื’ื ื•ืŸ ืืจื’ื– ื—ื•ืœ. ื›ืขืช ื‘ื•ืื• ื ืกืชื›ืœ ื›ื™ืฆื“ ื ื•ืฆืจื•ืช ืชื•ื›ื ื™ื•ืช ืื™ื ื˜ืจืืงืฆื™ื” ืขื ืžืฉืชืžืฉื™ื ื‘ืืžืฆืขื•ืช ืžืกื ืŸ ื”ื ืงืจื ื™ืฉื™ืจื•ืช ืขืœ ื™ื“ื™ ืงืจื™ืืช ื”ืžืขืจื›ืช ืฉืœ Seccomp.

ื“ื•ื’ืžื” ืœืžืกื ืŸ BPF Secomp

ื›ืืŸ ื ืจืื” ื›ื™ืฆื“ ืœืฉืœื‘ ืืช ืฉืชื™ ื”ืคืขื•ืœื•ืช ืฉื ื“ื•ื ื• ืงื•ื“ื ืœื›ืŸ, ื›ืœื•ืžืจ:

- ื ื›ืชื•ื‘ ืชื•ื›ื ื™ืช 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),
  };

ื”ื”ื•ืจืื•ืช ืžื•ื’ื“ืจื•ืช ื‘ืืžืฆืขื•ืช ืคืงื•ื“ื•ืช ื”ืžืืงืจื• BPF_STMT ื•-BPF_JUMP ื”ืžื•ื’ื“ืจื•ืช ื‘ืงื•ื‘ืฅ linux/filter.h.
ื‘ื•ื ื ืขื‘ื•ืจ ืขืœ ื”ื”ื•ืจืื•ืช.

- 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. ืื ื”ื ืฉื•ื•ื™ื, ืขื•ื‘ืจ ืœื”ื•ืจืื” ื”ื‘ืื” ื•ืžืฉื‘ื™ืช ืืช ืงืจื™ืืช ื”ืžืขืจื›ืช, ืื—ืจืช ืžืืคืฉืจ ืืช ืงืจื™ืืช ื”ืžืขืจื›ืช ืขื SECCOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)) - ืžืกื™ื™ื ืืช ื”ืชื•ื›ื ื™ืช ืขื BPF_RET ื•ื›ืชื•ืฆืื” ืžื›ืš ืžื™ื™ืฆืจ ืฉื’ื™ืื” SECCOMP_RET_ERRNO ืขื ื”ืžืกืคืจ ืžืžืฉืชื ื” ื”ืฉื’ื™ืื”.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - ืžืกื™ื™ื ืืช ื”ืชื•ื›ื ื™ืช ืขื BPF_RET ื•ืžืืคืฉืจ ื‘ื™ืฆื•ืข ืงืจื™ืืช ื”ืžืขืจื›ืช ื‘ืืžืฆืขื•ืช SECCOMP_RET_ALLOW.

SECCOMP ื”ื•ื CBPF
ืื•ืœื™ ืืชื” ืชื•ื”ื” ืžื“ื•ืข ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืจืฉื™ืžืช ื”ื•ืจืื•ืช ื‘ืžืงื•ื ืื•ื‘ื™ื™ืงื˜ ELF ื”ื™ื“ื•ืจ ืื• ืชื•ื›ื ื™ืช C ื”ื™ื“ื•ืจื™ืช ืฉืœ JIT.

ื™ืฉ ืœื›ืš ืฉืชื™ ืกื™ื‘ื•ืช.

โ€ข ืจืืฉื™ืช, 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 - ื˜ืขืŸ ืืช ื”ืชื•ื›ื ื™ืช ืขืฆืžื”! ืœืฉื ื›ืš, ืื ื• ืžืฉืชืžืฉื™ื ื‘-prctl, ืชื•ืš ืฉื™ืžื•ืฉ ื‘-PR_SET_SECCOMP ื›ืืคืฉืจื•ืช ืœื›ื ื™ืกื” ืœืžืฆื‘ ืžื—ืฉื•ื‘ ืžืื•ื‘ื˜ื—. ืœืื—ืจ ืžื›ืŸ ืื ื• ืื•ืžืจื™ื ืœืžืฆื‘ ืœื˜ืขื•ืŸ ืืช ื”ืžืกื ืŸ ื‘ืืžืฆืขื•ืช SECCOMP_MODE_FILTER, ื”ื›ืœื•ืœ ื‘ืžืฉืชื ื” ื”ืคืจื•ื’ ืžืกื•ื’ sock_fprog:

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

ืœื‘ืกื•ืฃ, ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื™ืช install_filter ืฉืœื ื•, ืืš ืœืคื ื™ ื›ืŸ ืขืœื™ื ื• ืœื”ืฉืชืžืฉ ื‘-prctl ื›ื“ื™ ืœื”ื’ื“ื™ืจ PR_SET_NO_NEW_PRIVS ืœื‘ื™ืฆื•ืข ื”ื ื•ื›ื—ื™ ื•ืขืœ ื™ื“ื™ ื›ืš ืœื”ื™ืžื ืข ืžื”ืžืฆื‘ ืฉื‘ื• ืชื”ืœื™ื›ื™ ื™ืœื“ ืžืงื‘ืœื™ื ื™ื•ืชืจ ื”ืจืฉืื•ืช ืžื”ื•ืจื™ื”ื. ื‘ืขื–ืจืช ื–ื”, ื ื•ื›ืœ ืœื‘ืฆืข ืืช ื”ืงืจื™ืื•ืช prctl ื”ื‘ืื•ืช ื‘ืคื•ื ืงืฆื™ื™ืช install_filter ืœืœื ื–ื›ื•ื™ื•ืช ืฉื•ืจืฉ.

ื›ืขืช ื ื•ื›ืœ ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื” 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 -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 ื›ื“ื™ ืœืจืื•ืช ืžื” ืงื•ืจื”:

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

ืชื•ืฆืืช ื”ืขื‘ื•ื“ื” ืžืชืงืฆืจืช ืžืื•ื“, ืื‘ืœ ื”ื—ืœืง ื”ืžืงื‘ื™ืœ ืฉืœื” ืžืจืื” ืฉื”ืจืฉื•ืžื•ืช ื—ืกื•ืžื•ืช ื‘ืฉื’ื™ืืช EPERM - ืื•ืชื” ืื—ืช ืฉื”ื’ื“ืจื ื•. ื–ื” ืื•ืžืจ ืฉื”ืชื•ื›ื ื” ืœื ืžืคืœื˜ืช ืฉื•ื ื“ื‘ืจ ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืœื ื™ื›ื•ืœื” ืœื’ืฉืช ืœืงืจื™ืืช ื”ืžืขืจื›ืช ืœื›ืชื•ื‘:

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

ืขื›ืฉื™ื• ืืชื” ืžื‘ื™ืŸ ืื™ืš Seccomp BPF ืขื•ื‘ื“ ื•ื™ืฉ ืœืš ืžื•ืฉื’ ื˜ื•ื‘ ืžื” ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช ืื™ืชื•. ืื‘ืœ ื”ืื ืœื ื”ื™ื™ืช ืจื•ืฆื” ืœื”ืฉื™ื’ ืืช ืื•ืชื• ื”ื“ื‘ืจ ืขื eBPF ื‘ืžืงื•ื cBPF ื›ื“ื™ ืœืจืชื•ื ืืช ืžืœื•ื ื”ื›ื•ื— ืฉืœื•?

ื›ืฉื—ื•ืฉื‘ื™ื ืขืœ ืชื•ื›ื ื™ื•ืช eBPF, ืจื•ื‘ ื”ืื ืฉื™ื ื—ื•ืฉื‘ื™ื ืฉื”ื ืคืฉื•ื˜ ื›ื•ืชื‘ื™ื ืื•ืชืŸ ื•ืžื˜ืขื™ื ื™ื ืื•ืชืŸ ืขื ื”ืจืฉืื•ืช ืžื ื”ืœ. ื‘ืขื•ื“ ืฉื”ืฆื”ืจื” ื–ื• ื ื›ื•ื ื” ื‘ื“ืจืš ื›ืœืœ, ื”ืœื™ื‘ื” ืžื™ื™ืฉืžืช ืงื‘ื•ืฆื” ืฉืœ ืžื ื’ื ื•ื ื™ื ืœื”ื’ื ื” ืขืœ ืื•ื‘ื™ื™ืงื˜ื™ eBPF ื‘ืจืžื•ืช ืฉื•ื ื•ืช. ืžื ื’ื ื•ื ื™ื ืืœื• ื ืงืจืื™ื ืžืœื›ื•ื“ื•ืช BPF LSM.

ืžืœื›ื•ื“ื•ืช BPF LSM

ื›ื“ื™ ืœืกืคืง ื ื™ื˜ื•ืจ ื‘ืœืชื™ ืชืœื•ื™ ื‘ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉืœ ืื™ืจื•ืขื™ ืžืขืจื›ืช, LSM ืžื™ื™ืฉืžืช ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืžืœื›ื•ื“ื•ืช. ืฉื™ื—ืช Hook ื“ื•ืžื” ืžื‘ื—ื™ื ื” ื˜ื›ื ื™ืช ืœืฉื™ื—ืช ืžืขืจื›ืช, ืืš ื”ื™ื ืขืฆืžืื™ืช ื‘ืžืขืจื›ืช ื•ืžืฉื•ืœื‘ืช ืขื ื”ืชืฉืชื™ืช. 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 ื›ื“ื™ ืœืขื‘ื•ื“ ืื™ืชืŸ.

ืขืœ ื”ืžื—ื‘ืจื™ื

ื“ื™ื•ื•ื™ื“ ืงืœืื•ื•ืจื” ื”ื•ื ื”-CTO ื‘-Netlify. ื”ื•ื ืขื‘ื“ ื‘ืชืžื™ื›ืช Docker ื•ืชืจื ืœืคื™ืชื•ื— ื›ืœื™ Runc, Go ื•-BCC, ื›ืžื• ื’ื ืคืจื•ื™ืงื˜ื™ื ืื—ืจื™ื ืฉืœ ืงื•ื“ ืคืชื•ื—. ื™ื“ื•ืข ื‘ืขื‘ื•ื“ืชื• ืขืœ ืคืจื•ื™ืงื˜ื™ื ืฉืœ Docker ื•ืคื™ืชื•ื— ืฉืœ ืžืขืจื›ืช ื”ืืงื•ืœื•ื’ื™ืช ืฉืœ ื”ืชื•ืกืฃ Docker. ื“ื™ื•ื•ื™ื“ ืžืื•ื“ ื ืœื”ื‘ ืžื’ืจืคื™ ืœื”ื‘ื” ื•ืชืžื™ื“ ืžื—ืคืฉ ืœื™ื™ืขืœ ืืช ื”ื‘ื™ืฆื•ืขื™ื.

ืœื•ืจื ืฆื• ืคื•ื ื˜ื ื” ืขื•ื‘ื“ ื‘ืฆื•ื•ืช ื”ืงื•ื“ ื”ืคืชื•ื— ื‘-Sysdig, ืฉื ื”ื•ื ืžืชืžืงื“ ื‘ืขื™ืงืจ ื‘-Falco, ืคืจื•ื™ืงื˜ Cloud Native Computing Foundation ื”ืžืกืคืง ืื‘ื˜ื—ืช ื–ืžืŸ ืจื™ืฆื” ืฉืœ ืžื™ื›ืœ ื•ื–ื™ื”ื•ื™ ืื ื•ืžืœื™ื•ืช ื‘ืืžืฆืขื•ืช ืžื•ื“ื•ืœ ืœื™ื‘ื” ื•-eBPF. ื”ื•ื ื ืœื”ื‘ ืžืžืขืจื›ื•ืช ืžื‘ื•ื–ืจื•ืช, ืจืฉืชื•ืช ืžื•ื’ื“ืจื•ืช ืชื•ื›ื ื”, ืœื™ื‘ืช ืœื™ื ื•ืงืก ื•ื ื™ืชื•ื— ื‘ื™ืฆื•ืขื™ื.

ยป ืคืจื˜ื™ื ื ื•ืกืคื™ื ืขืœ ื”ืกืคืจ ื ื™ืชืŸ ืœืžืฆื•ื ื‘ื›ืชื•ื‘ืช ืืชืจ ื”ืื™ื ื˜ืจื ื˜ ืฉืœ ื”ื”ื•ืฆืื” ืœืื•ืจ
ยป ืชื•ื›ืŸ ื”ืขื ื™ื™ื ื™ื
ยป ืงื˜ืข

ืขื‘ื•ืจ Khabrozhiteley 25% ื”ื ื—ื” ื‘ืืžืฆืขื•ืช ืงื•ืคื•ืŸ - ืœื™ื ื•ืงืก

ื‘ืชืฉืœื•ื ื’ืจืกืช ื”ื ื™ื™ืจ ืฉืœ ื”ืกืคืจ ื™ืฉืœื— ืกืคืจ ืืœืงื˜ืจื•ื ื™ ื‘ืžื™ื™ืœ.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”