เดชเตเดธเตเดคเด•เด‚ "เดฒเดฟเดจเด•เตเดธเต เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเดฟเด™เตเด™เดฟเดจเตเดณเตเดณ BPF"

เดชเตเดธเตเดคเด•เด‚ "เดฒเดฟเดจเด•เตเดธเต เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเดฟเด™เตเด™เดฟเดจเตเดณเตเดณ BPF"เดนเดฒเต‹, เด–เดฌเตเดฐเต‹ เดจเดฟเดตเดพเดธเดฟเด•เตพ! เดฒเดฟเดจเด•เตเดธเต เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดงเดพเดจเดชเตเดชเต†เดŸเตเดŸ เด˜เดŸเด•เด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเดพเดฃเต เดฌเดฟเดชเดฟเดŽเดซเต เดตเดฟเตผเดšเตเดšเตเดตเตฝ เดฎเต†เดทเต€เตป. เด…เดคเดฟเดจเตเดฑเต† เดถเดฐเดฟเดฏเดพเดฏ เด‰เดชเดฏเต‹เด—เด‚ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดŽเดžเตเดšเดฟเดจเต€เดฏเตผเดฎเดพเตผเด•เตเด•เต เดคเด•เดฐเดพเดฑเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเตเด‚ เดเดฑเตเดฑเดตเตเด‚ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดชเต‹เดฒเตเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด‚. เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดธเตเดตเดญเดพเดตเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเตเด‚ เด•เต‡เตผเดฃเดฒเดฟเดฒเต† เด‡เดตเดจเตเดฑเตเด•เตพ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เต‹เดกเต เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เดŽเด™เตเด™เดจเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เดฎเดฑเตเดฑเตเด‚ เดจเดฟเด™เตเด™เตพ เดชเด เดฟเด•เตเด•เตเด‚. เดกเต‡เดตเดฟเดกเต เด•เดฒเดตเต‡เดฐเดฏเตเด‚ เดฒเต‹เดฑเต†เตปเดธเต‹ เดซเต‹เดฃเตเดŸเดพเดจเดฏเตเด‚ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดชเดตเตผ เด…เตบเดฒเต‹เด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚. เดชเตเดฐเด•เดŸเดจ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต‡เดทเตป, เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เต, เดธเตเดฐเด•เตเดท เดŽเดจเตเดจเดฟเดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดฑเดฟเดตเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเด•. - Linux เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดธเตเดตเดญเดพเดตเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ BPF เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•. - เด•เต‡เตผเดฃเตฝ เดตเต€เดฃเตเดŸเตเด‚ เด•เดฎเตเดชเตˆเตฝ เดšเต†เดฏเตเดฏเดพเดคเต†เดฏเตเด‚ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดฑเต€เดฌเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดคเต†เดฏเตเด‚ เด•เต‡เตผเดฃเตฝ เด‡เดตเดจเตเดฑเตเด•เตพ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เด•เต‹เดกเต เด•เตเดคเตเดคเดฟเดตเดฏเตเด•เตเด•เตเด•. - เดธเดฟ, เด—เต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตˆเดคเตเดคเดฃเดฟเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏ เด•เต‹เดกเต เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•. - BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเตˆเดซเต เดธเตˆเด•เตเด•เดฟเตพ เดธเตเดตเดจเตเดคเดฎเดพเด•เตเด•เดฟ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เดเดฑเตเดฑเต†เดŸเตเด•เตเด•เตเด•.

Linux เด•เต‡เตผเดฃเตฝ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ, เด…เดคเดฟเดจเตเดฑเต† เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ, Seccomp

เดธเตเดฅเดฟเดฐเดคเดฏเต‹ เดธเตเดฐเด•เตเดทเดฏเต‹ เดตเต‡เด—เดคเดฏเต‹ เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดคเต† เด•เต‡เตผเดฃเตฝ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดถเด•เตเดคเดฎเดพเดฏ เดฎเดพเตผเด—เด‚ BPF เดจเตฝเด•เตเดจเตเดจเต. เด‡เด•เตเด•เดพเดฐเดฃเดคเตเดคเดพเตฝ, Seccomp BPF เดŽเดจเตเดจเตเด‚ เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจ Seccomp เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, Seccomp-เตฝ เดชเตเดฐเต‹เดธเดธเต เดเดธเตŠเดฒเต‡เดทเตป เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เด…เดคเดฟเดจเตเดฑเต† เดฌเดนเตเดฎเตเด–เดค เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดจเดฒเตเดฒเดคเดพเดฃเต†เดจเตเดจเต เด•เต‡เตผเดฃเตฝ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผ เด•เดฐเตเดคเดฟ. เดˆ เด…เดงเตเดฏเดพเดฏเดคเตเดคเดฟเตฝ Seccomp เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเตเด‚ เด…เดคเต เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เดžเด™เตเด™เตพ เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เตเด‚. เดคเตเดŸเตผเดจเตเดจเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Seccomp เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เดชเด เดฟเด•เตเด•เตเด‚. เด…เดคเดฟเดจเตเดถเต‡เดทเด‚, Linux เดธเตเดฐเด•เตเดทเดพ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพเด•เตเด•เตเดณเตเดณ เด•เต‡เตผเดฃเดฒเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป BPF เดนเตเด•เตเด•เตเด•เตพ เดžเด™เตเด™เตพ เดจเต‹เด•เตเด•เดพเด‚.

เดฒเดฟเดจเด•เตเดธเต เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ (LSM) เดตเดฟเดตเดฟเดง เดธเตเดฐเด•เตเดทเดพ เดฎเต‹เดกเดฒเตเด•เตพ เด’เดฐเต เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดฐเต€เดคเดฟเดฏเดฟเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดตเตเดจเตเดจ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดซเด‚เด—เตเดทเดจเตเด•เตพ เดจเตฝเด•เตเดจเตเดจ เด’เดฐเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดพเดฃเต. Apparmor, SELinux, Tomoyo เดคเตเดŸเด™เตเด™เดฟเดฏ เด•เต‡เตผเดฃเตฝ เดธเต‹เดดเตโ€Œเดธเต เดŸเตเดฐเต€เดฏเดฟเตฝ LSM เดจเต‡เดฐเดฟเดŸเตเดŸเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดฒเดฟเดจเด•เตเดธเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเตเด•เตพ เดšเตผเดšเตเดš เดšเต†เดฏเตเดคเตเด•เตŠเดฃเตเดŸเต เดจเดฎเตเด•เตเด•เต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚.

เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ

