"เชฒเชฟเชจเช•เซเชธ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชฎเชพเชŸเซ‡ BPF" เชฌเซเช• เช•เชฐเซ‹

"เชฒเชฟเชจเช•เซเชธ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชฎเชพเชŸเซ‡ BPF" เชฌเซเช• เช•เชฐเซ‹เชนเซ‡เชฒเซ‹, เช–เชพเชฌเชฐเซ‹เชจเชพ เชฐเชนเซ‡เชตเชพเชธเซ€เช“! BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช Linux เช•เชฐเซเชจเชฒเชจเชพ เชธเซŒเชฅเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช˜เชŸเช•เซ‹เชฎเชพเช‚เชจเซเช‚ เชเช• เช›เซ‡. เชคเซ‡เชจเซ‹ เชฏเซ‹เช—เซเชฏ เช‰เชชเชฏเซ‹เช— เชธเชฟเชธเซเชŸเชฎ เชเชจเซเชœเชฟเชจเชฟเชฏเชฐเซ‹เชจเซ‡ เช–เชพเชฎเซ€เช“ เชถเซ‹เชงเชตเชพ เช…เชจเซ‡ เชธเซŒเชฅเซ€ เชœเชŸเชฟเชฒ เชธเชฎเชธเซเชฏเชพเช“เชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเชถเซ‡. เชคเชฎเซ‡ เช•เชฐเซเชจเชฒเชจเซ€ เชตเชฐเซเชคเชฃเซ‚เช•เชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐ เช…เชจเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเชคเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ เชคเซ‡ เชถเซ€เช–เซ€ เชถเช•เชถเซ‹, เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช‡เชตเซ‡เชจเซเชŸเซเชธเชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชกเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเซ‹, เช…เชจเซ‡ เช˜เชฃเซเช‚ เชฌเชงเซเช‚. David Calavera เช…เชจเซ‡ Lorenzo Fontana เชคเชฎเชจเซ‡ BPF เชจเซ€ เชถเช•เซเชคเชฟเชจเซ‡ เช…เชจเชฒเซ‰เช• เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡. เชชเชฐเชซเซ‹เชฐเซเชฎเชจเซเชธ เช“เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ, เชจเซ‡เชŸเชตเชฐเซเช•เซ€เช‚เช—, เชธเชฟเช•เซเชฏเซ‹เชฐเชฟเชŸเซ€เชจเชพ เชคเชฎเชพเชฐเชพ เชœเซเชžเชพเชจเชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‹. - Linux เช•เชฐเซเชจเชฒเชจเซ€ เชตเชฐเซเชคเชฃเซ‚เช•เชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐ เช•เชฐเชตเชพ เช…เชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. - เช•เชฐเซเชจเชฒเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เช…เชฅเชตเชพ เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชฐเซ€เชฌเซ‚เชŸ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เช•เชฐเซเชจเชฒ เช‡เชตเซ‡เชจเซเชŸเซเชธเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชก เช‡เชจเซเชœเซ‡เช•เซเชŸ เช•เชฐเซ‹. โ€” C, Go เช…เชฅเชตเชพ Python เชฎเชพเช‚ เช…เชจเซเช•เซ‚เชณ เช•เซ‹เชก เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. - BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชœเซ€เชตเชจเชšเช•เซเชฐเชจเซ€ เชฎเชพเชฒเชฟเช•เซ€ เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชฒเซ‹.

Linux เช•เชฐเซเชจเชฒ เชธเซเชฐเช•เซเชทเชพ, เชคเซ‡เชจเซ€ เชตเชฟเชถเซ‡เชทเชคเชพเช“ เช…เชจเซ‡ Seccomp

BPF เชธเซเชฅเชฟเชฐเชคเชพ, เชธเซเชฐเช•เซเชทเชพ เช…เชฅเชตเชพ เชเชกเชชเชจเซ‡ เชฌเชฒเชฟเชฆเชพเชจ เช†เชชเซเชฏเชพ เชตเชฟเชจเชพ เช•เชฐเซเชจเชฒเชจเซ‡ เชตเชฟเชธเซเชคเชพเชฐเชตเชพเชจเซ€ เชเช• เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เชฐเซ€เชค เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เช† เช•เชพเชฐเชฃเซ‹เชธเชฐ, เช•เชฐเซเชจเชฒ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เชตเชฟเชšเชพเชฐเซเชฏเซเช‚ เช•เซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฆเซเชตเชพเชฐเชพ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก Seccomp เชซเชฟเชฒเซเชŸเชฐเซเชธ, เชœเซ‡เชจเซ‡ Seccomp BPF เชคเชฐเซ€เช•เซ‡ เชชเชฃ เช“เชณเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‡เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฆเซเชตเชพเชฐเชพ Seccomp เชฎเชพเช‚ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช…เชฒเช—เชคเชพ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ€ เชตเซˆเชตเชฟเชงเซเชฏเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เช เชธเชพเชฐเซ‹ เชตเชฟเชšเชพเชฐ เช›เซ‡. เช† เชชเซเชฐเช•เชฐเชฃเชฎเชพเช‚ เช…เชฎเซ‡ Seccomp เชถเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเชพเชตเซ€เชถเซเช‚. เชชเช›เซ€ เชคเชฎเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Seccomp เชซเชฟเชฒเซเชŸเชฐเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ เชคเซ‡ เชถเซ€เช–เซ€ เชถเช•เชถเซ‹. เชคเซ‡ เชชเช›เซ€, เช…เชฎเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ BPF เชนเซเช•เซเชธ เชœเซ‹เชˆเชถเซเช‚ เชœเซ‡ Linux เชธเซเชฐเช•เซเชทเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซเชธ เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เช›เซ‡.

