เบ›เบทเป‰เบก "BPF เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก Linux"

เบ›เบทเป‰เบก "BPF เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก Linux"เบชเบฐเบšเบฒเบเบ”เบตเบŠเบฒเบง Khabro! เป€เบ„เบทเปˆเบญเบ‡ virtual BPF เปเบกเปˆเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡ Linux kernel. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบงเบดเบชเบฐเบงเบฐเบเบญเบ™เบฅเบฐเบšเบปเบšเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เปเบฅเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบ—เบตเปˆเบชเบธเบ”. เบ—เปˆเบฒเบ™เบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเบ•เบดเบ”เบ•เบฒเบกเปเบฅเบฐเบ”เบฑเบ”เปเบ›เบ‡เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡ kernel, เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ”เบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบžเป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบกเป€เบซเบ”เบเบฒเบ™เปƒเบ™ kernel, เปเบฅเบฐเบญเบทเปˆเบ™เป†เบญเบตเบ. David Calavera เปเบฅเบฐ Lorenzo Fontana เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เบปเบ”เบฅเบฑเบญเบเบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ‚เบญเบ‡ BPF. เบ‚เบฐเบซเบเบฒเบเบ„เบงเบฒเบกเบฎเบนเป‰เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž. - เปƒเบŠเป‰ BPF เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบกเปเบฅเบฐเบ”เบฑเบ”เปเบ›เบ‡เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡ Linux kernel. - เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบกเป€เบซเบ”เบเบฒเบ™ kernel เบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบžเป‚เบ”เบเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบงเบšเบฅเบงเบก kernel เบซเบผเบท reboot เบฅเบฐเบšเบปเบš. โ€” เปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฐเบ”เบงเบเปƒเบ™ C, Go เบซเบผเบท Python. - เบ„เบงเบšเบ„เบธเบกเป‚เบ”เบเบเบฒเบ™เป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ BPF.

Linux Kernel Security, เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™ เปเบฅเบฐ Seccomp

BPF เบชเบฐเบซเบ™เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปƒเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบเปˆเบ™เบ‚เบญเบ‡เปเบเปˆเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบชเบเบชเบฐเบฅเบฐเบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡, เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เบซเบผเบทเบ„เบงเบฒเบกเป„เบง. เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ kernel เบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เป‚เบ”เบ”เบ”เปˆเบฝเบงเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ™ Seccomp เป‚เบ”เบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบเบญเบ‡ Seccomp เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบเป‚เบ„เบ‡เบเบฒเบ™ BPF, เป€เบŠเบดเปˆเบ‡เป€เบญเบตเป‰เบ™เบเบฑเบ™เบงเปˆเบฒ Seccomp BPF. เปƒเบ™เบšเบปเบ”เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบงเปˆเบฒ Seccomp เปเบกเปˆเบ™เบซเบเบฑเบ‡เปเบฅเบฐเบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบ™เบงเปƒเบ”. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบ•เบปเบงเบเบญเบ‡ Seccomp เป‚เบ”เบเปƒเบŠเป‰เป‚เบ›เปเบเบผเบก BPF. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡ hooks BPF เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบ•เบปเบงเบ—เบตเปˆเบฅเบงเบกเบขเบนเปˆเปƒเบ™ kernel เบชเปเบฒเบฅเบฑเบšเป‚เบกเบ”เบนเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Linux.

เป‚เบกเบ”เบนเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž Linux (LSM) เปเบกเปˆเบ™เบเบญเบšเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบŠเบธเบ”เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ•เปˆเบฒเบ‡เป†เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™. LSM เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบเบปเบ‡เปƒเบ™เบ•เบปเป‰เบ™เปเบซเบผเปˆเบ‡เปเบเปˆเบ™, เป€เบŠเบฑเปˆเบ™ Apparmor, SELinux เปเบฅเบฐ Tomoyo.

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ Linux.

เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”

เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ Linux เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบชเบดเบ”เบ—เบดเบžเบดเป€เบชเบ”เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡, เปเบ•เปˆเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ 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

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบซเป‰เบชเบดเบ”เบ—เบด root, เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบˆเบฐเบ–เบดเป‰เบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบœเบนเบเบกเบฑเบ”เบžเบญเบ”:

2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1