เดฒเดฟเดจเด•เตเดธเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเตเด•เดณเตเดŸเต† เดธเดพเดฐเดพเด‚เดถเด‚, เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดšเตเดฎเดคเดฒ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพ เด’เดฐเต เด…เดจเดญเดฟเดฒเดทเดฃเต€เดฏเดฎเดพเดฏ เดชเตเดฐเต‹เดธเดธเตเดธเต เด…เดจเตเดฎเดคเดฟ เดจเตฝเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เด† เด†เดตเดถเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ suid เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเต†, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเดฎเตเดณเตเดณเดคเดพเด•เตเด•เตเด•, เด†เด•เตเดฐเดฎเดฃ เดธเดพเดงเตเดฏเดค เด•เตเดฑเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเดฟเดฒ เดœเต‹เดฒเดฟเด•เตพ เดšเต†เดฏเตเดฏเดพเตป เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดคเดพเดฃเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเต‹เตผเดŸเตเดŸเต เดคเตเดฑเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดชเตเดฐเต‹เดธเดธเตเดธเต เดฑเต‚เดŸเตเดŸเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเด•เดฐเด‚ 80 เดŽเดจเตเดจเต เดชเดฑเดฏเตเด•, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดคเดฟเดจเต CAP_NET_BIND_SERVICE เด•เดดเดฟเดตเต เดจเตฝเด•เดพเด‚.

main.go เดŽเดจเตเดจเต เดชเต‡เดฐเดฟเดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต Go เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด•:

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

เดˆ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเต‹เตผเดŸเตเดŸเต 80-เตฝ เด’เดฐเต HTTP เดธเต†เตผเดตเตผ เดจเตฝเด•เตเดจเตเดจเต (เด‡เดคเตŠเดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเต‹เตผเดŸเตเดŸเต เด†เดฃเต). เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดžเด™เตเด™เตพ เด‡เดคเต เดธเดฎเดพเดนเดฐเดฟเดšเตเดš เด‰เดŸเตป เดคเดจเตเดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต:

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

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดžเด™เตเด™เตพ เดฑเต‚เดŸเตเดŸเต เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เด…เดจเตเดตเดฆเดฟเด•เตเด•เดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เดชเต‹เตผเดŸเตเดŸเต เดฌเตˆเตปเดกเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดˆ เด•เต‹เดกเต เด’เดฐเต เดชเดฟเดถเด•เต เดตเดฐเตเดคเตเดคเตเด‚:

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

เด•เตเดฏเดพเดชเตเดทเต (เดทเต†เตฝ เดฎเดพเดจเต‡เดœเตผ) เดŽเดจเตเดจเดคเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด•เดดเดฟเดตเตเด•เดณเตเดณเตเดณ เด’เดฐเต เดทเต†เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต.

เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด‡เดคเดฟเดจเด•เด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดฑเต‚เดŸเตเดŸเต เด…เดตเด•เดพเดถเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เด‰เดณเตเดณ เดŽเดฒเตเดฒเดพเดฑเตเดฑเดฟเดจเตเด‚ เด’เดชเตเดชเด‚ 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 - เด’เดฐเต เดทเต†เดฒเตเดฒเดพเดฏเดฟ เด•เตเดฏเดพเดชเตเดทเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.
  • โ€”caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดฎเดพเดฑเตเดฑเต‡เดฃเตเดŸเดคเดฟเดจเดพเตฝ (เดฑเต‚เดŸเตเดŸเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ), cap_net_bind_service เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดเดกเดฟ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฎเดพเดฑเตเดฑเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเตเด‚ เดžเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเด‚. เด†เดฐเตเดฎเดฟเดฒเตเดฒ, เด…เดคเดพเดฏเดคเต cap_setuid, cap_setgid.
  • โ€”keep=1 โ€” เดฑเต‚เดŸเตเดŸเต เด…เด•เตเด•เตŒเดฃเตเดŸเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดฑเตเดฎเตเดชเต‹เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค เด•เดดเดฟเดตเตเด•เตพ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต.
  • โ€”เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต=โ€œเด†เดฐเตเด‚โ€ โ€” เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เด…เดจเตเดคเดฟเดฎ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เด†เดฐเตเด‚ เด†เดฏเดฟเดฐเดฟเด•เตเด•เดฟเดฒเตเดฒ.
  • โ€”addamb=cap_net_bind_service โ€” เดฑเต‚เดŸเตเดŸเต เดฎเต‹เดกเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดฑเดฟเดฏเดคเดฟเดจเต เดถเต‡เดทเด‚ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เด•เดดเดฟเดตเตเด•เดณเตเดŸเต† เด•เตเดฒเดฟเดฏเดฑเดฟเด‚เด—เต เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•.
  • - -c "./capabilities" - เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•.

เดจเดฟเดฒเดตเดฟเดฒเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ execve() เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดšเตˆเตฝเดกเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดฎเดพเดฏเดฟ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด•เดดเดฟเดตเตเด•เดณเดพเดฃเต เดฒเดฟเด™เตเด•เตเดกเต เด•เดดเดฟเดตเตเด•เตพ. เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸ เด•เดดเดฟเดตเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเตŠเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดžเตเดžเดพเตฝ, เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เด•เดดเดฟเดตเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดฎเดพเดฏเดฟ เดฒเดญเดฟเด•เตเด•เต‚.

--caps เด“เดชเตเดทเดจเดฟเตฝ เด•เดดเดฟเดตเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดคเดฟเดจเต เดถเต‡เดทเด‚ +eip เดŽเดจเตเดคเดพเดฃเต เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดจเต เดจเดฟเด™เตเด™เตพ เดšเดฟเดจเตเดคเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚. เดถเต‡เดทเดฟ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เดพเตป เดˆ เดชเดคเดพเด•เด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต:

-เด†เด•เตเดŸเดฟเดตเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดฃเด‚ (p);

-เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเต เดฒเดญเตเดฏเดฎเดพเดฃเต (เด‡);

- เดถเดฟเดถเต เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ (i) เดตเดดเดฟ เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดฎเดพเดฏเดฟ เดฒเดญเดฟเด•เตเด•เตเด‚.

เดจเดฎเตเด•เตเด•เต cap_net_bind_service เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเดฟเดจเดพเตฝ, e เดซเตเดฒเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‡เดคเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เด•เดฎเดพเตปเดกเดฟเตฝ เดทเต†เตฝ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด‚. เด‡เดคเต เด•เดดเดฟเดตเตเด•เตพ เดฌเตˆเดจเดฑเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚, เดžเด™เตเด™เตพ เด…เดคเต i เดซเตเดฒเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, p เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดซเต€เดšเตเดšเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต (เดฏเตเดเดกเดฟ เดฎเดพเดฑเตเดฑเดพเดคเต† เดžเด™เตเด™เตพ เด‡เดคเต เดšเต†เดฏเตเดคเต). เด‡เดคเต cap_net_bind_service+eip เดชเต‹เดฒเต† เดคเต‹เดจเตเดจเตเดจเตเดจเต.