Linux เชธเชฟเช•เซเชฏเซเชฐเชฟเชŸเซ€ เชฎเซ‹เชกเซเชฏเซเชฒเซเชธ (LSM) เช เชเช• เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เช›เซ‡ เชœเซ‡ เชซเช‚เช•เซเชถเชจเชจเซ‹ เชธเชฎเซ‚เชน เชชเซ‚เชฐเซ‹ เชชเชพเชกเซ‡ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชชเซเชฐเชฎเชพเชฃเชฟเชค เชฐเซ€เชคเซ‡ เชตเชฟเชตเชฟเชง เชธเซเชฐเช•เซเชทเชพ เชฎเซ‹เชกเชฒเซเชธเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. LSM เชจเซ‡ เชธเซ€เชงเชพ เช•เชฐเซเชจเชฒ เชธเซเชคเซเชฐเซ‹เชค เชตเซƒเช•เซเชทเชฎเชพเช‚ เชตเชพเชชเชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ Apparmor, SELinux เช…เชจเซ‡ Tomoyo.

เชšเชพเชฒเซ‹ Linux เชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเซ€เชจเซ‡ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€เช.

เชฒเช•เซเชทเชฃเซ‹

Linux เชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ‹ เชธเชพเชฐ เช เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชšเซ‹เช•เซเช•เชธ เช•เชพเชฐเซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชฌเชฟเชจเชชเซเชฐเชพเชชเซเชคเชฟเชนเซ€เชค เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชนเซ‡เชคเซ เชฎเชพเชŸเซ‡ suidเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ, เช…เชฅเชตเชพ เช…เชจเซเชฏเชฅเชพ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เซƒเชค เชฌเชจเชพเชตเชตเซ€, เชนเซเชฎเชฒเชพเชจเซ€ เชถเช•เซเชฏเชคเชพ เช˜เชŸเชพเชกเซ€เชจเซ‡ เช…เชจเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชšเซ‹เช•เซเช•เชธ เช•เชพเชฐเซเชฏเซ‹ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เซƒเชค เชชเซ‹เชฐเซเชŸ เช–เซ‹เชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ 80 เช•เชนเซ‹, เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชฐเซ‚เชŸ เชคเชฐเซ€เช•เซ‡ เชšเชฒเชพเชตเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ CAP_NET_BIND_SERVICE เช•เซเชทเชฎเชคเชพ เช†เชชเซ€ เชถเช•เซ‹ เช›เซ‹.

main.go เชจเชพเชฎเชจเชพ เช—เซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เชตเชฟเชšเชพเชฐ เช•เชฐเซ‹:

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

เช† เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซ‹เชฐเซเชŸ 80 เชชเชฐ HTTP เชธเชฐเซเชตเชฐเชจเซ‡ เชธเซ‡เชตเชพ เช†เชชเซ‡ เช›เซ‡ (เช† เชเช• เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เซƒเชค เชชเซ‹เชฐเซเชŸ เช›เซ‡). เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชธเช‚เช•เชฒเชจ เชชเช›เซ€ เชคเชฐเชค เชœ เชšเชฒเชพเชตเซ€เช เช›เซ€เช:

$ go build -o capabilities main.go
$ ./capabilities

เชœเซ‹ เช•เซ‡, เช…เชฎเซ‡ เชฐเซ‚เชŸ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เชพเชฐเซ‹ เช†เชชเชคเชพ เชจ เชนเซ‹เชตเชพเชฅเซ€, เช† เช•เซ‹เชก เชชเซ‹เชฐเซเชŸเชจเซ‡ เชฌเชพเช‚เชงเชคเซ€ เชตเช–เชคเซ‡ เชญเซ‚เชฒ เช•เชฐเชถเซ‡:

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

capsh (เชถเซ‡เชฒ เชฎเซ‡เชจเซ‡เชœเชฐ) เช เชเช• เชธเชพเชงเชจ เช›เซ‡ เชœเซ‡ เช•เซเชทเชฎเชคเชพเช“เชจเชพ เชšเซ‹เช•เซเช•เชธ เชธเซ‡เชŸ เชธเชพเชฅเซ‡ เชถเซ‡เชฒ เชšเชฒเชพเชตเซ‡ เช›เซ‡.

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡ เชคเซ‡เชฎ, เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ‚เชŸ เช…เชงเชฟเช•เชพเชฐเซ‹ เช†เชชเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชคเชฎเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช›เซ‡ เชคเซ‡ เชฌเชงเซเช‚ เชธเชพเชฅเซ‡ cap_net_bind_service เช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ€เชจเซ‡ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เซƒเชค เชชเซ‹เชฐเซเชŸ เชฌเชพเชˆเชจเซเชกเชฟเช‚เช—เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช•เซ…เชชเชถเชฎเชพเช‚ เชฌเช‚เชง เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช:

# capsh --caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' 
   --keep=1 --user="nobody" 
   --addamb=cap_net_bind_service -- -c "./capabilities"