capsh (เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เปเบเบฐ) เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ shell เบ—เบตเปˆเบกเบตเบŠเบธเบ”เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบชเบฐเป€เบžเบฒเบฐ.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเปเบฅเป‰เบง, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบชเบดเบ”เบฎเบฒเบเบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบœเบนเบเบกเบฑเบ”เบžเบญเบ”เบ—เบตเปˆเบกเบตเบชเบดเบ”เบ—เบดเบžเบดเป€เบชเบ”เป‚เบ”เบเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ 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 - เปƒเบŠเป‰ 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=โ€œnobodyโ€ โ€” เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบชเบธเบ”โ€‹เบ—เป‰เบฒเบโ€‹เบ—เบตเปˆโ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เปƒเบœ.
  • โ€”addamb=cap_net_bind_service โ€” เบ•เบฑเป‰เบ‡โ€‹เบเบฒเบ™โ€‹เบฅเป‰เบฒเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ—เบตเปˆโ€‹เบเปˆเบฝเบงโ€‹เบ‚เป‰เบญเบ‡โ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เบˆเบฒเบโ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบฎเบฒเบโ€‹.
  • - -c "./capabilities" - เบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เปเบกเปˆเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบžเบดเป€เบชเบ”เบ—เบตเปˆเบชเบทเบšเบ—เบญเบ”เบกเบฒเบˆเบฒเบเบšเบฑเบ™เบ”เบฒเป‚เบ„เบ‡เบเบฒเบ™เป€เบ”เบฑเบเบ™เป‰เบญเบ เป€เบกเบทเปˆเบญเป‚เบ„เบ‡เบเบฒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบงเบเบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ execve(). เบžเบฝเบ‡เปเบ•เปˆเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡, เบซเบผเบทเปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ”เป‰เบฒเบ™เบชเบดเปˆเบ‡เปเบงเบ”เบฅเป‰เบญเบก, เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบทเบšเบ—เบญเบ”.

เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบชเบปเบ‡เป„เบชเบงเปˆเบฒ +eip เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเปเบ™เบงเปƒเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบฅเบฐเบšเบธเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบ•เบปเบงเป€เบฅเบทเบญเบ --caps. เบ—เบธเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”:

- เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบฐเบ•เบธเป‰เบ™ (p);

- เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ (e);

-เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบทเบšเบ—เบญเบ”เป‚เบ”เบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เป€เบ”เบฑเบ (i).

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ cap_net_bind_service, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เบ”เป‰เบงเบเบ—เบธเบ‡ e. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ shell เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡. เบ™เบตเป‰เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบซเบกเบฒเบเบกเบฑเบ™เบ”เป‰เบงเบเบ—เบธเบ‡ i. เบชเบธเบ”เบ—เป‰เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™ (เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™ UID) เบเบฑเบš p. เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ cap_net_bind_service+eip.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเปƒเบŠเป‰ ss. เบ‚เปเปƒเบซเป‰เบซเบเปเป‰เบœเบปเบ™เบœเบฐเบฅเบดเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบเป€เบžเบทเปˆเบญเปƒเบซเป‰เบžเปเบ”เบตเบเบฑเบšเบซเบ™เป‰เบฒ, เปเบ•เปˆเบกเบฑเบ™เบˆเบฐเบชเบฐเปเบ”เบ‡เบžเบญเบ”เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เปเบฅเบฐ ID เบœเบนเป‰เปƒเบŠเป‰เบญเบทเปˆเบ™เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ 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, เปเบ•เปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™ shell เป‚เบ”เบเปƒเบŠเป‰ libcap. เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เป€เบšเบดเปˆเบ‡ man 3 libcap.

เป€เบกเบทเปˆเบญเบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบก, เบชเปˆเบงเบ™เบซเบผเบฒเบเปเบฅเป‰เบงเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเปเปˆเบฎเบนเป‰เบฅเปˆเบงเบ‡ เปœเป‰เบฒ เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบฑเบ‡ เปเบปเบ” เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เป€เบงเบฅเบฒเปเบฅเปˆเบ™; เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบฅเบฑเบเบชเบฐเบ™เบฐเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบฎเบธเปˆเบ™เปƒเบซเบกเปˆ.

เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เป‚เบ›เปเบเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ”เบตเบ‚เบถเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเป€เบ„เบทเปˆเบญเบ‡เบกเบท BCC เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”, เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ” kprobe เบชเปเบฒเบฅเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™ kernel 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 เป€เบชเบฑเป‰เบ™เบ”เบฝเบงเปƒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ kernel 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, เบกเบฑเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ kernel เปƒเบ™เป„เบŸเบฅเปŒ 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">

เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบกเบฑเบเบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™ runtime เบชเปเบฒเบฅเบฑเบš containers เป€เบŠเบฑเปˆเบ™ runC เบซเบผเบท Docker เป€เบžเบทเปˆเบญเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เป‚เบซเบกเบ”เบ—เบตเปˆเบšเปเปˆเบกเบตเบชเบดเบ”เบ—เบดเบžเบดเป€เบชเบ”, เปเบ•เปˆเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบฝเบ‡เปเบ•เปˆเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเปˆเบงเบ™เปƒเบซเบเปˆ. เป€เบกเบทเปˆเบญเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, Docker เบชเบฒเบกเบฒเบ”เบชเบฐเปœเบญเบ‡เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป‚เบ”เบเปƒเบŠเป‰ --cap-add:

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

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบˆเบฐเปƒเบซเป‰เบšเบฑเบ™เบˆเบธเบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ” CAP_NET_ADMIN, เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš dummy0.

เบžเบฒเบเบ•เปเปˆเป„เบ›เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เป€เบŠเบฑเปˆเบ™เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡, เปเบ•เปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ•เบฑเบเบ™เบดเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเบงเบเบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡.

Seccomp

Seccomp เบซเบเปเป‰เบกเบฒเบˆเบฒเบ Secure Computing เปเบฅเบฐเป€เบ›เบฑเบ™เบŠเบฑเป‰เบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™ Linux kernel เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเบฒเบกเบฒเบ”เบเบฑเปˆเบ™เบ•เบญเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ Seccomp เบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ›เบฝเบšเบ—เบฝเบšเบเบฑเบš Linux, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบซเบผเบฒเบเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเบžเบงเบเบกเบฑเบ™.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡ Seccomp เปเบฅเบฐ Linux เบšเปเปˆเปเบกเปˆเบ™เบชเบฐเป€เบžเบฒเบฐเป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™ เปเบฅเบฐเบกเบฑเบเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบ—เบฑเบ‡เบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ CAP_NET_ADMIN เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปเบ•เปˆเบšเปเปˆเปƒเบซเป‰เบกเบฑเบ™เบเบญเบกเบฎเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบŠเบฑเบญเบเป€เบเบฑเบ”, เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เบเบญเบกเบฎเบฑเบšเปเบฅเบฐเบเบญเบกเบฎเบฑเบšเบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš 4.

เบงเบดเบ—เบตเบเบฒเบ™เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡ Seccomp เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบ•เบปเบงเบเบญเบ‡ BPF เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ” SECCOMP_MODE_FILTER, เปเบฅเบฐเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เปƒเบ™เปเบšเบšเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”.

เบ•เบปเบงเบเบญเบ‡ Seccomp เบ–เบทเบเป‚เบซเบฅเบ”เป‚เบ”เบเปƒเบŠเป‰ prctl เบœเปˆเบฒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ PR_SET_SECOMP. เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ BPF เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบŠเบธเบ” Seccomp เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เป‚เบ”เบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ seccomp_data. เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ™เบตเป‰เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบญเป‰เบฒเบ‡เบญเบตเบ‡, เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเป‚เบ›เป€เบŠเบ”เป€เบŠเบตเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบš, เปเบฅเบฐเบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบซเบปเบเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš, เบชเบฐเปเบ”เบ‡เป€เบ›เบฑเบ™ uint64.

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ seccomp_data เบ„เป‰เบฒเบเบ„เบทเบˆเบฒเบเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ kernel เปƒเบ™เป„เบŸเบฅเปŒ linux/seccomp.h:

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

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเบฑเปˆเบ™เบ•เบญเบ‡เป‚เบ”เบเบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบš, เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ‚เบญเบ‡เบกเบฑเบ™, เบซเบผเบทเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡.

เบซเบผเบฑเบ‡เบˆเบฒเบเป„เบ”เป‰เบฎเบฑเบšเปเบ•เปˆเบฅเบฐเบŠเบธเบ” Seccomp, เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เป€เบžเบทเปˆเบญเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเบธเบ”เบ—เป‰เบฒเบเปเบฅเบฐเบšเบญเบ kernel เบงเปˆเบฒเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบ•เปเปˆเป„เบ›. เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเป‚เบ”เบเบซเบ™เบถเปˆเบ‡เปƒเบ™เบกเบนเบ™เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™ (เบฅเบฐเบซเบฑเบ”เบชเบฐเบ–เบฒเบ™เบฐ).