ss เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดซเดฒเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚. เดชเต‡เดœเดฟเตฝ เด’เดคเตเด™เตเด™เดพเตป เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเต เด•เตเดฑเดšเตเดšเต เดšเต†เดฑเตเดคเดพเด•เตเด•เดพเด‚, เดŽเดจเตเดจเดพเตฝ เด‡เดคเต 0 เด…เดฒเตเดฒเดพเดคเตเดค เด…เดจเตเดฌเดจเตเดง เดชเต‹เตผเดŸเตเดŸเตเด‚ เดฏเต‚เดธเตผ เดเดกเดฟเดฏเตเด‚ เด•เดพเดฃเดฟเด•เตเด•เตเด‚, เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ 65:

# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0

เดˆ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด•เตเดฏเดพเดชเตเดทเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดŽเดจเตเดจเดพเตฝ เดฒเดฟเดฌเตเด•เดพเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดทเต†เตฝ เดŽเดดเตเดคเดพเด‚. เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต, man 3 libcap เด•เดพเดฃเตเด•.

เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเตเดฎเตเดชเต‹เตพ, เดฑเตบ เดŸเตˆเดฎเดฟเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเตเด‚ เดกเต†เดตเดฒเดชเตเดชเตผเด•เตเด•เต เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เด…เดฑเดฟเดฏเดฟเดฒเตเดฒ; เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ เดˆ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เดฎเดพเดฑเดฟเดฏเต‡เด•เตเด•เดพเด‚.

เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเตเด•เตพ เดจเดจเตเดจเดพเดฏเดฟ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป, เดจเดฎเตเด•เตเด•เต BCC เดถเต‡เดทเดฟเดฏเตเดณเตเดณ เดŸเต‚เตพ เดŽเดŸเตเด•เตเด•เดพเด‚, เด…เดคเต cap_capable เด•เต‡เตผเดฃเตฝ เดซเด‚เด—เตโ€Œเดทเดจเตเดตเต‡เดฃเตเดŸเดฟ kprobe เดธเดœเตเดœเดฎเดพเด•เตเด•เตเดจเตเดจเต:

/usr/share/bcc/tools/capable
TIME      UID  PID   TID   COMM               CAP    NAME           AUDIT
10:12:53 0 424     424     systemd-udevd 12 CAP_NET_ADMIN         1
10:12:57 0 1103   1101   timesync        25 CAP_SYS_TIME         1
10:12:57 0 19545 19545 capabilities       10 CAP_NET_BIND_SERVICE 1

cap_capable เด•เต‡เตผเดฃเตฝ เดซเด‚เด—เตโ€Œเดทเดจเดฟเตฝ เด’เดฐเต เดตเตบ-เดฒเตˆเดจเตผ kprobe เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต bpftrace เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เด‡เดคเต‡ เด•เดพเดฐเตเดฏเด‚ เดจเต‡เดŸเดพเดจเดพเด•เตเด‚:

bpftrace -e 
   'kprobe:cap_capable {
      time("%H:%M:%S ");
      printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
    }' 
    | grep -i capabilities

kprobe-เดจเต เดถเต‡เดทเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฟเดฏเดพเตฝ เด‡เดคเต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดคเตเดชเต‹เดฒเตเดณเตเดณ เด’เดจเตเดจเต เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด‚:

12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 10 1

เด…เดžเตเดšเดพเดฎเดคเตเดคเต† เด•เต‹เดณเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด•เดดเดฟเดตเตเด•เดณเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เดˆ เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเตฝ เดจเต‹เตบ-เด“เดกเดฟเดฑเตเดฑเต เด‡เดตเดจเตเดฑเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด“เดกเดฟเดฑเตเดฑเต เดซเตเดฒเดพเด—เต (เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเตฝ เด…เดตเดธเดพเดจเดคเตเดคเต‡เดคเต) 1 เด†เดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เด“เดกเดฟเดฑเตเดฑเต เด‡เดคเดฐ เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตเด‚ เด…เดตเดธเดพเดจเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดถเต‡เดทเดฟเดฏเตเด‚ เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต. เดžเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณ เด’เดจเตเดจเต CAP_NET_BIND_SERVICE เด†เดฃเต, เด‡เดคเต เดซเดฏเดฒเดฟเดฒเต† เด•เต‡เตผเดฃเตฝ เดธเต‹เดดเตโ€Œเดธเต เด•เต‹เดกเดฟเดฒเต† เดธเตเดฅเดฟเดฐเดพเด™เตเด•เดฎเดพเดฏเดฟ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต, เดเดกเดจเตเดฑเดฟเดซเดฏเตผ 10-เดจเตŠเดชเตเดชเด‚/uapi/linux/ability.h:

/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */
#define CAP_NET_BIND_SERVICE 10<source lang="go">

เดฑเตบเดธเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดกเต‹เด•เตเด•เตผ เดชเต‹เดฒเตเดณเตเดณ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพเด•เตเด•เต เด…เดจเตผเดนเดฎเดพเดฏ เดฎเต‹เดกเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฑเตบเดŸเตˆเดฎเดฟเตฝ เด•เดดเดฟเดตเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดพเดฑเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เดฎเดฟเด•เตเด• เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด•เดดเดฟเดตเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดตเดฏเตเด•เตเด•เต เด…เดจเตเดตเดฆเดฟเด•เตเด•เต‚. เด’เดฐเต เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เดšเดฟเดฒ เด•เดดเดฟเดตเตเด•เตพ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเดฎเตเดชเต‹เตพ, เดกเต‹เด•เตเด•เดฑเดฟเดจเต เด…เดต --cap-add เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเตฝเด•เดพเตป เด•เดดเดฟเดฏเตเด‚:

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

เดˆ เด•เดฎเดพเตปเดกเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเต CAP_NET_ADMIN เด•เดดเดฟเดตเต เดจเตฝเด•เตเด‚, เดกเดฎเตเดฎเดฟ0 เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดฒเดฟเด™เตเด•เต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเตป เด…เดคเดฟเดจเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเด‚เด—เต เดชเต‹เดฒเตเดณเตเดณ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เด…เดŸเตเดคเตเดค เดตเดฟเดญเดพเด—เด‚ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดพเดฑเตเดฑเดฟเด•เต เด†เดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เดฎเดฑเตเดฑเตŠเดฐเต เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดค เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เดธเต†เด•เตเด•เต‹เดฎเตเดชเต