เชšเชพเชฒเซ‹ เช† เชŸเซ€เชฎเชจเซ‡ เชฅเซ‹เชกเซเช‚ เชธเชฎเชœเซ€เช.

  • capsh - เชถเซ‡เชฒ เชคเชฐเซ€เช•เซ‡ capsh เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹.
  • โ€”caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - เช•เชพเชฐเชฃ เช•เซ‡ เช…เชฎเชพเชฐเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เช…เชฎเซ‡ เชฐเซ‚เชŸ เชคเชฐเซ€เช•เซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€), เช…เชฎเซ‡ cap_net_bind_service เช…เชจเซ‡ เช–เชฐเซ‡เช–เชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ ID เชจเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เชถเซเช‚. เชฐเซเชŸ เชŸเซ เชจเซ‹เชฌเชกเซ€, เชเชŸเชฒเซ‡ เช•เซ‡ cap_setuid เช…เชจเซ‡ cap_setgid.
  • โ€”keep=1 โ€” เช…เชฎเซ‡ เชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸเชฎเชพเช‚เชฅเซ€ เชธเซเชตเชฟเชš เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชธเซเชฅเชพเชชเชฟเชค เช•เซเชทเชฎเชคเชพเช“ เชฐเชพเช–เชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช.
  • โ€”user=โ€œเช•เซ‹เชˆ เชจเชนเชฟโ€ โ€” เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเชจเชพเชฐ เช…เช‚เชคเชฟเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช•เซ‹เชˆ เชจเชนเซ€เช‚ เชนเซ‹เชฏ.
  • โ€”addamb=cap_net_bind_service โ€” เชฐเซเชŸ เชฎเซ‹เชกเชฎเชพเช‚เชฅเซ€ เชธเซเชตเชฟเชš เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชธเช‚เชฌเช‚เชงเชฟเชค เช•เซเชทเชฎเชคเชพเช“เชจเชพ เช•เซเชฒเชฟเชฏเชฐเชฟเช‚เช—เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเซ‹.
  • - -c "./capabilities" - เชซเช•เซเชค เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเซ‹.

เชฒเชฟเช‚เช•เซเชก เช•เซเชทเชฎเชคเชพเช“ เช เชเช• เช–เชพเชธ เชชเซเชฐเช•เชพเชฐเชจเซ€ เช•เซเชทเชฎเชคเชพเช“ เช›เซ‡ เชœเซ‡ เชฌเชพเชณ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹ เชฆเซเชตเชพเชฐเชพ เชตเชพเชฐเชธเชพเชฎเชพเช‚ เชฎเชณเซ‡ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชคเซ‡เชฎเชจเซ‡ execve() เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเซ‡ เช›เซ‡. เชฎเชพเชคเซเชฐ เชเชตเซ€ เช•เซเชทเชฎเชคเชพเช“ เช•เซ‡ เชœเซ‡เชจเซ‡ เชธเชพเช‚เช•เชณเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช›เซ‡, เช…เชฅเชตเชพ เชฌเซ€เชœเชพ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เชชเชฐเซเชฏเชพเชตเชฐเชฃเซ€เชฏ เช•เซเชทเชฎเชคเชพเช“ เชคเชฐเซ€เช•เซ‡, เชตเชพเชฐเชธเชพเชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡.

--caps เชตเชฟเช•เชฒเซเชชเชฎเชพเช‚ เช•เซเชทเชฎเชคเชพเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชคเชฎเซ‡ เช•เชฆเชพเชš เช†เชถเซเชšเชฐเซเชฏ เชชเชพเชฎเซ€ เชฐเชนเซเชฏเชพ เช›เซ‹ เช•เซ‡ +eip เชจเซ‹ เช…เชฐเซเชฅ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡. เช† เชซเซเชฒเซ‡เช—เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซเชทเชฎเชคเชพ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡:

-เชธเช•เซเชฐเชฟเชฏ เชนเซ‹เชตเซเช‚ เชœ เชœเซ‹เชˆเช (p);

- เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง (e);

-เชฌเชพเชณ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชฆเซเชตเชพเชฐเชพ เชตเชพเชฐเชธเชพเชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ (i).

เช•เชพเชฐเชฃ เช•เซ‡ เช†เชชเชฃเซ‡ cap_net_bind_service เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช, เช†เชชเชฃเซ‡ เช† เชˆ เชซเซเชฒเซ‡เช— เชธเชพเชฅเซ‡ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเช›เซ€ เช†เชชเชฃเซ‡ เช†เชฆเซ‡เชถเชฎเชพเช‚ เชถเซ‡เชฒ เชถเชฐเซ‚ เช•เชฐเซ€เชถเซเช‚. เช† เช•เซเชทเชฎเชคเชพเช“เชจเซ‡ เชฌเชพเชˆเชจเชฐเซ€ เชšเชฒเชพเชตเชถเซ‡ เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‡ i เชซเซเชฒเซ‡เช— เชธเชพเชฅเซ‡ เชšเชฟเชนเซเชจเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช›เซ‡เชฒเซเชฒเซ‡, เช…เชฎเซ‡ เช‡เชšเซเช›เซ€เช เช›เซ€เช เช•เซ‡ p เชธเชพเชฅเซ‡ เชธเซเชตเชฟเชงเชพ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ (เช…เชฎเซ‡ UID เชฌเชฆเชฒเซเชฏเชพ เชตเชฟเชจเชพ เช† เช•เชฐเซเชฏเซเช‚). เชคเซ‡ cap_net_bind_service+eip เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡.

เชคเชฎเซ‡ ss เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎ เชšเช•เชพเชธเซ€ เชถเช•เซ‹ เช›เซ‹. เชšเชพเชฒเซ‹ เชชเซƒเชทเซเช  เชชเชฐ เชซเชฟเชŸ เชฅเชตเชพ เชฎเชพเชŸเซ‡ เช†เช‰เชŸเชชเซเชŸเชจเซ‡ เชฅเซ‹เชกเซเช‚ เชŸเซ‚เช‚เช•เซเช‚ เช•เชฐเซ€เช, เชชเชฐเช‚เชคเซ เชคเซ‡ 0 เชธเชฟเชตเชพเชฏ เช…เชจเซเชฏ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เชชเซ‹เชฐเซเชŸ เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ ID เชฌเชคเชพเชตเชถเซ‡, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ 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 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชถเซ‡เชฒ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹. เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เชฎเชพเชŸเซ‡, เชฎเซ‡เชจ 3 เชฒเชฟเชฌเช•เซ‡เชช เชœเซเช“.

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชคเซ€ เชตเช–เชคเซ‡, เช˜เชฃเซ€ เชตเชพเชฐ เชกเซ‡เชตเชฒเชชเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฐเชจ เชธเชฎเชฏเซ‡ เชœเซ‹เชˆเชคเซ€ เชคเชฎเชพเชฎ เชธเซเชตเชฟเชงเชพเช“ เช…เช—เชพเช‰เชฅเซ€ เชœเชพเชฃเชคเซ‹ เชจเชฅเซ€; เชตเชงเซเชฎเชพเช‚, เช† เชธเซเชตเชฟเชงเชพเช“ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชฎเชพเช‚ เชฌเชฆเชฒเชพเชˆ เชถเช•เซ‡ เช›เซ‡.

เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ‡ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ 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 เช เชธเชฟเช•เซเชฏเซ‹เชฐ เช•เชฎเซเชชเซเชฏเซเชŸเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ Linux เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชพเชฏเซ‡เชฒ เชธเซเชฐเช•เซเชทเชพ เชธเซเชคเชฐ เช›เซ‡ เชœเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชšเซ‹เช•เซเช•เชธ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชœเซ‹เช•เซ‡ เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชฒเชฟเชจเช•เซเชธ เชธเชพเชฅเซ‡ เช•เซเชทเชฎเชคเชพเช“เชฎเชพเช‚ เชคเซเชฒเชจเชพเชคเซเชฎเช• เช›เซ‡, เช…เชฎเซเช• เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒเซเชธเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพเชจเซ€ เชคเซ‡เชจเซ€ เช•เซเชทเชฎเชคเชพ เชคเซ‡เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€เชฎเชพเช‚ เชคเซ‡เชจเซ‡ เชตเชงเซ เชฒเชตเชšเซ€เช• เชฌเชจเชพเชตเซ‡ เช›เซ‡.

Seccomp เช…เชจเซ‡ Linux เชฒเช•เซเชทเชฃเซ‹ เชชเชฐเชธเซเชชเชฐ เชตเชฟเชถเชฟเชทเซเชŸ เชจเชฅเซ€ เช…เชจเซ‡ เช˜เชฃเซ€ เชตเช–เชค เชฌเช‚เชจเซ‡ เช…เชญเชฟเช—เชฎเซ‹เชฅเซ€ เชฒเชพเชญ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เชธเชพเชฅเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชฏ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชฎเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ CAP_NET_ADMIN เช•เซเชทเชฎเชคเชพ เช†เชชเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹ เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ‡ เชธเซ‹เช•เซ‡เชŸ เช•เชจเซ‡เช•เซเชถเชจเซเชธ เชธเซเชตเซ€เช•เชพเชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชคเชพ เชจเชฅเซ€, เชธเซเชตเซ€เช•เชพเชฐเซ‹ เช…เชจเซ‡ เชธเซเชตเซ€เช•เชพเชฐเซ‹4 เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเซ‡ เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเซ‹.

Seccomp เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟ SECOMP_MODE_FILTER เชฎเซ‹เชกเชฎเชพเช‚ เช•เชพเชฐเซเชฏเชฐเชค BPF เชซเชฟเชฒเซเชŸเชฐเซเชธ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡, เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช— เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชœเซ‡เชฎ เชœ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชซเชฟเชฒเซเชŸเชฐเซเชธ 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_O_TRACESECCOMP เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ ptrace เชŸเซเชฐเซ‡เชธเชฐเชจเซ‡ เชธเซ‚เชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡. เชœเซ‹ เชŸเซเชฐเซ‡เชธเชฐ เช•เชจเซ‡เช•เซเชŸเซ‡เชก เชจ เชนเซ‹เชฏ, เชคเซ‹ เชญเซ‚เชฒ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชญเซ‚เชฒ -ENOSYS เชชเชฐ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เชฅเชคเซ‹ เชจเชฅเซ€.

- SECOMP_RET_LOG - เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เช‰เช•เซ‡เชฒเชพเชˆ เช—เชฏเซ‹ เช…เชจเซ‡ เชฒเซ‰เช— เชฅเชฏเซ‹.

- SECOMP_RET_ALLOW - เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช›เซ‡.

ptrace เช เชŸเซเชฐเซ‡เชธเซ€ เชจเชพเชฎเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชŸเซเชฐเซ‡เชธเซ€เช‚เช— เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชเช• เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เช…เชฎเชฒเชจเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช›เซ‡. เชŸเซเชฐเซ‡เชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชจเซ‡ เชชเซเชฐเชญเชพเชตเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชŸเซเชฐเซ‡เชธเซ€เชจเชพ เชฎเซ‡เชฎเชฐเซ€ เชฐเชœเซ€เชธเซเชŸเชฐเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. Seccomp เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚, เชœเซเชฏเชพเชฐเซ‡ SECOMP_RET_TRACE เชธเซเชŸเซ‡เชŸเชธ เช•เซ‹เชก เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเชฟเช—เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ ptrace เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡เชฅเซ€ เชŸเซเชฐเซ‡เชธเชฐ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชคเชพ เช…เชŸเช•เชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชคเชฐเซเช•เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€ เชถเช•เซ‡ เช›เซ‡.

เชธเซ‡เช•เช•เซ‹เชฎเซเชช เชญเซ‚เชฒเซ‹