- SECOMP_RET_KILL_PROCESS - เบ‚เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ™เบตเป‰.

- SECOMP_RET_KILL_THREAD - เบชเบดเป‰เบ™เบชเบธเบ”เบเบฐเบ—เบนเป‰เบ›เบฐเบˆเบธเบšเบฑเบ™เบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ™เบตเป‰.

โ€” SECOMP_RET_KILL โ€” เบ™เบฒเบกเปเบเบ‡เบชเบณเบฅเบฑเบš SECOMP_RET_KILL_THREAD, เป„เบงเป‰เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเบผเบฑเบ‡.

- SECOMP_RET_TRAP - เบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบšเบ–เบทเบเบซเป‰เบฒเบก, เปเบฅเบฐเบชเบฑเบ™เบเบฒเบ™ SIGSYS (Bad System Call) เบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบงเบฝเบเบ—เบตเปˆเป‚เบ—เบซเบฒเบกเบฑเบ™.

- SECOMP_RET_ERRNO - เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบฅเบฐเบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ SECOMP_RET_DATA เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบšเบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เป€เบ›เบฑเบ™เบ„เปˆเบฒ errno. เบญเบตเบ‡เบ•เบฒเบกเบชเบฒเป€เบซเบ”เบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เบ„เปˆเบฒ errno เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™. เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบžเบฒเบเบ•เปเปˆเป„เบ›.

- SECOMP_RET_TRACE - เปƒเบŠเป‰เป€เบžเบทเปˆเบญเปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™ ptrace tracer เป‚เบ”เบเปƒเบŠเป‰ - PTRACE_O_TRACESECCOMP เป€เบžเบทเปˆเบญเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เป€เบกเบทเปˆเบญเบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เปเบฅเบฐเบ„เบงเบšเบ„เบธเบกเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบฑเป‰เบ™. เบ–เป‰เบฒ tracer เบšเปเปˆเป„เบ”เป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™, errno เบ–เบทเบเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™ -ENOSYS, เปเบฅเบฐเบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบšเบšเปเปˆเป„เบ”เป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™.

- SECOMP_RET_LOG - เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ–เบทเบเปเบเป‰เป„เบ‚ เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเบฅเบฐเบšเบปเบšเปเบฅเป‰เบง.

- SECOMP_RET_ALLOW - เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเปเบกเปˆเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ.

ptrace เปเบกเปˆเบ™เบเบฒเบ™เป€เบญเบตเป‰เบ™เบฅเบฐเบšเบปเบšเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ tracee, เบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเปเบฅเบฐเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™. เป‚เบ›เบฃเปเบเบก trace เบชเบฒเบกเบฒเบ”เบกเบตเบญเบดเบ”เบ—เบดเบžเบปเบ™เบ•เปเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” เปเบฅเบฐเบ”เบฑเบ”เปเบ›เบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเบณเบ‚เบญเบ‡ tracee. เปƒเบ™เบšเปเบฅเบดเบšเบปเบ” Seccomp, ptrace เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบกเบทเปˆเบญเบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เป‚เบ”เบเบฅเบฐเบซเบฑเบ”เบชเบฐเบ–เบฒเบ™เบฐ SECOMP_RET_TRACE, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ tracer เบชเบฒเบกเบฒเบ”เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” Seccomp

เปƒเบ™เบšเบฒเบ‡เป€เบงเบฅเบฒ, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Seccomp, เบ—เปˆเบฒเบ™เบˆเบฐเบžเบปเบšเบเบฑเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ•เปˆเบฒเบ‡เป†, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” SECOMP_RET_ERRNO. เป€เบžเบทเปˆเบญเบฅเบฒเบเบ‡เบฒเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš seccomp เบˆเบฐเบเบฑเบšเบ„เบทเบ™ -1 เปเบ—เบ™ 0.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰:

- EACCESS - เบœเบนเป‰เป‚เบ—เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบš. เบ™เบตเป‰เบกเบฑเบเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบกเบตเบชเบดเบ”เบ—เบด CAP_SYS_ADMIN เบซเบผเบท no_new_privs เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเปƒเบŠเป‰ prctl (เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบ•เปเปˆเบกเบฒ);

โ€” EFAULT โ€” เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™ (args เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ seccomp_data) เบšเปเปˆเบกเบตเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡;