Seccomp เดŽเดจเตเดจเดคเต เดธเต†เด•เตเดฏเตเตผ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฟเด‚เด—เดฟเดจเต† เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดฒเดฟเดจเด•เตเดธเต เด•เต‡เตผเดฃเดฒเดฟเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟเดฏ เด’เดฐเต เดธเตเดฐเด•เตเดทเดพ เดชเดพเดณเดฟเดฏเดพเดฃเต, เด‡เดคเต เดšเดฟเดฒ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด•เตพ เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตเดฏเดพเตป เดกเดตเดฒเดชเตเดชเตผเดฎเดพเดฐเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. Seccomp-เดจเต† เดฒเดฟเดจเด•เตเดธเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดฎเต†เด™เตเด•เดฟเดฒเตเด‚, เดšเดฟเดฒ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด…เดคเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเต เด…เดตเดฏเต† เด…เดชเต‡เด•เตเดทเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดตเดดเด•เตเด•เดฎเตเดณเตเดณเดคเดพเด•เตเด•เตเดจเตเดจเต.

Seccomp, Linux เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เดชเดฐเดธเตเดชเดฐเดตเดฟเดฐเตเดฆเตเดงเดฎเดฒเตเดฒ, เดฐเดฃเตเดŸเต เดธเดฎเต€เดชเดจเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เดชเตเดฐเดฏเต‹เดœเดจเด‚ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เด’เดฐเตเดฎเดฟเดšเตเดšเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฑเตเดฃเตเดŸเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเต‹เดธเดธเตเดธเดฟเดจเต CAP_NET_ADMIN เด•เดดเดฟเดตเต เดจเตฝเด•เดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚, เดŽเดจเตเดจเดพเตฝ เดธเต‹เด•เตเด•เดฑเตเดฑเต เด•เดฃเด•เตเดทเดจเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เดฟเดฒเตเดฒ, เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•, เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•4 เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด•เตพ เดคเดŸเดฏเตเด•.

SECCOMP_MODE_FILTER เดฎเต‹เดกเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ BPF เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดคเดพเดฃเต Seccomp เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเด‚เด—เต เดฐเต€เดคเดฟ, เด•เต‚เดŸเดพเดคเต† เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเตเดŸเต† เด…เดคเต‡ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเด‚เด—เต เดจเดŸเดคเตเดคเตเดจเตเดจเต.

PR_SET_SECCOMP เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดฒเต‚เดŸเต† prctl เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Seccomp เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดˆ เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ seccomp_data เด˜เดŸเดจ เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด“เดฐเต‹ Seccomp เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเด‚ เด’เดฐเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดฐเต‚เดชเดฎเดพเดฃเต เดŽเดŸเตเด•เตเด•เตเดจเตเดจเดคเต. เดˆ เด˜เดŸเดจเดฏเดฟเตฝ เดฑเดซเดฑเตปเดธเต เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ, เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเดจเตเดฑเต† เดธเดฎเดฏเดคเตเดคเต เดชเตเดฐเต‹เดธเดธเตผ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ, uint64 เด†เดฏเดฟ เดชเตเดฐเด•เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดชเดฐเดฎเดพเดตเดงเดฟ เด†เดฑเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

linux/seccomp.h เดซเดฏเดฒเดฟเดฒเต† เด•เต‡เตผเดฃเตฝ เดธเต‹เดดเตเดธเต เด•เต‹เดกเดฟเตฝ เดจเดฟเดจเตเดจเต seccomp_data เด˜เดŸเดจ เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต:

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

เดˆ เด˜เดŸเดจเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดจเดฎเตเด•เตเด•เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ, เด…เดคเดฟเดจเตเดฑเต† เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฐเดฃเตเดŸเตเด‚ เด•เต‚เดŸเดฟเดšเตเดšเต‡เตผเดจเตเดจเต เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตเดฏเดพเด‚.

เด“เดฐเต‹ Seccomp เดชเดพเด•เตเด•เดฑเตเดฑเตเด‚ เดฒเดญเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚, เด…เดจเตเดคเดฟเดฎ เดคเต€เดฐเตเดฎเดพเดจเด‚ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเต เด•เต‡เตผเดฃเดฒเดฟเดจเต‹เดŸเต เดชเดฑเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดซเดฟเตฝเดŸเตเดŸเตผ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดจเดŸเดคเตเดคเดฃเด‚. เด…เดจเตเดคเดฟเดฎ เดคเต€เดฐเตเดฎเดพเดจเด‚ เดฑเดฟเดŸเตเดŸเต‡เตบ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเต (เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดธเต เด•เต‹เดกเตเด•เตพ) เดชเตเดฐเด•เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

- SECCOMP_RET_KILL_PROCESS - เด‡เด•เตเด•เดพเดฐเดฃเดคเตเดคเดพเตฝ เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดคเตเดค เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตโ€Œเดค เด‰เดŸเตป เดคเดจเตเดจเต† เดฎเตเดดเตเดตเตป เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต.

- SECCOMP_RET_KILL_THREAD - เด‡เด•เตเด•เดพเดฐเดฃเดคเตเดคเดพเตฝ เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดคเตเดค เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตโ€Œเดค เด‰เดŸเตป เดจเดฟเดฒเดตเดฟเดฒเต† เดคเตเดฐเต†เดกเต เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

โ€” SECCOMP_RET_KILL โ€” SECCOMP_RET_KILL_THREAD เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด…เดชเดฐเดจเดพเดฎเด‚, เดชเดฟเดจเตเดจเต‹เด•เตเด• เด…เดจเตเดฏเต‹เดœเตเดฏเดคเดฏเตเด•เตเด•เดพเดฏเดฟ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเต.

- SECCOMP_RET_TRAP - เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดจเดฟเดฐเต‹เดงเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† SIGSYS (เดฎเต‹เดถเด‚ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ) เดธเดฟเด—เตเดจเตฝ เด…เดคเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจ เดŸเดพเดธเตเด•เตเด•เดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต.

- SECCOMP_RET_ERRNO - เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† SECCOMP_RET_DATA เดซเดฟเตฝเดŸเตเดŸเตผ เดฑเดฟเดŸเตเดŸเต‡เตบ เดฎเต‚เดฒเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เด‚ เดคเต†เดฑเตเดฑเดพเดฏ เดฎเต‚เดฒเตเดฏเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต. เดชเดฟเดถเด•เดฟเดจเตเดฑเต† เด•เดพเดฐเดฃเดคเตเดคเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต, เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดฟเดถเด•เต เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเต. เดชเดฟเดถเด•เต เดจเดฎเตเดชเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด…เดŸเตเดคเตเดค เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