เชธเชฎเชฏ เชธเชฎเชฏ เชชเชฐ, 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 เช เชเช• เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡ เชœเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชธเซ‡เชจเซเชกเชฌเซ‹เช•เซเชธ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡. เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ€เช•เซ‹เชฎเซเชช เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒ เชฆเซเชตเชพเชฐเชพ เชธเซ€เชงเชพ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชคเชพ เชซเชฟเชฒเซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฏเซเชเชฐ เช‡เชจเซเชŸเชฐเซ‡เช•เซเชถเชจ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

BPF Seccomp เชซเชฟเชฒเซเชŸเชฐ เช‰เชฆเชพเชนเชฐเชฃ

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชฌเชคเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เช…เช—เชพเช‰ เชšเชฐเซเชšเชพ เช•เชฐเซ‡เชฒเซ€ เชฌเซ‡ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเชตเซ€, เชเชŸเชฒเซ‡ เช•เซ‡:

โ€” เช…เชฎเซ‡ เชเช• Seccomp BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ€เชถเซเช‚, เชœเซ‡ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชจเชฟเชฐเซเชฃเชฏเซ‹เชจเชพ เช†เชงเชพเชฐเซ‡ เช…เชฒเช—-เช…เชฒเช— เชฐเชฟเชŸเชฐเซเชจ เช•เซ‹เชกเซเชธ เชธเชพเชฅเซ‡ เชซเชฟเชฒเซเชŸเชฐ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชถเซ‡;

prctl เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เชฒเซ‹เชก เช•เชฐเซ‹.

เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เช…เชจเซ‡ Linux เช•เชฐเซเชจเชฒเชฎเชพเช‚เชฅเซ€ เชนเซ‡เชกเชฐเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

#include <errno.h>
#include <linux/audit.h>
#include <linux/bpf.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <unistd.h>

เช† เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เช†เชชเชฃเซ‡ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช เช•เซ‡ เช•เชฐเซเชจเชฒ CONFIG_SECCOMP เช…เชจเซ‡ CONFIG_SECCOMP_FILTER เชธเชพเชฅเซ‡ y เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เช›เซ‡. เชตเชฐเซเช•เชฟเช‚เช— เชฎเชถเซ€เชจ เชชเชฐ เชคเชฎเซ‡ เช†เชจเซ‡ เช† เชฐเซ€เชคเซ‡ เชšเซ‡เช• เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

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

เชฌเชพเช•เซ€เชจเซ‹ เช•เซ‹เชก เชฌเซ‡ เชญเชพเช—เชจเซ‹ install_filter เชซเช‚เช•เซเชถเชจ เช›เซ‡. เชชเซเชฐเชฅเชฎ เชญเชพเช—เชฎเชพเช‚ BPF เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช— เชธเซ‚เชšเชจเชพเช“เชจเซ€ เช…เชฎเชพเชฐเซ€ เชธเซ‚เชšเชฟ เช›เซ‡:

static int install_filter(int nr, int arch, int error) {
  struct sock_filter filter[] = {
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, arch))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3),
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, nr))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),
  };

เชธเซ‚เชšเชจเชพเช“ linux/filter.h เชซเชพเช‡เชฒเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค BPF_STMT เช…เชจเซ‡ BPF_JUMP เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.
เชšเชพเชฒเซ‹ เชธเซ‚เชšเชจเชพเช“เชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชˆเช.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - BPF_LD เชถเชฌเซเชฆ BPF_W เชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชเช•เช เชพ เชฅเชพเชฏ เช›เซ‡, เชชเซ‡เช•เซ‡เชŸ เชกเซ‡เชŸเชพ เชจเชฟเชถเซเชšเชฟเชค เช‘เชซเชธเซ‡เชŸ BPF_ABS เชชเชฐ เชธเซเชฅเชฟเชค เช›เซ‡.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - BPF_JEQ เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡ เช•เซ‡ เชถเซเช‚ BPF_K เชธเช‚เชšเชฏเช• เชธเซเชฅเชฟเชฐเชพเช‚เช•เชฎเชพเช‚ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฎเซ‚เชฒเซเชฏ เช•เชฎเชพเชจเชจเซ€ เชฌเชฐเชพเชฌเชฐ เช›เซ‡. เชœเซ‹ เชเชฎ เชนเซ‹เชฏ เชคเซ‹, เช†เช—เชฒเซ€ เชธเซ‚เชšเชจเชพ เชชเชฐ เช“เชซเชธเซ‡เชŸ 0 เชชเชฐ เช•เซ‚เชฆเช•เซ‹ เชฒเช—เชพเชตเซ‹, เช…เชจเซเชฏเชฅเชพ เช•เชฎเชพเชจ เชฎเซ‡เชณ เช–เชพเชคเซ€ เชจ เชนเซ‹เชตเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชญเซ‚เชฒ เชซเซ‡เช‚เช•เชตเชพ เชฎเชพเชŸเซ‡ เช“เชซเชธเซ‡เชŸ 3 (เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚) เชชเชฐ เช•เซ‚เชฆเช•เซ‹.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - BPF_LD เชฎเชพเช‚เชฅเซ€ BPF_W เชถเชฌเซเชฆเชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชธเช‚เชšเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ BPF_ABS เชจเชพ เชจเชฟเชถเซเชšเชฟเชค เช‘เชซเชธเซ‡เชŸเชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชจเช‚เชฌเชฐ เช›เซ‡.