โ€” EINVAL โ€” เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบกเบตโ€‹เบชเบตเปˆโ€‹เป€เบซเบ”โ€‹เบœเบปเบ™โ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹:

- เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เปเปเบกเปˆเบ™เบšเปเปˆเบฎเบนเป‰เบˆเบฑเบเบซเบผเบทเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบ kernel เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ›เบฐเบˆเบธเบšเบฑเบ™;

- เบ—เบธเบ‡เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เป;

-operation เบ›เบฐเบเบญเบšเบกเบต BPF_ABS, เปเบ•เปˆเบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบšเบเบฒเบ™เบŠเบปเบ”เป€เบŠเบตเบเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰, เป€เบŠเบดเปˆเบ‡เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ seccomp_data;

- เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบเบฑเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป€เบเบตเบ™เบชเบนเบ‡เบชเบธเบ”;

โ€” ENOMEM โ€” เบšเปเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบŠเบปเบ‡โ€‹เบˆเปเบฒโ€‹เบžเบฝเบ‡โ€‹เบžเปโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹;

- EOPNOTSUPP - เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบเบฑเบš SECCOMP_GET_ACTION_AVAIL เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบกเปˆเบ™เบกเบตเบขเบนเปˆ, เปเบ•เปˆ kernel เบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบœเบปเบ™เบ•เบญเบšเปเบ—เบ™เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡;

โ€” ESRCH โ€” เบšเบฑเบ™โ€‹เบซเบฒโ€‹เป„เบ”เป‰โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆ synchronizing เบชเบฒเบโ€‹เบ™โ€‹เป‰โ€‹เปโ€‹เบญเบทเปˆเบ™โ€‹;

- ENOSYS - เบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบดเบ”เบ•เบฒเบกเบ—เบตเปˆเบ•เบดเบ”เบเบฑเบšเบ„เบณเบชเบฑเปˆเบ‡ SECOMP_RET_TRACE.

prctl เปเบกเปˆเบ™เบเบฒเบ™เป€เบญเบตเป‰เบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป‚เบ„เบ‡เบเบฒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™ (เบเปเบฒเบ™เบปเบ”เปเบฅเบฐเบฎเบฑเบš) เบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เป€เบŠเบฑเปˆเบ™: byte endianness, เบŠเบทเปˆ thread, เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบ›เบญเบ”เป„เบž (Seccomp), เบชเบดเบ”เบ—เบดเบžเบดเป€เบชเบ”, เป€เบซเบ”เบเบฒเบ™ Perf, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

Seccomp เบญเบฒเบ”เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เป€เบ—เบเป‚เบ™เป‚เบฅเบเบต sandbox เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™, เปเบ•เปˆเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™. Seccomp เป€เบ›เบฑเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบปเบ™เป„เบ sandbox. เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเบนเป‰เปƒเบŠเป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบเบญเบ‡เบ—เบตเปˆเบ–เบทเบเป€เบญเบตเป‰เบ™เป‚เบ”เบเบเบปเบ‡เป‚เบ”เบเบฅเบฐเบšเบปเบš Seccomp call.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เบปเบงเบเบญเบ‡ BPF Seccomp

เปƒเบ™โ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบชเบปเบกโ€‹เบ—เบปเบšโ€‹เบชเบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบ›เบถเบโ€‹เบชเบฒโ€‹เบซเบฒโ€‹เบฅเบทโ€‹เบเปˆเบญเบ™โ€‹เบซเบ™เป‰เบฒโ€‹เบ™เบตเป‰โ€‹, เบ„เบทโ€‹:

โ€” เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบ‚เบฝเบ™โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™ Seccomp BPFโ€‹, เป€เบŠเบดเปˆเบ‡โ€‹เบˆเบฐโ€‹เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เป€เบ›เบฑเบ™โ€‹เบ•เบปเบงโ€‹เบเบฑเปˆเบ™โ€‹เบ•เบญเบ‡โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบœเบปเบ™โ€‹เบ•เบญเบšโ€‹เปเบ—เบ™โ€‹เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™โ€‹เบ‚เบถเป‰เบ™โ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเบ”โ€‹เบชเบดเบ™โ€‹เปƒเบˆโ€‹เป„เบ”เป‰โ€‹;

- เป‚เบซเบผเบ”เบ•เบปเบงเบเบญเบ‡เป‚เบ”เบเปƒเบŠเป‰ prctl.