- SECCOMP_RET_TRACE - PTRACE_O_TRACESECCOMP เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต ptrace Tracer-เดจเต† เด…เดฑเดฟเดฏเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต - เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เด† เดชเตเดฐเด•เตเดฐเดฟเดฏ เด•เดพเดฃเดพเดจเตเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเดจเตเด‚. เด’เดฐเต เดŸเตเดฐเต†เดฏเตโ€Œเดธเตผ เด•เดฃเด•เตโ€Œเดฑเตเดฑเต เดšเต†เดฏเตโ€ŒเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด’เดฐเต เดชเดฟเดถเด•เต เดคเดฟเดฐเดฟเด•เต† เดฒเดญเดฟเด•เตเด•เตเด‚, เดชเดฟเดถเด•เต -ENOSYS เด†เดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ.

- SECCOMP_RET_LOG - เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเต เดฒเต‹เด—เต เดšเต†เดฏเตเดคเต.

- SECCOMP_RET_ALLOW - เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด…เดจเตเดตเดฆเดจเต€เดฏเดฎเดพเดฃเต.

เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเดŸเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเดจเตเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเดจเตเดฎเตเดณเตเดณ เด•เดดเดฟเดตเตเดณเตเดณ เดŸเตเดฐเต‡เดธเดฟ เดŽเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เดŸเตเดฐเต†เดฏเตโ€Œเดธเดฟเด‚เด—เต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดพเดฃเต ptrace. เดŸเตเดฐเต†เดฏเตโ€Œเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดทเดจเต† เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดธเตเดตเดพเดงเต€เดจเดฟเด•เตเด•เดพเดจเตเด‚ เดŸเตเดฐเต‡เดธเดฟเดฏเตเดŸเต† เดฎเต†เดฎเตเดฎเดฑเดฟ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เตพ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. Seccomp เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเตฝ, SECCOMP_RET_TRACE เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดธเต เด•เต‹เดกเต เดŸเตเดฐเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ ptrace เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เดŸเตเดฐเต‡เดธเดฑเดฟเดจเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดŸเดฏเดพเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต‡เดคเดพเดฏ เดฒเต‹เดœเดฟเด•เต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

Seccomp เดชเดฟเดถเด•เตเด•เตพ

เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ, Seccomp-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดตเดฟเดง เดชเดฟเดถเด•เตเด•เตพ เดจเต‡เดฐเดฟเดŸเต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚, เด…เดคเต SECCOMP_RET_ERRNO เดŽเดจเตเดจ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฑเดฟเดŸเตเดŸเต‡เตบ เดฎเต‚เดฒเตเดฏเดคเตเดคเดพเตฝ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดชเตเดชเต†เดŸเตเด‚. เด’เดฐเต เดชเดฟเดถเด•เต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเดšเต†เดฏเตเดฏเดพเตป, seccomp เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ 1-เดจเต เดชเด•เดฐเด‚ -0 เดจเตฝเด•เตเด‚.

เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเดฟเดถเด•เตเด•เตพ เดธเดพเดงเตเดฏเดฎเดพเดฃเต:

- ACCESS - เด•เต‹เดณเตผ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดšเต†เดฏเตเดฏเดพเตป เด…เดจเตเดตเดพเดฆเดฎเดฟเดฒเตเดฒ. เด‡เดคเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต เด‡เดคเดฟเดจเต CAP_SYS_ADMIN เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เด‡เดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเดฒเต‹ prctl เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต no_new_privs เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดคเตเดคเดคเดฟเดจเดพเดฒเต‹ เด†เดฃเต (เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดชเดฟเดจเตเดจเต€เดŸเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเด‚);

โ€” EFAULT โ€” เดชเดพเดธเดพเดฏ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพเด•เตเด•เต (seccomp_data เด˜เดŸเดจเดฏเดฟเดฒเต† args) เดธเดพเดงเตเดตเดพเดฏ เด’เดฐเต เดตเดฟเดฒเดพเดธเด‚ เด‡เดฒเตเดฒ;

- EINVAL - เด‡เดตเดฟเดŸเต† เดจเดพเดฒเต เด•เดพเดฐเดฃเด™เตเด™เดณเตเดฃเตเดŸเดพเด•เดพเด‚:

-เด…เดญเตเดฏเตผเดคเตเดฅเดฟเดšเตเดš เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด…เดœเตเดžเดพเดคเดฎเดพเดฃเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดฟเดฒเดตเดฟเดฒเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเดฟเตฝ เด•เต‡เตผเดฃเตฝ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ;

เด…เดญเตเดฏเตผเดคเตเดฅเดฟเดšเตเดš เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดซเตเดฒเดพเด—เตเด•เตพ เดธเดพเดงเตเดคเดฏเตเดณเตเดณเดคเดฒเตเดฒ;

-เด“เดชเตเดชเดฑเต‡เดทเดจเดฟเตฝ BPF_ABS เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเดฟเตฝ เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเตเดฃเตเดŸเต, เด…เดคเต seccomp_data เด˜เดŸเดจเดฏเตเดŸเต† เดตเดฒเตเดชเตเดชเด‚ เด•เดตเดฟเดžเตเดžเต‡เด•เตเด•เดพเด‚;

-เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดšเตเดš เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดชเดฐเดฎเดพเดตเดงเดฟ เด•เดตเดฟเดฏเตเดจเตเดจเต;

- ENOMEM - เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เดฎเดคเดฟเดฏเดพเดฏ เดฎเต†เดฎเตเดฎเดฑเดฟ เด‡เดฒเตเดฒ;

- EOPNOTSUPP - SECCOMP_GET_ACTION_AVAIL เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดฒเดญเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เด“เดชเตเดชเดฑเต‡เดทเตป เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเต, เดŽเดจเตเดจเดพเตฝ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเดฟเดฒเต† เดฑเดฟเดŸเตเดŸเต‡เดฃเตเด•เดณเต† เด•เต‡เตผเดฃเตฝ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ;

- ESRCH - เดฎเดฑเตเดฑเตŠเดฐเต เดธเตเดŸเตเดฐเต€เด‚ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด’เดฐเต เดชเตเดฐเดถเตเดจเด‚ เดธเด‚เดญเดตเดฟเดšเตเดšเต;

- ENOSYS - SECCOMP_RET_TRACE เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเตฝ เดŸเตเดฐเต†เดฏเตโ€Œเดธเตผ เด˜เดŸเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