โ€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) โ€” เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชจเช‚เชฌเชฐเชจเซ‡ nr เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเชพ เชฎเซ‚เชฒเซเชฏ เชธเชพเชฅเซ‡ เชธเชฐเช–เชพเชตเซ‡ เช›เซ‡. เชœเซ‹ เชคเซ‡เช“ เชธเชฎเชพเชจ เชนเซ‹เชฏ, เชคเซ‹ เช†เช—เชณเชจเซ€ เชธเซ‚เชšเชจเชพ เชชเชฐ เช†เช—เชณ เชตเชงเซ‡ เช›เซ‡ เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซเชฏเชฅเชพ SECOMP_RET_ALLOW เชธเชพเชฅเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ERRNO | (เชญเซ‚เชฒ & SECCOMP_RET_DATA)) - BPF_RET เชธเชพเชฅเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เชญเซ‚เชฒ เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒเชจเชพ เชจเช‚เชฌเชฐ เชธเชพเชฅเซ‡ SECOMP_RET_ERRNO เชญเซ‚เชฒ เชชเซ‡เชฆเชพ เช•เชฐเซ‡ เช›เซ‡.

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ BPF_RET เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ SECCOMP_RET_ALLOW เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

SECOMP เช CBPF เช›เซ‡
เชคเชฎเซ‡ เชตเชฟเชšเชพเชฐเซ€ เชฐเชนเซเชฏเชพ เชนเชถเซ‹ เช•เซ‡ เชธเช‚เช•เชฒเชฟเชค ELF เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช…เชฅเชตเชพ JIT เชธเช‚เช•เชฒเชฟเชค C เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฌเชฆเชฒเซ‡ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชธเซ‚เชšเชฟ เชถเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡.

เช†เชจเชพ เชฌเซ‡ เช•เชพเชฐเชฃเซ‹ เช›เซ‡.

โ€ข เชธเซŒเชชเซเชฐเชฅเชฎ, Seccomp cBPF (เช•เซเชฒเชพเชธเชฟเช• BPF) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ eBPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡: เชคเซ‡เชฎเชพเช‚ เช•เซ‹เชˆ เชฐเชœเชฟเชธเซเชŸเชฐ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช›เซ‡เชฒเซเชฒเชพ เช—เชฃเชคเชฐเซ€เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชธเช‚เชšเชฏเช• เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡.

โ€ข เชฌเซ€เชœเซเช‚, Seccomp เชธเซ€เชงเชพ BPF เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชธเซเชตเซ€เช•เชพเชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆ เชจเชนเซ€เช‚. เช…เชฎเซ‡ เชœเซ‡ เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เช›เซ‡ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐ-เชซเซเชฐเซ‡เช‚เชกเชฒเซ€ เชฐเซ€เชคเซ‡ เช† เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.

เชœเซ‹ เชคเชฎเชจเซ‡ เช† เชเชธเซ‡เชฎเซเชฌเชฒเซ€เชจเซ‡ เชธเชฎเชœเชตเชพเชฎเชพเช‚ เชตเชงเซ เชฎเชฆเชฆเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชธเซเชฏเซเชกเซ‹เช•เซ‹เชกเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹ เชœเซ‡ เชธเชฎเชพเชจ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡:

if (arch != AUDIT_ARCH_X86_64) {
    return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
    return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;

เชธเซ‹เช•เซ‡เชŸ_เชซเชฟเชฒเซเชŸเชฐ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚ เชซเชฟเชฒเซเชŸเชฐ เช•เซ‹เชกเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ เช•เซ‹เชก เช…เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‡เชฒ เชฒเช‚เชฌเชพเชˆ เชงเชฐเชพเชตเชคเชพ เชธเซ‹เช•_เชเชซเชชเซเชฐเซ‹เช—เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชชเช›เซ€เชฅเซ€ เชšเชฒเชพเชตเชตเชพเชจเซ€ เช˜เซ‹เชทเชฃเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฆเชฒเซ€เชฒ เชคเชฐเซ€เช•เซ‡ เช† เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

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

install_filter เชซเช‚เช•เซเชถเชจเชฎเชพเช‚ เชฎเชพเชคเซเชฐ เชเช• เชœ เชตเชธเซเชคเซ เชฌเชพเช•เซ€ เช›เซ‡ - เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชœ เชฒเซ‹เชก เช•เชฐเซ‹! เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ prctl เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช, PR_SET_SECCOMP เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฎเซเชชเซเชฏเซเชŸเชฟเช‚เช— เชฎเซ‹เชกเชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเชพ เชตเชฟเช•เชฒเซเชช เชคเชฐเซ€เช•เซ‡ เชฒเชˆเช เช›เซ€เช. เชชเช›เซ€ เช…เชฎเซ‡ เชฎเซ‹เชกเชจเซ‡ SECOMP_MODE_FILTER เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชนเซ€เช เช›เซ€เช, เชœเซ‡ sock_fprog เชชเซเชฐเช•เชพเชฐเชจเชพ เชชเซเชฐเซ‹เช— เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒ เช›เซ‡:

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

เช›เซ‡เชฒเซเชฒเซ‡, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ install_filter เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เชชเชฐเช‚เชคเซ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เช…เชฎเชพเชฐเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฎเชพเชŸเซ‡ PR_SET_NO_NEW_PRIVS เชธเซ‡เชŸ เช•เชฐเชตเชพ prctl เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชเชตเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชŸเชพเชณเชตเซ€ เชœเซ‹เชˆเช เชœเซเชฏเชพเช‚ เชฌเชพเชณเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชคเซ‡เชฎเชจเชพ เชฎเชพเชคเชพเชชเชฟเชคเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡. เช† เชธเชพเชฅเซ‡, เช…เชฎเซ‡ เชฐเซ‚เชŸ เช…เชงเชฟเช•เชพเชฐเซ‹ เชตเชฟเชจเชพ install_filter เชซเช‚เช•เซเชถเชจเชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเชพ prctl เช•เซ‰เชฒเซเชธ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชนเชตเซ‡ เช†เชชเชฃเซ‡ install_filter เชซเช‚เช•เซเชถเชจเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช. เชšเชพเชฒเซ‹ X86-64 เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฅเซ€ เชธเช‚เชฌเช‚เชงเชฟเชค เชคเชฎเชพเชฎ เชฐเชพเชˆเชŸ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเซ‡ เชฌเซเชฒเซ‰เช• เช•เชฐเซ€เช เช…เชจเซ‡ เชซเช•เซเชค เชเช• เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ€เช เชœเซ‡ เชคเชฎเชพเชฎ เชชเซเชฐเชฏเชพเชธเซ‹เชจเซ‡ เช…เชตเชฐเซ‹เชงเซ‡ เช›เซ‡. เชซเชฟเชฒเซเชŸเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชชเซเชฐเชฅเชฎ เชฆเชฒเซ€เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเชฒ เชšเชพเชฒเซ เชฐเชพเช–เซ€เช เช›เซ€เช:

int main(int argc, char const *argv[]) {
  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
   perror("prctl(NO_NEW_PRIVS)");
   return 1;
  }
   install_filter(__NR_write, AUDIT_ARCH_X86_64, EPERM);
  return system(argv[1]);
 }