เบ—เปเบฒเบญเบดเบ”เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ headers เบˆเบฒเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปเบฅเบฐ Linux kernel:

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

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒ kernel เป„เบ”เป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเบ”เป‰เบงเบ CONFIG_SECCOMP เปเบฅเบฐ CONFIG_SECOMP_FILTER เบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™ y. เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเป„เบ”เป‰เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP

เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡_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 accumulator เบ„เบปเบ‡เบ—เบตเปˆเป€เบ—เบปเปˆเบฒเบเบฑเบš arch. เบ–เป‰เบฒเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป‚เบ”เบ”เบขเบนเปˆเบ—เบตเปˆ offset 0 เป„เบ›เบซเบฒเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เปเปˆเป„เบ›, เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฐเป‚เบ”เบ”เบขเบนเปˆเบ—เบตเปˆ offset 3 (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰) เป€เบžเบทเปˆเบญเบ–เบดเป‰เบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบžเบฒเบฐเบงเปˆเบฒ arch เบšเปเปˆเบเบปเบ‡เบเบฑเบ™.

- 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 | (error & SECOMP_RET_DATA)) - เบขเบธเบ”เป‚เบ›เบฃเปเบเบกเบ”เป‰เบงเบ BPF_RET เปเบฅเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” SECOMP_RET_ERRNO เบเบฑเบšเบ•เบปเบงเป€เบฅเบเบˆเบฒเบเบ•เบปเบงเปเบ› err.

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - เบขเบธเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ”เป‰เบงเบ BPF_RET เปเบฅเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบšเป‚เบ”เบเปƒเบŠเป‰ SECOMP_RET_ALLOW.

SECOMP เปเบกเปˆเบ™ CBPF
เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบชเบปเบ‡เป„เบชเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบงเบฑเบ”เบ–เบธ ELF เบ—เบตเปˆเบฅเบงเบšเบฅเบงเบกเบซเบผเบทเป‚เบ„เบ‡เบเบฒเบ™ C เบ—เบตเปˆเบฅเบงเบšเบฅเบงเบก JIT.

เบกเบตเบชเบญเบ‡เป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰.

โ€ขเบ—เปเบฒเบญเบดเบ”, Seccomp เปƒเบŠเป‰ cBPF (BPF เบ„เบฅเบฒเบชเบชเบดเบ) เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™ eBPF, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ: เบกเบฑเบ™เบšเปเปˆเบกเบตเบ—เบฐเบšเบฝเบ™, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบชเบฐเบชเบปเบกเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบœเบปเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡.

โ€ขเบญเบฑเบ™เบ—เบตเบชเบญเบ‡, Seccomp เบเบญเบกเบฎเบฑเบšเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒ array เบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ BPF เป‚เบ”เบเบเบปเบ‡เปเบฅเบฐเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบญเบตเบ. เบกเบฐเบซเบฒเบžเบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบŠเปˆเบงเบเบฅเบฐเบšเบธเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบ™เบงเบดเบ—เบตเบ—เบตเปˆเป€เบ›เบฑเบ™เบกเบดเบ”เบเบฑเบšเป‚เบ›เบฅเปเบเบฅเบก.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบŠเปˆเบงเบเป€เบซเบผเบทเบญเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบเบฒเบ™เบ›เบฐเบเบญเบšเบ™เบตเป‰, เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ pseudocode เบ—เบตเปˆเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™:

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_SECOMP เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเป‚เบซเบกเบ”เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‰เบ—เบตเปˆเบ›เบญเบ”เป„เบž. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเบญเบเป‚เบซเบกเบ”เบเบฒเบ™เป‚เบซเบผเบ”เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป‚เบ”เบเปƒเบŠเป‰ SECOMP_MODE_FILTER, เป€เบŠเบดเปˆเบ‡เบšเบฑเบ™เบˆเบธเบขเบนเปˆเปƒเบ™เบ•เบปเบงเปเบ› prog เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” 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 เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเปƒเบซเป‰เบชเบดเบ”เบ—เบตเปˆเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ—เบฑเบ‡เปเบปเบ”. เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ•เบปเบงเบเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบชเบทเบšเบ•เปเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ argument เบ—เปเบฒเบญเบดเบ”:

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

เบญเบฑเบ”เบชเบฐเบˆเบฑเบ™! เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป‚เบ›เบผเปเบเบผเบก wrapper เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ: เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบœเปˆเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบ›เบฑเบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เปเบฒเบญเบดเบ”:

./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, เบ„เบปเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ„เบดเบ”เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ‚เบฝเบ™เปเบฅเบฐเป‚เบซเบฅเบ”เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบชเบดเบ”เบ—เบดเบžเบดเป€เบชเบ”เบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™. เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, kernel เบ›เบฐเบ•เบดเบšเบฑเบ”เบŠเบธเบ”เบ‚เบญเบ‡เบเบปเบ™เป„เบเป€เบžเบทเปˆเบญเบ›เบปเบเบ›เป‰เบญเบ‡เบงเบฑเบ”เบ–เบธ eBPF เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเบฒเบ‡เป†. เบเบปเบ™เป„เบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ BPF LSM traps.

BPF LSM เบเบฑเบšเบ”เบฑเบ

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเป€เบซเบ”เบเบฒเบ™เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเปเบšเบšเป€เบญเบเบฐเบฅเบฒเบ”เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ, LSM เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เปƒเบชเปˆเบเบฑเบšเบ”เบฑเบ. เบเบฒเบ™เป‚เบ—เบซเบฒ hook เปเบกเปˆเบ™เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบš, เปเบ•เปˆเป€เบ›เบฑเบ™เบฅเบฐเบšเบปเบšเป€เบญเบเบฐเบฅเบฒเบ”เปเบฅเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™. LSM เบชเบฐเบซเบ™เบญเบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปƒเบซเบกเปˆเบ—เบตเปˆเบŠเบฑเป‰เบ™ abstraction เบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบžเบปเบšเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบเปˆเบฝเบงเบเบฑเบšเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™.

เปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™, kernel เบกเบตเป€เบˆเบฑเบ” hooks เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ BPF, เปเบฅเบฐ SELinux เปเบกเปˆเบ™ LSM เบ—เบตเปˆเบกเบตเบ•เบปเบงเบ”เบฝเบงเบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบงเบเบกเบฑเบ™.

เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบ”เบฑเบเปเบกเปˆเบ™เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™ kernel tree เปƒเบ™เป„เบŸเบฅเปŒ 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 - เบเบงเบ”เป€เบšเบดเปˆเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆ kernel เบชเบปเปˆเบ‡เบ„เบทเบ™เป„เบŸเบฅเปŒ descriptor เบชเปเบฒเบฅเบฑเบšเปเบœเบ™เบ—เบตเปˆ;

- security_bpf_prog - เบเบงเบ”เป€เบšเบดเปˆเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆ kernel เบชเบปเปˆเบ‡เบ„เบทเบ™เป„เบŸเบฅเปŒ descriptor เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ eBPF;

โ€” security_bpf_map_alloc โ€” เบเบงเบ”โ€‹เป€เบšเบดเปˆเบ‡โ€‹เบงเปˆเบฒโ€‹เบžเบฒเบโ€‹เบชเบฐโ€‹เบซเบ™เบฒเบกโ€‹เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบžเบฒเบโ€‹เปƒเบ™โ€‹เปเบœเบ™โ€‹เบ—เบตเปˆ BPF เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹;

- security_bpf_map_free - เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป„เบ”เป‰เบ–เบทเบเบญเบฐเบ™เบฒเป„เบกเบขเบนเปˆเปƒเบ™เปเบœเบ™เบ—เบตเปˆ BPF;

โ€” security_bpf_prog_alloc โ€” เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป„เบ”เป‰เบ–เบทเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบฒเบเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ BPF;

- security_bpf_prog_free - เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป„เบ”เป‰เบ–เบทเบเบญเบฐเบ™เบฒเป„เบกเบžเบฒเบเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ BPF.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป€เบซเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเปƒเบˆ: เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ LSM BPF interceptors เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เปเบ•เปˆเบฅเบฐเบงเบฑเบ”เบ–เบธ eBPF, เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบœเบนเป‰เบ—เบตเปˆเบกเบตเบชเบดเบ”เบ—เบดเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบšเบฑเบ”เปเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™.

Summary

เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เปƒเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ”เบฝเบงโ€‹เป€เบซเบกเบฒเบฐโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบปเบโ€‹เบ›เบฑเบโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เบ›เบปเบเบ›เป‰เบญเบ‡เบฅเบฐเบšเบปเบšเบ•เปˆเบฒเบ‡เป†เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเบฒเบ‡เป†เปเบฅเบฐเปƒเบ™เบ—เบฒเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เป€เบŠเบทเปˆเบญเบซเบผเบทเบšเปเปˆ, เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบเบฒเบ™เบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเปเบกเปˆเบ™เบเบฒเบ™เบˆเบฑเบ”เบฅเบฐเบšเบฝเบšเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบˆเบฒเบเบ•เปเบฒเปเบซเบ™เปˆเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบฅเบฐเบ”เบฑเบšเบซเบ™เบถเปˆเบ‡เบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบฅเบฐเบšเบปเบšเบ—เบฑเบ‡เบซเบกเบปเบ”. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบซเบผเบฑเบเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบ”เบตเปƒเบ™เบเบฒเบ™เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบŠเบธเบ”เบŠเบฑเป‰เบ™เบ•เปˆเบฒเบ‡เป† เปเบฅเบฐเบˆเบธเบ”เบชเปเบฒเบœเบฑเบ”เบ•เปˆเบฒเบ‡เป†. เบžเบงเบเป€เบฎเบปเบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ”เบตเบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบŠเบฑเป‰เบ™เปเบกเปˆเบ™เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป‚เบ›เบผเปเบเบผเบก BPF เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบงเบเบกเบฑเบ™.

เบเปˆเบฝเบงเบเบฑเบšเบœเบนเป‰เบ‚เบฝเบ™

David Calavera เปเบกเปˆเบ™ CTO เบขเบนเปˆ Netlify. เบฅเบฒเบงเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Docker เปเบฅเบฐเบ›เบฐเบเบญเบšเบชเปˆเบงเบ™เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ„เบทเปˆเบญเบ‡เบกเบท Runc, Go เปเบฅเบฐ BCC, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบญเบทเปˆเบ™เป†. เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบฅเบฒเบงเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ Docker เปเบฅเบฐเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบฅเบฐเบšเบปเบšเบ™เบดเป€เบงเบ” Docker plugin. David เบกเบตเบ„เบงเบฒเบกเบเบฐเบ•เบทเบฅเบทเบฅเบปเป‰เบ™เบซเบผเบฒเบเบเปˆเบฝเบงเบเบฑเบšเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡ flame เปเบฅเบฐเบชเบฐเป€เบซเบกเบตเบŠเบญเบเบซเบฒเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”.

Lorenzo Fontana เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ—เบตเบกเบ‡เบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบขเบนเปˆ Sysdig, เบšเปˆเบญเบ™เบ—เบตเปˆเบฅเบฒเบงเบชเบธเบกเปƒเบชเปˆเบ•เบปเป‰เบ™เบ•เปเบเปˆเบฝเบงเบเบฑเบš Falco, เป‚เบ„เบ‡เบเบฒเบ™ Cloud Native Computing Foundation เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡ container runtime เปเบฅเบฐเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบœเบดเบ”เบ›เบปเบเบเบฐเบ•เบดเบœเปˆเบฒเบ™เป‚เบกเบ”เบนเบ™เปเบเปˆเบ™เปเบฅเบฐ eBPF. เบฅเบฒเบงเบกเบตเบ„เบงเบฒเบกเบเบฐเบ•เบทเบฅเบทเบฅเบปเป‰เบ™เบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเปเบˆเบเบขเบฒเบ, เบŠเบญเบšเปเบงเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เปเบเปˆเบ™ Linux, เปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

ยป เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบ›เบถเป‰เบกเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เบ—เบตเปˆ เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบœเบนเป‰เป€เบœเบตเบเปเบœเปˆ
ยป เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ™เบทเป‰เบญเบซเบฒ
ยป เบšเบปเบ”เบ„เบฑเบ”เบซเบเปเป‰

เบชเปเบฒเบฅเบฑเบš Khabrozhiteley เบชเปˆเบงเบ™เบฅเบปเบ” 25% เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบนเบ›เบญเบ‡ - Linux

เบžเบฒเบเบซเบผเบฑเบ‡เบเบฒเบ™เบŠเปเบฒเบฅเบฐเบชเบฐเบšเบฑเบšเป€เบˆเป‰เบเบ‚เบญเบ‡เบ›เบถเป‰เบก, เบ›เบถเป‰เบกเบญเบตเป€เบฅเบฑเบเป‚เบ—เบฃเบ™เบดเบเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบ—เบฒเบ‡เบญเบตเป€เบกเบฅ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™