prctl เดŽเดจเตเดจเดคเต เด’เดฐเต เดชเตเดฐเต‹เดธเดธเดฟเดจเตเดฑเต† เดชเตเดฐเดคเตเดฏเต‡เด• เดตเดถเด™เตเด™เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป (เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดจเต‡เดŸเดพเดจเตเด‚) เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดพเดฃเต, เด…เดคเดพเดฏเดคเต byte endianness, เดคเตเดฐเต†เดกเต เดจเต†เดฏเดฟเดฎเตเด•เตพ, เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเต‡เดทเตป เดฎเต‹เดกเต (Seccomp), เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ, Perf เด‡เดตเดจเตเดฑเตเด•เตพ เดฎเตเดคเดฒเดพเดฏเดต.

Seccomp เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดธเดพเตปเดกเตโ€Œเดฌเต‹เด•เตโ€Œเดธเต เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเดฏเดพเดฏเดฟ เดคเต‹เดจเตเดจเดฟเดฏเต‡เด•เตเด•เดพเด‚, เดชเด•เตเดทเต‡ เด…เดคเต เด…เด™เตเด™เดจเต†เดฏเดฒเตเดฒ. เด’เดฐเต เดธเดพเตปเดกเตโ€Œเดฌเต‹เด•เตโ€Œเดธเต เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเดพเดฃเต Seccomp. 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 (เด“เดซเตเดธเต†เดฑเตเดฑเต‹เดซเต(เดธเตโ€ŒเดŸเตเดฐเด•เตเดฑเตเดฑเต เดธเต†เด•เตเด•เต‹เดฎเตเดชเต_เดกเดพเดฑเตเดฑ, เด†เตผเดšเตเดšเต))) - BPF_LD เดŽเดจเตเดจ เดตเดพเด•เตเด•เดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ BPF_LD-เตฝ เดจเดฟเดจเตเดจเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดชเดพเด•เตเด•เดฑเตเดฑเต เดกเดพเดฑเตเดฑ เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเดฟเดฒเดพเดฃเต BPF_ABS เดธเตเดฅเดฟเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - เด…เด•เตเดฏเตเดฎเตเดฒเต‡เดฑเตเดฑเตผ เดธเตเดฅเดฟเดฐเดพเด™เตเด•เดฎเดพเดฏ BPF_K เดฒเต† เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดฎเต‚เดฒเตเดฏเด‚ เด•เดฎเดพเดจเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต‹ เดŽเดจเตเดจเต BPF_JEQ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เด…เด™เตเด™เดจเต†เดฏเต†เด™เตเด•เดฟเตฝ, เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเต 0-เตฝ เด…เดŸเตเดคเตเดค เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดšเดพเดŸเตเด•, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เดฎเดพเดจเด‚ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เด’เดฐเต เดชเดฟเดถเด•เต เดตเดฐเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเต 3-เตฝ (เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ) เดšเดพเดŸเตเด•.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเต‹เดซเต(เดธเตโ€ŒเดŸเตเดฐเด•เตเดฑเตเดฑเต เดธเต†เด•เตเด•เต‹เดฎเตเดชเต_เดกเดพเดฑเตเดฑ, เดŽเตปเด†เตผ))) - BPF_LD เดŽเดจเตเดจ เดตเดพเด•เตเด•เดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ BPF_LD-เตฝ เดจเดฟเดจเตเดจเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด‡เดคเต BPF_ABS-เดจเตเดฑเต† เดจเดฟเดถเตเดšเดฟเดค เด“เดซเตโ€Œเดธเต†เดฑเตเดฑเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดจเดฎเตเดชเดฑเดพเดฃเต.

โ€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) โ€” เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดจเดฎเตเดชเดฑเดฟเดจเต† nr เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเดตเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด…เดต เดคเตเดฒเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดŸเตเดคเตเดค เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเต€เด™เตเด™เตเด•เดฏเตเด‚ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ SECCOMP_RET_ALLOW เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเดจเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (เดชเดฟเดถเด•เต & SECCOMP_RET_DATA)) - BPF_RET เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดชเดฟเดถเด•เต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเดฎเตเดชเดฑเดฟเตฝ SECCOMP_RET_ERRNO เดŽเดจเตเดจ เดชเดฟเดถเด•เต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - BPF_RET เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ SECCOMP_RET_ALLOW เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

SECCOMP CBPF เด†เดฃเต
เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตโ€Œเดค ELF เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเดฟเดจเต‹ JIT เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตโ€Œเดค เดธเดฟ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต‹ เดชเด•เดฐเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เดšเดฟเดจเตเดคเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚.

เด‡เดคเดฟเดจเต เดฐเดฃเตเดŸเต เด•เดพเดฐเดฃเด™เตเด™เดณเตเดฃเตเดŸเต.

โ€ข เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, Seccomp cBPF (เด•เตเดฒเดพเดธเดฟเด•เต BPF) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, eBPF เด…เดฒเตเดฒ, เด…เดคเดฟเดจเตผเดคเตเดฅเด‚: เด‡เดคเดฟเดจเต เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เตพ เด‡เดฒเตเดฒ, เดชเด•เตเดทเต‡ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ เด•เดพเดฃเตเดจเตเดจเดคเต เดชเต‹เดฒเต† เด…เดตเดธเดพเดจ เด•เดฃเด•เตเด•เตเด•เต‚เดŸเตเดŸเตฝ เดซเดฒเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด…เด•เตเดฏเตเดฎเตเดฒเต‡เดฑเตเดฑเตผ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต.

โ€ข เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, BPF เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐเดฏเดฟเดฒเต‡เด•เตเด•เต เดจเต‡เดฐเดฟเดŸเตเดŸเต Seccomp เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดฎเดฑเตเดฑเตŠเดจเตเดจเตเด‚. เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดฎเดพเด•เตเดฐเต‹เด•เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตผ-เดธเต—เดนเตƒเดฆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดˆ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต.