เชšเชพเชฒเซ‹, เชถเชฐเซ เช•เชฐเซ€เช. เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เช•เซเชฒเซ‡เช‚เช— เช…เชฅเชตเชพ 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 เช›เซ‡ เชœเซ‡ เชคเซ‡เชฎเชจเซ‡ เชฒเชพเช—เซ เช•เชฐเซ‡ เช›เซ‡.

เชซเชพเช‚เชธเซ‹ เชฎเชพเชŸเซ‡เชจเซ‹ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก เชซเชพเชˆเชฒเชฎเชพเช‚ เช•เชฐเซเชจเชฒ เชŸเซเชฐเซ€เชฎเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡ include/linux/security.h:

extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);

เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช•เชจเซ‡ เช…เชฎเชฒเชจเชพ เชตเชฟเชตเชฟเชง เชคเชฌเช•เซเช•เชพเชฎเชพเช‚ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡:

โ€” security_bpf โ€” เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชก BPF เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธเชจเซ€ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡;

- security_bpf_map - เชœเซเชฏเชพเชฐเซ‡ เช•เชฐเซเชจเชฒ เชจเช•เชถเชพ เชฎเชพเชŸเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡;

- security_bpf_prog - เชœเซเชฏเชพเชฐเซ‡ เช•เชฐเซเชจเชฒ eBPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡;

โ€” security_bpf_map_alloc โ€” BPF เชจเช•เชถเชพเชจเซ€ เช…เช‚เชฆเชฐ เชธเซเชฐเช•เซเชทเชพ เช•เซเชทเซ‡เชคเซเชฐ เช†เชฐเช‚เชญ เชฅเชฏเซ‡เชฒ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡;

- security_bpf_map_free - BPF เชจเช•เชถเชพเชจเซ€ เช…เช‚เชฆเชฐ เชธเซเชฐเช•เซเชทเชพ เช•เซเชทเซ‡เชคเซเชฐ เชธเชพเชซ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡;

โ€” security_bpf_prog_alloc โ€” BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ€ เช…เช‚เชฆเชฐ เชธเซเชฐเช•เซเชทเชพ เช•เซเชทเซ‡เชคเซเชฐ เช†เชฐเช‚เชญ เชฅเชฏเซ‡เชฒ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡;

- security_bpf_prog_free - BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ€ เช…เช‚เชฆเชฐ เชธเซเชฐเช•เซเชทเชพ เชซเซ€เชฒเซเชก เชธเชพเชซ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡.

เชนเชตเซ‡, เช† เชฌเชงเซเช‚ เชœเซ‹เชˆเชจเซ‡, เช…เชฎเซ‡ เชธเชฎเชœเซ€เช เช›เซ€เช: LSM BPF เช‡เชจเซเชŸเชฐเชธเซ‡เชชเซเชŸเชฐเซเชธ เชชเชพเช›เชณเชจเซ‹ เชตเชฟเชšเชพเชฐ เช เช›เซ‡ เช•เซ‡ เชคเซ‡เช“ เชฆเชฐเซ‡เช• eBPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชฐเช•เซเชทเชฃ เชชเซ‚เชฐเซเช‚ เชชเชพเชกเซ€ เชถเช•เซ‡ เช›เซ‡, เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ€เชจเซ‡ เช•เซ‡ เชฏเซ‹เช—เซเชฏ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เชพเชฐเซ‹ เชงเชฐเชพเชตเชคเชพ เชฒเซ‹เช•เซ‹ เชœ เช•เชพเชฐเซเชกเซเชธ เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชชเชฐ เช‘เชชเชฐเซ‡เชถเชจ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชธเชพเชฐเชพเช‚เชถ

เชธเซเชฐเช•เซเชทเชพ เชเชตเซ€ เช•เซ‹เชˆ เชตเชธเซเชคเซ เชจเชฅเซ€ เชœเซ‡ เชคเชฎเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹ เชคเซ‡ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เชเช•-เชธเชพเช‡เช-เชซเซ€เชŸ-เชฌเชงเซ€ เชฐเซ€เชคเซ‡ เช…เชฎเชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชตเชฟเชตเชฟเชง เชธเซเชคเชฐเซ‡ เช…เชจเซ‡ เชตเชฟเชตเชฟเชง เชฐเซ€เชคเซ‡ เชธเชฟเชธเซเชŸเชฎเซ‹เชจเซเช‚ เชฐเช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชฌเชจเชตเซเช‚ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡. เชฎเชพเชจเซ‹ เช•เซ‡ เชจเชพ เชฎเชพเชจเซ‹, เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชถเซเชฐเซ‡เชทเซเช  เชฐเซ€เชค เช เช›เซ‡ เช•เซ‡ เชตเชฟเชตเชฟเชง เชชเซ‹เชเชฟเชถเชจเซเชธเชฅเซ€ เช…เชฒเช—-เช…เชฒเช— เชธเซเชคเชฐเชจเชพ เชฐเช•เซเชทเชฃเชจเซเช‚ เช†เชฏเซ‹เชœเชจ เช•เชฐเชตเซเช‚, เชœเซ‡เชฅเซ€ เชเช• เชธเซเชคเชฐเชจเซ€ เชธเซเชฐเช•เซเชทเชพ เช˜เชŸเชพเชกเชตเซ€ เชธเชฎเช—เซเชฐ เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชคเซ€ เชจเชฅเซ€. เชฎเซเช–เซเชฏ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เช…เชฎเชจเซ‡ เชตเชฟเชตเชฟเชง เชธเซเชคเชฐเซ‹ เช…เชจเซ‡ เชŸเชšเชชเซ‹เช‡เชจเซเชŸเซเชธเชจเซ‹ เชธเชฎเซ‚เชน เช†เชชเชตเชพเชจเซเช‚ เช‰เชคเซเชคเชฎ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เช…เชฎเซ‡ เช†เชถเชพ เชฐเชพเช–เซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เชธเซเชคเชฐเซ‹ เชถเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹ เชคเซ‡เชจเซ€ เชธเชพเชฐเซ€ เชธเชฎเชœ เช†เชชเซ€ เช›เซ‡.

เชฒเซ‡เช–เช•เซ‹ เชตเชฟเชถเซ‡

เชกเซ‡เชตเชฟเชก เช•เชพเชฒเชตเซ‡เชฐเชพ Netlify เช–เชพเชคเซ‡ CTO เช›เซ‡. เชคเซ‡เชฎเชฃเซ‡ เชกเซ‹เช•เชฐ เชธเชชเซ‹เชฐเซเชŸเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เช…เชจเซ‡ Runc, Go เช…เชจเซ‡ BCC เชŸเซ‚เชฒเซเชธ เชคเซ‡เชฎเชœ เช…เชจเซเชฏ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชจเชพ เชตเชฟเช•เชพเชธเชฎเชพเช‚ เชฏเซ‹เช—เชฆเชพเชจ เช†เชชเซเชฏเซเช‚. เชกเซ‹เช•เชฐ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เชชเซเชฒเช—เช‡เชจ เช‡เช•เซ‹เชธเชฟเชธเซเชŸเชฎเชจเชพ เชตเชฟเช•เชพเชธ เชชเชฐเชจเชพ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชœเชพเชฃเซ€เชคเชพ เช›เซ‡. เชกเซ‡เชตเชฟเชก เชซเซเชฒเซ‡เชฎ เช—เซเชฐเชพเชซ เชตเชฟเชถเซ‡ เช–เซ‚เชฌ เชœ เชœเซเชธเซเชธเชพเชฆเชพเชฐ เช›เซ‡ เช…เชจเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡.

เชฒเซ‹เชฐเซ‡เชจเซเชเซ‹ เชซเซ‹เชจเซเชŸเชพเชจเชพ Sysdig เช–เชพเชคเซ‡ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชŸเซ€เชฎ เชชเชฐ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชœเซเชฏเชพเช‚ เชคเซ‡เช“ เชฎเซเช–เซเชฏเชคเซเชตเซ‡ Falco เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เชเช• เช•เซเชฒเชพเช‰เชก เชจเซ‡เชŸเชฟเชต เช•เชฎเซเชชเซเชฏเซเชŸเชฟเช‚เช— เชซเชพเช‰เชจเซเชกเซ‡เชถเชจ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช›เซ‡ เชœเซ‡ เช•เชฐเซเชจเชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เช…เชจเซ‡ eBPF เชฆเซเชตเชพเชฐเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เชฐเชจเชŸเชพเช‡เชฎ เชธเซเชฐเช•เซเชทเชพ เช…เชจเซ‡ เชตเชฟเชธเช‚เช—เชคเชคเชพ เชถเซ‹เชง เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. เชคเซ‡ เชกเชฟเชธเซเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸเซ‡เชก เชธเชฟเชธเซเชŸเชฎเซเชธ, เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชกเชฟเชซเชพเชˆเชจเซเชก เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช—, เชฒเชฟเชจเช•เซเชธ เช•เชฐเซเชจเชฒ เช…เชจเซ‡ เชชเชฐเชซเซ‹เชฐเซเชฎเชจเซเชธ เชเชจเชพเชฒเชฟเชธเชฟเชธ เชตเชฟเชถเซ‡ เช‰เชคเซเชธเชพเชนเซ€ เช›เซ‡.

ยป เชชเซเชธเซเชคเช• เชตเชฟเชถเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เชฎเชพเชŸเซ‡, เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‹ เชชเซเชฐเช•เชพเชถเช•เชจเซ€ เชตเซ‡เชฌเชธเชพเช‡เชŸ
ยป เชธเชฎเชพเชตเชฟเชทเซเชŸเซ‹เชจเซเช‚ เช•เซ‹เชทเซเชŸเช•
ยป เช…เชตเชคเชฐเชฃ

Khabrozhiteli เชฎเชพเชŸเซ‡ เช•เซ‚เชชเชจ เชชเชฐ 25% เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ - Linux

เชชเซเชธเซเชคเช•เชจเชพ เชชเซ‡เชชเชฐ เชตเชฐเซเชเชจเชจเซ€ เชšเซ‚เช•เชตเชฃเซ€ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชˆ-เชฎเซ‡เชฒ เชชเชฐ เชˆ-เชฌเซเช• เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