เดˆ เด…เดธเด‚เดฌเตเดฒเดฟ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดธเดนเดพเดฏเด‚ เด†เดตเดถเตเดฏเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด…เดคเต‡ เด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เดธเตเดฏเต‚เดกเต‹เด•เต‹เดกเต เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด•:

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 เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต. เดคเตเดŸเตผเดจเตเดจเต เดธเต‹เด•เตเด•เต_เดซเตเดชเตเดฐเต‹เด—เต เดŸเตˆเดชเตเดชเดฟเดจเตเดฑเต† เดชเตเดฐเต‹เด—เต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ SECCOMP_MODE_FILTER เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดซเดฟเตฝเดŸเตเดŸเตผ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเดพเตป เดžเด™เตเด™เตพ เดฎเต‹เดกเดฟเดจเต‹เดŸเต เดชเดฑเดฏเตเดจเตเดจเต:

  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 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เดคเตเดตเดดเดฟ เดšเตˆเตฝเดกเต เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เตพเด•เตเด•เต เด…เดตเดฐเตเดŸเต† เดฎเดพเดคเดพเดชเดฟเดคเดพเด•เตเด•เดณเต‡เด•เตเด•เดพเตพ เด•เต‚เดŸเตเดคเตฝ เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เดธเดพเดนเดšเดฐเตเดฏเด‚ เด’เดดเดฟเดตเดพเด•เตเด•เตเด•. เด‡เดคเตเดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดฑเต‚เดŸเตเดŸเต เด…เดตเด•เดพเดถเด™เตเด™เดณเดฟเดฒเตเดฒเดพเดคเต† เด‡เตปเดธเตเดฑเตเดฑเต‹เตพ_เดซเดฟเตฝเดฑเตเดฑเตผ เดซเด‚เด—เตเดทเดจเดฟเตฝ เดจเดฎเตเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ prctl เด•เต‹เดณเตเด•เตพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต install_filter เดซเด‚เด—เตโ€Œเดทเดจเต† เดตเดฟเดณเดฟเด•เตเด•เดพเด‚. X86-64 เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดŽเดฒเตเดฒเดพ เดฑเตˆเดฑเตเดฑเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด•เดณเตเด‚ เดคเดŸเดฏเตเด•เดฏเตเด‚ เดŽเดฒเตเดฒเดพ เดถเตเดฐเดฎเด™เตเด™เดณเต†เดฏเตเด‚ เดคเดŸเดฏเตเดจเตเดจ เด’เดฐเต เด…เดจเตเดฎเดคเดฟ เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเดพเด‚. เดซเดฟเตฝเดŸเตเดŸเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, เด†เดฆเตเดฏเดคเตเดคเต† เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดคเตเดŸเดฐเตเดจเตเดจเต:

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

เดจเดฎเตเด•เตเด•เต เดคเตเดŸเด™เตเด™เดพเด‚. เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฎเตเด•เตเด•เต clang เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ gcc เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚, เด’เดจเตเดจเตเด•เดฟเตฝ เด…เดคเต เดชเตเดฐเดคเตเดฏเต‡เด• เด“เดชเตโ€Œเดทเดจเตเด•เดณเดฟเดฒเตเดฒเดพเดคเต† main.c เดซเดฏเตฝ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเด•เดฏเดพเดฃเต:

clang main.c -o filter-write

เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เดŽเตปเดŸเตเดฐเดฟเด•เดณเตเด‚ เดžเด™เตเด™เตพ เดคเดŸเดžเตเดžเต. เด‡เดคเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต - ls เด’เดฐเต เดจเดฒเตเดฒ เดธเตเดฅเดพเดจเดพเตผเดคเตเดฅเดฟเดฏเดพเดฃเต†เดจเตเดจเต เดคเต‹เดจเตเดจเตเดจเตเดจเต. เด…เดตเตพ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต เดชเต†เดฐเตเดฎเดพเดฑเตเดจเตเดจเดคเต:

ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Apr 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Apr 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Apr 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Apr 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Apr 28 21:08 main.c

เด…เดคเตเดญเตเดคเด‚! เดžเด™เตเด™เดณเตเดŸเต† เดฑเดพเดชเตเดชเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเด™เตเด™เดจเต†เดฏเต†เดจเตเดจเต เด‡เดคเดพ: เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด†เดฆเตเดฏ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเดพเดฏเดฟ เดžเด™เตเด™เตพ เดชเดพเดธเตเดธเดพเด•เตเด•เตเดจเตเดจเต:

./filter-write "ls -la"

เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดˆ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดถเต‚เดจเตเดฏเดฎเดพเดฏ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เด‰เดฃเตเดŸเดพเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เด•เดพเดฃเดพเตป เดจเดฎเตเด•เตเด•เต เดธเตโ€ŒเดŸเตเดฐเต‡เดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚:

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

เดœเต‹เดฒเดฟเดฏเตเดŸเต† เดซเดฒเด‚ เดตเดณเดฐเต† เดšเตเดฐเตเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด…เดคเดฟเดจเตเดฑเต† เด…เดจเตเดฌเดจเตเดง เดญเดพเด—เด‚ EPERM เดชเดฟเดถเด•เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เดคเดŸเดžเตเดžเตเดตเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต - เดžเด™เตเด™เตพ เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดš เด…เดคเต‡ เด’เดจเตเดจเต. เดฑเตˆเดฑเตเดฑเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด’เดจเตเดจเตเด‚ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒ เดŽเดจเตเดจเดพเดฃเต เด‡เดคเดฟเดจเตผเดคเตเดฅเด‚:

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

Seccomp BPF เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดจเดฒเตเดฒ เดงเดพเดฐเดฃเดฏเตเดฃเตเดŸเต. เดŽเดจเตเดจเดพเตฝ cBPF-เดจเต เดชเด•เดฐเด‚ eBPF-เดจเตเดฑเต† เดชเต‚เตผเดฃเตเดฃ เดถเด•เตเดคเดฟ เดชเตเดฐเดฏเต‹เดœเดจเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เด…เดคเต‡ เด•เดพเดฐเตเดฏเด‚ เดจเต‡เดŸเดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต‡?

eBPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดšเดฟเดจเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดฎเดฟเด•เตเด• เด†เดณเตเด•เดณเตเด‚ เดšเดฟเดจเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดคเด™เตเด™เตพ เด…เดต เดŽเดดเตเดคเตเด•เดฏเตเด‚ เด…เดกเตเดฎเดฟเดจเดฟเดธเตเดŸเตเดฐเต‡เดฑเตเดฑเตผ เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เดŽเดจเตเดจเดพเดฃเต. เดˆ เดชเตเดฐเดธเตเดคเดพเดตเดจ เดชเตŠเดคเตเดตเต† เดถเดฐเดฟเดฏเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เดตเดฟเดตเดฟเดง เดคเดฒเด™เตเด™เดณเดฟเตฝ eBPF เด’เดฌเตเดœเด•เตเดฑเตเดฑเตเด•เดณเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ เด•เต‡เตผเดฃเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เดˆ เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เดณเต† เดฌเดฟเดชเดฟเดŽเดซเต เดŽเตฝเดŽเดธเตเดŽเด‚ เดŸเตเดฐเดพเดชเตเดชเตเด•เตพ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต.

เดฌเดฟเดชเดฟเดŽเดซเต เดŽเตฝเดŽเดธเตเดŽเด‚ เด•เต†เดฃเดฟเด•เตพ

เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‡เดตเดจเตเดฑเตเด•เดณเตเดŸเต† เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ-เดธเตเดตเดคเดจเตเดคเตเดฐ เดจเดฟเดฐเต€เด•เตเดทเดฃเด‚ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต, เดŸเตเดฐเดพเดชเตเดชเตเด•เตพ เดŽเดจเตเดจ เด†เดถเดฏเด‚ LSM เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดนเตเด•เตเด•เต เด•เต‹เตพ เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดฎเดพเดฏเดฟ เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเตเดตเดคเดจเตเดคเตเดฐเดตเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเดตเตเดฎเดพเดฏเดฟ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเดšเตเดšเดคเตเดฎเดพเดฃเต. เดตเตเดฏเดคเตเดฏเดธเตโ€Œเดค เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเตเด•เดณเดฟเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดจเต‡เดฐเดฟเดŸเตเดจเตเดจ เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เตพ เด’เดดเดฟเดตเดพเด•เตเด•เดพเตป เด’เดฐเต เด…เดฌเตโ€Œเดธเตโ€ŒเดŸเตเดฐเดพเด•เตเดทเตป เดฒเต†เดฏเดฑเดฟเดจเต เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดคเดฟเดฏ เด†เดถเดฏเด‚ เดŽเตฝเดŽเดธเตเดŽเด‚ เดจเตฝเด•เตเดจเตเดจเต.

เดŽเดดเตเดคเตเดฎเตเดชเต‹เตพ, เด•เต†เตผเดฃเดฒเดฟเดจเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดเดดเต เดนเตเด•เตเด•เตเด•เตพ เด‰เดฃเตเดŸเต, เด…เดต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจ เด’เดฐเต‡เดฏเตŠเดฐเต เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŽเตฝเดŽเดธเตเดŽเด‚ เด†เดฃเต SELinux.

เด•เต†เดฃเดฟเด•เตพเด•เตเด•เดพเดฏเตเดณเตเดณ เดธเต‹เดดเตเดธเต เด•เต‹เดกเต เดซเดฏเดฒเดฟเดฒเต† เด•เต‡เตผเดฃเตฝ เดŸเตเดฐเต€เดฏเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดšเต†เดฏเตเดฏเตเดจเตเดจเต 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 เดŸเต‚เดณเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดฎเดฑเตเดฑเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เดชเตเดฐเต‹เดœเด•เตเดŸเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเต เดธเด‚เดญเดพเดตเดจ เดจเตฝเด•เดฟ. เดกเต‹เด•เตเด•เตผ เดชเตเดฐเต‹เดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเดฟเดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเด‚ เดกเต‹เด•เตเด•เตผ เดชเตเดฒเด—เดฟเตป เด‡เด•เตเด•เต‹เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเตเด‚ เดชเต‡เดฐเตเด•เต‡เดŸเตเดŸเดคเดพเดฃเต. เดซเตเดฒเต‡เด‚ เด—เตเดฐเดพเดซเตเด•เดณเดฟเตฝ เดกเต‡เดตเดฟเดกเต เดตเดณเดฐเต† เด…เดญเดฟเดจเดฟเดตเต‡เดถเดฎเตเดณเตเดณเดฏเดพเดณเดพเดฃเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดชเตเดฐเด•เดŸเดจเด‚ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดฏเดพเตป เดŽเดชเตเดชเต‹เดดเตเด‚ เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต.

เดฒเต‹เดฑเต†เตปเดธเต‹ เดซเต‹เดฃเตเดŸเดพเดจ เดธเดฟเดธเตโ€Œเดกเดฟเด—เดฟเดฒเต† เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เดŸเต€เดฎเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดตเดฟเดŸเต† เด…เดฆเตเดฆเต‡เดนเด‚ เดชเตเดฐเดพเดฅเดฎเดฟเด•เดฎเดพเดฏเดฟ เดซเดพเตฝเด•เตเด•เต‹เดฏเดฟเตฝ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด’เดฐเต เด•เต†เตผเดฃเตฝ เดฎเตŠเดกเตเดฏเต‚เดณเดฟเดฒเต‚เดŸเต†เดฏเตเด‚ eBPF เดตเดดเดฟเดฏเตเด‚ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เดฑเตบเดŸเตˆเด‚ เดธเตเดฐเด•เตเดทเดฏเตเด‚ เด…เดชเดพเด•เดค เด•เดฃเตเดŸเต†เดคเตเดคเดฒเตเด‚ เดจเตฝเด•เตเดจเตเดจ เด•เตเดฒเต—เดกเต เดจเต‡เดฑเตเดฑเต€เดตเต เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฟเด‚เด—เต เดซเต—เดฃเตเดŸเต‡เดทเตป เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต. เดกเดฟเดธเตเดŸเตเดฐเดฟเดฌเตเดฏเต‚เดŸเตเดŸเดกเต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เตพ, เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เต, เดฒเดฟเดจเด•เตเดธเต เด•เต‡เตผเดฃเตฝ, เดชเตเดฐเด•เดŸเดจ เดตเดฟเดถเด•เดฒเดจเด‚ เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เด…เดฆเตเดฆเต‡เดนเดคเตเดคเดฟเดจเต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต.

ยป เดชเตเดธเตเดคเด•เดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เด‡เดตเดฟเดŸเต† เด•เดพเดฃเดพเด‚ เดชเตเดฐเดธเดพเดงเด•เดจเตเดฑเต† เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต
ยป เด‰เดณเตเดณเดŸเด•เตเด• เดชเดŸเตเดŸเดฟเด•
ยป เด‰เดฆเตเดงเดฐเดฃเดฟ

เด–เดฌเตเดฐเต‹เดœเดฟเดฑเตเดฑเต†เดฒเดฟเด•เตเด•เต เด•เต‚เดชเตเดชเตบ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต 25% เด•เดฟเดดเดฟเดตเต - เดฒเดฟเดจเด•เตเดธเต

เดชเตเดธเตเดคเด•เดคเตเดคเดฟเดจเตเดฑเต† เดชเต‡เดชเตเดชเตผ เดชเดคเดฟเดชเตเดชเต เดชเดฃเดฎเดŸเดฏเตเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด’เดฐเต เด‡เดฒเด•เตเดŸเตเดฐเต‹เดฃเดฟเด•เต เดชเตเดธเตเดคเด•เด‚ เด‡-เดฎเต†เดฏเดฟเตฝ เดตเดดเดฟ เด…เดฏเดฏเตเด•เตเด•เตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•