αžŸαŸ€αžœαž—αŸ… "BPF αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž›αžΈαž“αž»αž…"

αžŸαŸ€αžœαž—αŸ… "BPF αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž›αžΈαž“αž»αž…"αž‡αŸ†αžšαžΆαž”αžŸαž½αžšαž’αŸ’αž“αž€αžŸαŸ’αžšαž»αž€ Khabro! αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž BPF αž‚αžΊαž‡αžΆαžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž˜αž½αž™αž“αŸƒαžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αŸ” αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžšαž”αžŸαŸ‹αžœαžΆαž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžœαž·αžŸαŸ’αžœαž€αžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αŸ†αž αž»αžŸ αž“αž·αž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž”αž‰αŸ’αž αžΆαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αŸ†αž•αž»αžαŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αž“αž·αž„αž€αŸ‚αž”αŸ’αžšαŸ‚αž₯αžšαž·αž™αžΆαž”αžαžšαž”αžŸαŸ‹αžαžΊαžŽαŸ‚αž› αžšαž”αŸ€αž”αž’αž“αž»αžœαžαŸ’αžαž€αžΌαžŠαžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αžŠαžΎαž˜αŸ’αž”αžΈαžαžΆαž˜αžŠαžΆαž“αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› αž“αž·αž„αž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ” David Calavera αž“αž·αž„ Lorenzo Fontana αž“αžΉαž„αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ„αžαžΆαž˜αž–αž›αžšαž”αžŸαŸ‹ BPF αŸ” αž–αž„αŸ’αžšαžΈαž€αž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž›αžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž”αžŽαŸ’αžαžΆαž‰ αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ” - αž”αŸ’αžšαžΎ BPF αžŠαžΎαž˜αŸ’αž”αžΈαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αž“αž·αž„αž€αŸ‚αž”αŸ’αžšαŸ‚αž₯αžšαž·αž™αžΆαž”αžαžšαž”αžŸαŸ‹αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αŸ” - αž”αž‰αŸ’αž…αžΌαž›αž€αžΌαžŠαžŠαžΎαž˜αŸ’αž”αžΈαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžαžΊαžŽαŸ‚αž›αžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αž„αž€αŸ’αžšαž„αžαžΊαžŽαŸ‚αž›αž‘αžΎαž„αžœαž·αž‰ αž¬αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΎαž„αžœαž·αž‰αŸ” - αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž€αžΌαžŠαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸ…αž€αŸ’αž“αž»αž„ C, Go ឬ Python αŸ” - αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž‡αžΆαž˜αŸ’αž…αžΆαžŸαŸ‹αž“αŸƒαžœαžŠαŸ’αžαž‡αžΈαžœαž·αžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αŸ”

αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž… αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαžšαž”αžŸαŸ‹αžœαžΆ αž“αž·αž„ Seccomp

BPF αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžœαž·αž’αžΈαžŠαŸαž˜αžΆαž“αž’αžΆαž“αž»αž—αžΆαž–αžŠαžΎαž˜αŸ’αž”αžΈαž–αž„αŸ’αžšαžΈαž€αžαžΊαžŽαŸ‚αž›αžŠαŸ„αž™αž˜αž·αž“αž›αŸ‡αž”αž„αŸ‹αžŸαŸ’αžαŸαžšαž—αžΆαž– αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž¬αž›αŸ’αž”αžΏαž“αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαžΊαžŽαŸ‚αž›αž”αžΆαž“αž‚αž·αžαžαžΆ αžœαžΆαž‡αžΆαž‚αŸ†αž“αž·αžαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž—αžΆαž–αž”αžαŸ‹αž”αŸ‚αž“αžšαž”αžŸαŸ‹αžœαžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž—αžΆαž–αž―αž€αŸ„αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Seccomp αžŠαŸ„αž™αž’αž“αž»αžœαžαŸ’αžαžαž˜αŸ’αžšαž„ Seccomp αžŠαŸ‚αž›αž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆ Seccomp BPF αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αŸ†αž–αžΌαž€αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αž“αŸ’αž™αž›αŸ‹αžαžΆ Seccomp αž‡αžΆαž’αŸ’αžœαžΈ αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αž“αžΉαž„αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžš Seccomp filters αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‘αŸ†αž–αž€αŸ‹ BPF αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΌαžŒαž»αž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž›αžΈαž“αž»αž…αŸ”

αž˜αŸ‰αžΌαžŒαž»αž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž›αžΈαž“αž»αž… (LSM) αž‚αžΊαž‡αžΆαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αžšαžΌαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž•αŸ’αžŸαŸαž„αŸ—αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ” LSM αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‚αž€αž’αžΆαž„αž”αŸ’αžšαž—αž–αžαžΊαžŽαŸ‚αž› αžŠαžΌαž…αž‡αžΆ Apparmor, SELinux αž“αž·αž„ Tomoyo αŸ”

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αž›αžΈαž“αž»αž…αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸ

αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αž›αžΈαž“αž»αž…αž‚αžΊαžαžΆ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αž·αž…αŸ’αž…αž€αžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ„αž™αž˜αž·αž“αž”αŸ’αžšαžΎ suid αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸ„αŸ‡ αž¬αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸαž’αŸ’αžœαžΎαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž· αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžœαžΆαž™αž”αŸ’αžšαž αžΆαžš αž“αž·αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αžΎαž€αž…αŸ’αžšαž€αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž· αž“αž·αž™αžΆαž™αžαžΆ 80 αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆ root αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžœαžΆαž“αžΌαžœαžŸαž˜αžαŸ’αžαž—αžΆαž– CAP_NET_BIND_SERVICE αŸ”

αž–αž·αž…αžΆαžšαžŽαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Go αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆ main.goαŸ–

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

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αž”αž˜αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP αž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 80 (αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž…αŸ’αžšαž€αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·)αŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αŸ–

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

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αž˜αž·αž“αž•αŸ’αžαž›αŸ‹αžŸαž·αž‘αŸ’αž’αž·αž‡αžΆ root αž€αžΌαžŠαž“αŸαŸ‡αž“αžΉαž„αž”αŸ„αŸ‡αž€αŸ†αž αž»αžŸαž“αŸ…αž–αŸαž›αž—αŸ’αž‡αžΆαž”αŸ‹αž…αŸ’αžšαž€αŸ–

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

capsh (αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸ‚αž›) αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ‚αž›αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ†αžŽαž»αŸ†αžŸαž˜αžαŸ’αžαž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžšαž½αž…αž˜αž€αž αžΎαž™ αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αžŸαž·αž‘αŸ’αž’αž·αž‡αžΆ root αž–αŸαž‰αž›αŸαž‰ αž’αŸ’αž“αž€αž’αžΆαž…αž”αžΎαž€αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž…αŸ’αžšαž€αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αžŠαŸ„αž™αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŸαž˜αžαŸ’αžαž—αžΆαž– cap_net_bind_service αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αžœαžΈαŸ—αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž½αž…αž αžΎαž™αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž‡αžΆ capshαŸ–

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

αžαŸ„αŸ‡αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αž”αž“αŸ’αžαž·αž…αŸ”

  • capsh - αž”αŸ’αžšαžΎ capsh αž‡αžΆαžŸαŸ‚αž›αŸ”
  • β€”caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (αž™αžΎαž„αž˜αž·αž“αž…αž„αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆ root) αž™αžΎαž„αž“αžΉαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ cap_net_bind_service αž“αž·αž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž–αžΈ root αž‘αŸ…αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž‚αžΊ cap_setuid αž“αž·αž„ cap_setgid αŸ”
  • β€”keep=1 β€” αž™αžΎαž„αž…αž„αŸ‹αžšαž€αŸ’αžŸαžΆαžŸαž˜αžαŸ’αžαž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž–αŸαž›αž”αŸ’αžαžΌαžšαž–αžΈαž‚αžŽαž“αžΈ root αŸ”
  • β€”user=β€œnobody” β€” αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž…αž»αž„β€‹αž€αŸ’αžšαŸ„αž™β€‹αžŠαŸ‚αž›β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž“αžΉαž„β€‹αž‚αŸ’αž˜αžΆαž“β€‹αž“αžšαžŽαžΆβ€‹αž˜αŸ’αž“αžΆαž€αŸ‹β€‹αž‘αžΎαž™αŸ”
  • β€”addamb=cap_net_bind_service β€” αž€αŸ†αžŽαžαŸ‹β€‹αž€αžΆαžšβ€‹αž‡αž˜αŸ’αžšαŸ‡β€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αžŠαŸ‚αž›β€‹αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž”αŸ’αžŠαžΌαžšβ€‹αž–αžΈβ€‹αžšαž”αŸ€αž” root αŸ”
  • -c "./capabilities" - αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŸαž˜αžαŸ’αžαž—αžΆαž–αž—αŸ’αž‡αžΆαž”αŸ‹αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαžŸαž˜αžαŸ’αžαž—αžΆαž–αž–αž·αžŸαŸαžŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž˜αžšαžαž€αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αž»αž˜αžΆαžš αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αž½αž€αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ exeve()αŸ” αž˜αžΆαž“β€‹αžαŸ‚β€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžβ€‹αž±αŸ’αž™β€‹αž‡αžΆαž”αŸ‹β€‹αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’ αž¬β€‹αž“αž·αž™αžΆαž™β€‹αž˜αŸ’αž™αŸ‰αžΆαž„β€‹αž‘αŸ€αžβ€‹αžαžΆβ€‹αž‡αžΆβ€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αž”αžšαž·αžŸαŸ’αžαžΆαž“β€‹αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‘αž‘αž½αž›β€‹αž˜αžšαžαž€αŸ”

αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž†αŸ’αž„αž›αŸ‹αžαžΆαžαžΎ +eip αž˜αžΆαž“αž“αŸαž™αž™αŸ‰αžΆαž„αžŽαžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŸαž˜αžαŸ’αžαž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαžΎαžŸ --capsαŸ” αž‘αž„αŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžαžΆαžŸαž˜αžαŸ’αžαž—αžΆαž–αŸ–

- αžαŸ’αžšαžΌαžœαžαŸ‚αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαž€αž˜αŸ’αž˜ (αž‘αŸ†);

- αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (ធ៊ី);

αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž˜αžšαžαž€αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž˜αžΆαžš (i) αŸ”

αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αž…αž„αŸ‹αž”αŸ’αžšαžΎ cap_net_bind_service αž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž‘αž„αŸ‹ e αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž“αžΉαž„αž”αžΎαž€αžŸαŸ‚αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ” αžœαžΆαž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαžŸαž˜αžαŸ’αžαž—αžΆαž– αž αžΎαž™αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžœαžΆαžŠαŸ„αž™αž‘αž„αŸ‹ i αŸ” αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž™αžΎαž„αž…αž„αŸ‹αž”αžΎαž€αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡ (αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αž˜αž·αž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš UID) αž‡αžΆαž˜αž½αž™αž‘αŸ†αŸ” αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž‡αžΆ cap_net_bind_service+eip αŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž›αž‘αŸ’αž’αž•αž›αžŠαŸ„αž™αž”αŸ’αžšαžΎ ss αŸ” αžŸαžΌαž˜β€‹αž€αžΆαžαŸ‹β€‹αž‘αž·αž“αŸ’αž“αž•αž›β€‹αž±αŸ’αž™β€‹αžαŸ’αž›αžΈβ€‹αž”αž“αŸ’αžαž·αž…β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž±αŸ’αž™β€‹αžŸαž˜β€‹αž“αžΉαž„β€‹αž‘αŸ†αž–αŸαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžœαžΆβ€‹αž“αžΉαž„β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž…αŸ’αžšαž€β€‹αžŠαŸ‚αž›β€‹αž‡αžΆαž”αŸ‹β€‹αž‘αžΆαž€αŸ‹αž‘αž„β€‹αž“αž·αž„β€‹αž›αŸαžβ€‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž•αŸ’αžŸαŸαž„β€‹αž–αžΈ 0 αž€αŸ’αž“αž»αž„β€‹αž€αžšαžŽαžΈβ€‹αž“αŸαŸ‡ 65αŸ–

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

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎ capsh αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžšαžŸαŸαžšαžŸαŸ‚αž›αžŠαŸ„αž™αž”αŸ’αžšαžΎ libcap αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ αžŸαžΌαž˜αž˜αžΎαž› man 3 libcap αŸ”

αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž˜αž·αž“αžŠαžΉαž„αž‡αžΆαž˜αž»αž“αž“αžΌαžœαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž˜αž»αžαž„αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž–αžΈαžŸαž˜αžαŸ’αžαž—αžΆαž–αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž’αžΆαž…αž™αž€αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž– BCC αžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹ kprobe αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž»αžαž„αžΆαžšαžαžΊαžŽαŸ‚αž› cap_capableαŸ–

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

αž™αžΎαž„αž’αžΆαž…αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαžšαžΏαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ bpftrace αž‡αžΆαž˜αž½αž™αž“αžΉαž„ kprobe αž˜αž½αž™αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž˜αž»αžαž„αžΆαžšαžαžΊαžŽαŸ‚αž› cap_capableαŸ–

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

αžœαžΆβ€‹αž“αžΉαž„β€‹αž…αŸαž‰β€‹αž›αž‘αŸ’αž’αž•αž›β€‹αžŠαžΌαž…β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜ αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αžΎαž€β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈ kprobeαŸ–

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

αž‡αž½αžšαž‘αžΈαž”αŸ’αžšαžΆαŸ†αž‚αžΊαž‡αžΆαžŸαž˜αžαŸ’αžαž—αžΆαž–αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαžΌαžœαž€αžΆαžš αž αžΎαž™αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž›αž‘αŸ’αž’αž•αž›αž“αŸαŸ‡αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžŸαžœαž“αž€αž˜αŸ’αž˜ αž™αžΎαž„αžƒαžΎαž‰αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžŸαžœαž“αž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž αžΎαž™αž‘αžΈαž”αŸ†αž•αž»αžαžŸαž˜αžαŸ’αžαž—αžΆαž–αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž„αŸ‹αžŸαžœαž“αž€αž˜αŸ’αž˜ (αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž‘αŸ’αž’αž•αž›) αž€αŸ†αžŽαžαŸ‹αž‘αŸ… 1. αžŸαž˜αžαŸ’αžαž—αžΆαž–αŸ” αž˜αž½αž™αžŠαŸ‚αž›αž™αžΎαž„αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž‚αžΊ CAP_NET_BIND_SERVICE αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž‡αžΆαžαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžαžΊαžŽαŸ‚αž›αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžšαž½αž˜αž˜αžΆαž“/uapi/linux/ability.h αž‡αžΆαž˜αž½αž™αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ 10αŸ–

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

αžŸαž˜αžαŸ’αžαž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαžŠαžΌαž…αž‡αžΆ runC ឬ Docker αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž–αž½αž€αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž˜αž·αž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž· αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαžαŸ’αžšαžΉαž˜αžαŸ‚αžŸαž˜αžαŸ’αžαž—αžΆαž–αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΆαž˜αž‘αžΆαžšαžŸαž˜αžαŸ’αžαž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ Docker αž’αžΆαž…αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž–αž½αž€αž‚αŸαžŠαŸ„αž™αž”αŸ’αžšαžΎ --cap-add:

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

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž€αž»αž„αžαžΊαž“αŸαžšαž“αžΌαžœαžŸαž˜αžαŸ’αžαž—αžΆαž– CAP_NET_ADMIN αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžœαžΆαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ dummy0 αŸ”

αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαžŠαžΌαž…αž‡αžΆαž€αžΆαžšαžαŸ’αžšαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž”αŸ’αžšαžΎαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαž•αŸ’αžŸαŸαž„αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαž˜αŸ’αžšαž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

Seccomp

Seccomp αžαŸ†αžŽαžΆαž„αž±αŸ’αž™ Secure Computing αž“αž·αž„αž‡αžΆαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž… αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αžšαž„αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆ Seccomp αž’αžΆαž…αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžŸαž˜αžαŸ’αžαž—αžΆαž–αž‘αŸ…αž“αžΉαž„αž›αžΈαž“αž»αž…αž€αŸαžŠαŸ„αž™ αžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž˜αžΆαž“αž—αžΆαž–αž”αžαŸ‹αž”αŸ‚αž“αž‡αžΆαž„αž”αžΎαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‘αŸ…αž“αžΉαž„αž–αž½αž€αž‚αŸαŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸ Seccomp αž“αž·αž„ Linux αž‚αžΊαž˜αž·αž“αž•αŸ’αžαžΆαž…αŸ‹αž˜αž»αžαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€ αž αžΎαž™αž‡αžΆαžšαžΏαž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž”αŸ’αžšαžΎαž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‘αžΆαŸ†αž„αž–αžΈαžšαŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž…αž„αŸ‹αž•αŸ’αžαž›αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αžΌαžœαžŸαž˜αžαŸ’αžαž—αžΆαž– CAP_NET_ADMIN αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžœαžΆαž‘αž‘αž½αž›αž™αž€αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αžšαž“αŸ’αž’ αžšαžΆαžšαžΆαŸ†αž„αž€αžΆαžšαž‘αž‘αž½αž› αž“αž·αž„αž‘αž‘αž½αž›αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž”αŸ’αžšαž–αŸαž“αŸ’αž’ 4 αž‘αŸαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž…αž˜αŸ’αžšαŸ„αŸ‡ Seccomp αž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαžαž˜αŸ’αžšαž„ BPF αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αžšαž”αŸ€αž” SECOMP_MODE_FILTER αž αžΎαž™αž€αžΆαžšαžαŸ’αžšαž„αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αžšαŸ”

αžαž˜αŸ’αžšαž„ Seccomp αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎ prctl αžαžΆαž˜αžšαž™αŸˆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš PR_SET_SECOMP αŸ” αžαž˜αŸ’αžšαž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž™αž€αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹ Seccomp αž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ seccomp_data αŸ” αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αž“αŸαŸ‡αž˜αžΆαž“αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž™αŸ„αž„ αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž”αžŸαŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αŸαž›αž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž“αž·αž„αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αžαž·αž”αžšαž˜αžΆαž…αŸ†αž“αž½αž“αž”αŸ’αžšαžΆαŸ†αž˜αž½αž™ αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž‡αžΆ uint64 αŸ”

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ seccomp_data αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž–αžΈαž€αžΌαžŠαž”αŸ’αžšαž—αž–αžαžΊαžŽαŸ‚αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš linux/seccomp.hαŸ–

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 (Bad System Call) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž αŸ…αžœαžΆαŸ”

- SECOMP_RET_ERRNO - αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‘αŸ αž αžΎαž™αž•αŸ’αž“αŸ‚αž€αž“αŸƒαžαž˜αŸ’αž›αŸƒαžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αžšαž„ SECOMP_RET_DATA αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‡αžΆαžαž˜αŸ’αž›αŸƒ errno αŸ” αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž˜αžΌαž›αž αŸαžαž»αž“αŸƒαž€αŸ†αž αž»αžŸ αžαž˜αŸ’αž›αŸƒ errno αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αŸ” αž”αž‰αŸ’αž‡αžΈαž›αŸαžαž€αŸ†αž αž»αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž“αŸ…αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

- SECOMP_RET_TRACE - αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžŠαž›αŸ‹αž’αŸ’αž“αž€αžαžΆαž˜αžŠαžΆαž“ ptrace αžŠαŸ„αž™αž”αŸ’αžšαžΎ - PTRACE_O_TRACESECCOMP αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž‘αžΆαž€αŸ‹αž…αžΆαž”αŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž› αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ„αŸ‡αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž§αž”αž€αžšαžŽαŸαžαžΆαž˜αžŠαžΆαž“αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ αž€αŸ†αž αž»αžŸαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αžšαž›αž”αŸ‹αž˜αž€αžœαž·αž‰ errno αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ… -ENOSYS αž αžΎαž™αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‘αŸαŸ”

- SECOMP_RET_LOG - αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ αž“αž·αž„αž…αžΌαž›αŸ”

- SECOMP_RET_ALLOW - αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αŸ”

ptrace αž‚αžΊαž‡αžΆαž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž™αž“αŸ’αžαž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αž αŸ…αžαžΆ tracee αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž˜αžŠαžΆαž“αž’αžΆαž…αž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αž›αžΎαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž“αž·αž„αž€αŸ‚αž”αŸ’αžšαŸ‚αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžŸαžαž·αžšαž”αžŸαŸ‹ tracee αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘ Seccomp ptrace αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αž„αŸ’αž€αž‘αžΎαž„αžŠαŸ„αž™αž›αŸαžαž€αžΌαžŠαžŸαŸ’αžαžΆαž“αž—αžΆαž– SECOMP_RET_TRACE αžŠαžΌαž…αŸ’αž“αŸαŸ‡ tracer αž’αžΆαž…αž€αžΆαžšαž–αžΆαžšαž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžœαžΆαŸ”

αž€αŸ†αž αž»αžŸ Seccomp

αž–αžΈαž–αŸαž›αž˜αž½αž™αž‘αŸ…αž–αŸαž›αž˜αž½αž™ αžαžŽαŸˆαž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Seccomp αž’αŸ’αž“αž€αž“αžΉαž„αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž”αž‰αŸ’αž αžΆαž•αŸ’αžŸαŸαž„αŸ— αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžŠαŸ„αž™αžαž˜αŸ’αž›αŸƒαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ SECOMP_RET_ERRNO αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžšαžΆαž™αž€αžΆαžšαžŽαŸαž–αžΈαž€αŸ†αž αž»αžŸ αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’ seccomp αž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹ -1 αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™ 0αŸ”

αž€αŸ†αž αž»αžŸαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ–

- EACCESS - αž’αŸ’αž“αž€αž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αžœαžΎαž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αŸαŸ” αžœαžΆαž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžœαžΆαž˜αž·αž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž· CAP_SYS_ADMIN ឬ no_new_privs αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎ prctl (αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžœαžΆαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™);

- EFAULT β€” αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αž˜αŸαž (args αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ seccomp_data) αž˜αž·αž“αž˜αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‘αŸαŸ”

- EINVAL - αžœαžΆαž’αžΆαž…αž˜αžΆαž“αž αŸαžαž»αž•αž›αž”αž½αž“αž™αŸ‰αžΆαž„αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ–

- αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‚αžΊαž˜αž·αž“αžŸαŸ’αž‚αžΆαž›αŸ‹ αž¬αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸ„αž™αžαžΊαžŽαŸ‚αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”

-αž‘αž„αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‚αžΊαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αŸ”

-operation αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› BPF_ABS αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αž»αž αŸ’αžœαžŸαž·αžαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ‚αž›αž’αžΆαž…αž›αžΎαžŸαž–αžΈαž‘αŸ†αž αŸ†αž“αŸƒαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ seccomp_data αŸ”

- αž…αŸ†αž“αž½αž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αžαž˜αŸ’αžšαž„αž›αžΎαžŸαž–αžΈαž’αžαž·αž”αžšαž˜αžΆαŸ”

β€” ENOMEM β€” αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž’αž„αŸ’αž‚β€‹αž…αž„αž…αžΆαŸ†β€‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

- EOPNOTSUPP - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„ SECOMP_GET_ACTION_AVAIL αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‚αžΊαž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΊαžŽαŸ‚αž›αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž‘αŸαŸ”

- ESRCH β€” αž”αž‰αŸ’αž αžΆαž˜αž½αž™αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

- ENOSYS - αž˜αž·αž“αž˜αžΆαž“αžŠαžΆαž“αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž“αžΉαž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– SECOMP_RET_TRACE αž‘αŸαŸ”

prctl αž‚αžΊαž‡αžΆαž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž›αŸ†αž αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαŸ€αž”αž…αŸ† (αž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“) αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž”αŸƒ, αžˆαŸ’αž˜αŸ„αŸ‡αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™, αžšαž”αŸ€αž”αž‚αžŽαž“αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– (Secomp), αžŸαž·αž‘αŸ’αž’αž·, αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸ Perf αž‡αžΆαžŠαžΎαž˜αŸ”

Seccomp αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ Sandbox αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‘αŸαŸ” Seccomp αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αž„αŸ’αž€αžΎαžαž™αž“αŸ’αžαž€αžΆαžš sandbox αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž”αŸ’αžšαžΎαžαž˜αŸ’αžšαž„αžŠαŸ‚αž›αž αŸ…αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžŠαŸ„αž™αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’ Seccomp αŸ”

αž§αž‘αžΆαž αžšαžŽαŸαžαž˜αŸ’αžšαž„ BPF Seccomp

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‘αžΆαŸ†αž„αž–αžΈαžšαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž–αžΈαž˜αž»αž“αž‚αžΊαŸ–

β€” αž™αžΎαž„β€‹αž“αžΉαž„β€‹αžŸαžšαžŸαŸαžšβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Seccomp BPF αžŠαŸ‚αž›β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αž‡αžΆβ€‹αžαž˜αŸ’αžšαž„β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αžαž»αžŸβ€‹αž‚αŸ’αž“αžΆβ€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αž€αžΆαžšβ€‹αžŸαž˜αŸ’αžšαŸαž…β€‹αž…αž·αžαŸ’αžβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž’αŸ’αžœαžΎαŸ”

- αž•αŸ’αž‘αž»αž€αžαž˜αŸ’αžšαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ prctl αŸ”

αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž‹αž˜αž€αžαžΆαž–αžΈαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš αž“αž·αž„αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αŸ–

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

αž˜αž»αž“αž–αŸαž›αžŸαžΆαž€αž›αŸ’αž”αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αžΆαž“αžΆαžαžΆαžαžΊαžŽαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αžŠαŸ„αž™ CONFIG_SECCOMP αž“αž·αž„ CONFIG_SECOMP_FILTER αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž‡αžΆ y αŸ” αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž’αŸ’αžœαžΎαž€αžΆαžš αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

αž€αžΌαžŠαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžš install_filter αž–αžΈαžšαž•αŸ’αž“αŸ‚αž€αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈαž˜αž½αž™αž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαžαž˜αŸ’αžšαž„ BPF αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

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

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαž€αŸ’αžšαžΌ BPF_STMT αž“αž·αž„ BPF_JUMP αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš linux/filter.h αŸ”
αž…αžΌαžšαž™αžΎαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αŸ”

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch)))) - αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αž‘αž»αž€ αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž–αžΈ BPF_LD αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž–αžΆαž€αŸ’αž™ BPF_W αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž’αž»αž αŸ’αžœαžŸαž·αžαžαŸαžš BPF_ABS αŸ”

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - αž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ BPF_JEQ αžαžΆαžαžΎαžαž˜αŸ’αž›αŸƒαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„ BPF_K accumulator αžαŸαžšαžŸαŸ’αž˜αžΎαž“αžΉαž„ arch αŸ” αž”αžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž›αŸ„αžαž“αŸ…αž’αž»αž αŸ’αžœαžŸαž·αž 0 αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž›αŸ„αžαž“αŸ…αž’αž»αž αŸ’αžœαžŸαž·αž 3 (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡) αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ„αŸ‡αž€αŸ†αž αž»αžŸαž–αŸ’αžšαŸ„αŸ‡ arch αž˜αž·αž“αžŸαŸŠαžΈαž‚αŸ’αž“αžΆαŸ”

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr)))) - αž•αŸ’αž‘αž»αž€ αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž–αžΈ BPF_LD αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž–αžΆαž€αŸ’αž™ BPF_W αžŠαŸ‚αž›αž‡αžΆαž›αŸαžαž αŸ…αžšαž”αžŸαŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ’αž“αž»αž„αž’αž»αž αŸ’αžœαžŸαž·αžαžαŸαžšαž“αŸƒ BPF_ABSαŸ”

β€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) β€” αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž›αŸαžαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžš nr αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αž½αž€αžœαžΆαžŸαŸ’αž˜αžΎαž‚αŸ’αž“αžΆ αžŸαžΌαž˜αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž αžΎαž™αž”αž·αž‘αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‡αžΆαž˜αž½αž™ SECOMP_RET_ALLOW αŸ”

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ERRNO | (error & SECOMP_RET_DATA)) - αž”αž‰αŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαž˜αž½αž™ BPF_RET αž αžΎαž™αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž”αž„αŸ’αž€αžΎαžαž€αŸ†αž αž»αžŸ SECOMP_RET_ERRNO αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αŸαžαž–αžΈ err variableαŸ”

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - αž”αž‰αŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαž˜αž½αž™ BPF_RET αž“αž·αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ SECOMP_RET_ALLOW αŸ”

SECOMP αž‚αžΊ CBPF
αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž†αŸ’αž„αž›αŸ‹αžαžΆαž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž”αž‰αŸ’αž‡αžΈαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αžœαžαŸ’αžαž» ELF αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„ αž¬αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ C αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„ JIT αŸ”

αž˜αžΆαž“αž αŸαžαž»αž•αž›αž–αžΈαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αŸ”

β€’ αž‘αžΈαž˜αž½αž™ Seccomp αž”αŸ’αžšαžΎ cBPF (classic BPF) αž“αž·αž„αž˜αž·αž“αž˜αŸ‚αž“ eBPF αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαŸ– αžœαžΆαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αžαŸ‚ accumulator αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αž‘αŸ’αž’αž•αž›αž‚αžŽαž“αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžŠαžΌαž…αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαŸ”

β€’ αž‘αžΈαž–αžΈαžš Seccomp αž‘αž‘αž½αž›αž™αž€αž‘αŸ’αžšαž“αž·αž…αž˜αž½αž™αž‘αŸ…αž€αžΆαž“αŸ‹αž’αžΆαžšαŸαž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† BPF αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αž αžΎαž™αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αŸαŸ” αž˜αŸ‰αžΆαž€αŸ’αžšαžΌαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αž½αž™αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαžΆαž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αŸ†αž“αž½αž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž–αžΈαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸαŸ‡ αžŸαžΌαž˜αž–αž·αž…αžΆαžšαžŽαžΆ pseudocode αžŠαŸ‚αž›αž’αŸ’αžœαžΎαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αŸ–

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

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αŸ†αžŽαžαŸ‹αž€αžΌαžŠαžαž˜αŸ’αžšαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ socket_filter αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹ sock_fprog αžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαžαž€αžΌαžŠ αž“αž·αž„αž”αŸ’αžšαžœαŸ‚αž„αžŠαŸ‚αž›αž”αžΆαž“αž‚αžŽαž“αžΆαž“αŸƒαžαž˜αŸ’αžšαž„αŸ” αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸαŸ‡αž‚αžΊαžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž€αžΆαžŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ–

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

αž˜αžΆαž“αžšαžΏαž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αž»αžαž„αžΆαžš install_filter - αž•αŸ’αž‘αž»αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„! αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž™αžΎαž„αž”αŸ’αžšαžΎ prctl αžŠαŸ„αž™αž™αž€ PR_SET_SECOMP αž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αžΌαž›αžšαž”αŸ€αž”αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž”αŸ’αžšαžΆαž”αŸ‹αž–αžΈαžšαž”αŸ€αž”αž•αŸ’αž‘αž»αž€αžαž˜αŸ’αžšαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ SECOMP_MODE_FILTER αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ prog variable αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ sock_fprogαŸ–

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

αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš install_filter αžšαž”αžŸαŸ‹αž™αžΎαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž»αž“αž“αŸ„αŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎ prctl αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹ PR_SET_NO_NEW_PRIVS αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž αžΎαž™αžŠαŸ„αž™αž αŸαžαž»αž“αŸαŸ‡αž‡αŸ€αžŸαžœαžΆαž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž˜αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αžͺαž–αž»αž€αž˜αŸ’αžαžΆαž™αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž‡αžΆαž˜αž½αž™αž“αŸαŸ‡ αž™αžΎαž„αž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž αŸ… prctl αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αž»αžαž„αžΆαžš install_filter αžŠαŸ„αž™αž˜αž·αž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž‡αžΆ root αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž αŸ…αž˜αž»αžαž„αžΆαžš 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 αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž αžΎαž™αž˜αžΆαž“αž‚αŸ†αž“αž·αžαž›αŸ’αž’αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αž‡αžΆαž˜αž½αž™αžœαžΆαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž’αŸ’αž“αž€αž˜αž·αž“αž…αž„αŸ‹αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαžšαžΏαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ eBPF αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™ cBPF αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αžαžΆαž˜αž–αž›αž–αŸαž‰αž›αŸαž‰αžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ?

αž“αŸ…αž–αŸαž›αž‚αž·αžαž’αŸ†αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αž˜αž“αž»αžŸαŸ’αžŸαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‚αž·αžαžαžΆαž–αž½αž€αž‚αŸαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŸαžšαžŸαŸαžšαžœαžΆ αž αžΎαž™αž•αŸ’αž‘αž»αž€αž–αž½αž€αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž·αž‘αŸ’αž’αž·αž‡αžΆαž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αŸ” αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž‡αžΆαž€αžΆαžšαž–αž·αžαž‡αžΆαž‘αžΌαž‘αŸ… αžαžΊαžŽαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž™αž“αŸ’αžαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžšαž–αžΆαžšαžœαžαŸ’αžαž» eBPF αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž•αŸ’αžŸαŸαž„αŸ—αŸ” αž™αž“αŸ’αžαž€αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž’αž“αŸ’αž‘αžΆαž€αŸ‹ BPF LSM αŸ”

αž’αž“αŸ’αž‘αžΆαž€αŸ‹ BPF LSM

αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž―αž€αžšαžΆαž‡αŸ’αž™αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸƒαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž”αŸ’αžšαž–αŸαž“αŸ’αž’ LSM αž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αž“αž·αžαž“αŸƒαž’αž“αŸ’αž‘αžΆαž€αŸ‹αŸ” αž€αžΆαžšαž αŸ…αžαžΆαž˜αž‘αŸ†αž–αž€αŸ‹αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŸαŸ’αžšαžŠαŸ€αž„αž‘αŸ…αž“αžΉαž„αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžšαžΆαž‡αŸ’αž™ αž“αž·αž„αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” LSM αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž‚αŸ†αž“αž·αžαžαŸ’αž˜αžΈαž˜αž½αž™αžŠαŸ‚αž›αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž’αžšαžΌαž”αžΈαž’αžΆαž…αž‡αž½αž™αž‡αŸ€αžŸαžœαžΆαž„αž”αž‰αŸ’αž αžΆαžŠαŸ‚αž›αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž›αžΎαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ”

αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžš αžαžΊαžŽαŸ‚αž›αž˜αžΆαž“αž‘αŸ†αž–αž€αŸ‹αž…αŸ†αž“αž½αž“αž”αŸ’αžšαžΆαŸ†αž–αžΈαžšαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αž αžΎαž™ SELinux αž‚αžΊαž‡αžΆ LSM αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαž–αž½αž€αžœαžΆαŸ”

αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αŸ’αž‘αžΆαž€αŸ‹αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‚αž€αž’αžΆαž„αžαžΊαžŽαŸ‚αž›αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžšαž½αž˜αž˜αžΆαž“/linux/security.h:

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

αž–αž½αž€αž‚αŸαž˜αŸ’αž“αžΆαž€αŸ‹αŸ—αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ–

- security_bpf β€” αž’αŸ’αžœαžΎαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αž”αžΌαž„αž“αŸƒαž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’ BPF αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ”

- security_bpf_map - αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαžΊαžŽαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αž―αž€αžŸαžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ‚αž“αž‘αžΈαŸ”

- security_bpf_prog - αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαžΊαžŽαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αž’αŸ’αž“αž€αž–αž·αž–αžŽαŸŒαž“αžΆαž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αŸ”

β€” security_bpf_map_alloc β€” αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ‚αž“αž‘αžΈ BPF αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž¬αž’αžαŸ‹

- security_bpf_map_free - αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž˜αŸ’αžšαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ‚αž“αž‘αžΈ BPF αžŠαŸ‚αžšαž¬αž‘αŸαŸ”

- security_bpf_prog_alloc β€” αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžŠαŸ‚αžšαž¬αž‘αŸαŸ”

- security_bpf_prog_free - αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž›αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž’αžΆαžαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžŠαŸ‚αžšαž¬αž‘αŸαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžŠαŸ„αž™αž˜αžΎαž›αžƒαžΎαž‰αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡ αž™αžΎαž„αž™αž›αŸ‹αŸ– αž‚αŸ†αž“αž·αžαž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž§αž”αž€αžšαžŽαŸαžŸαŸ’αž‘αžΆαž€αŸ‹αž…αžΆαž”αŸ‹ LSM BPF αž‚αžΊαžαžΆαž–αž½αž€αž‚αŸαž’αžΆαž…αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαžŠαž›αŸ‹αž‚αŸ’αžšαž”αŸ‹αžœαžαŸ’αžαž» eBPF αžŠαŸ„αž™αž’αžΆαž“αžΆαžαžΆαž˜αžΆαž“αžαŸ‚αž’αŸ’αž“αž€αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αžŸαž˜αžŸαŸ’αžšαž”αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αžΎαž€αžΆαž αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžΆαž“αŸ”

αžŸαž„αŸ’αžαŸαž”

αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž“αž»αž„αž‘αŸ†αž αŸ†αž˜αž½αž™αžŸαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž€αžΆαžšαž–αžΆαžšαž“αŸ„αŸ‡αž‘αŸαŸ” αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž“αž·αž„αžαžΆαž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ” αž‡αžΏαž¬αž˜αž·αž“αž‡αžΏ αžœαž·αž’αžΈαž›αŸ’αž’αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αžΆαž“αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αžΊαžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αžšαž·αžαž“αŸƒαž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž–αžΈαž˜αž»αžαžαŸ†αžŽαŸ‚αž„αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž˜αž½αž™αž€αž˜αŸ’αžšαž·αžαž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αž‘αŸαŸ” αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŸαŸ’αž“αžΌαž›αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž„αžΆαžšαžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž™αžΎαž„αž“αžΌαžœαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαžŸαŸ’αžšαž‘αžΆαž”αŸ‹ αž“αž·αž„αž…αŸ†αžŽαž»αž…αž”αŸ‰αŸ‡αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ” αž™αžΎαž„αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆ αž™αžΎαž„αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœαž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αžŠαŸαž›αŸ’αž’αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‡αžΆαžŸαŸ’αžšαž‘αžΆαž”αŸ‹ αž“αž·αž„αžšαž”αŸ€αž”αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž½αž€αž‚αŸαŸ”

αž’αŸ†αž–αžΈαž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’

αž›αŸ„αž€ David Calavera αž‚αžΊαž‡αžΆ CTO αž“αŸ… Netlify αŸ” αž‚αžΆαžαŸ‹αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž‚αžΆαŸ†αž‘αŸ’αžš Docker αž“αž·αž„αž”αžΆαž“αžšαž½αž˜αž…αŸ†αžŽαŸ‚αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž§αž”αž€αžšαžŽαŸ Runc, Go αž“αž·αž„ BCC αž€αŸαžŠαžΌαž…αž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„ Docker αž“αž·αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αŸαž€αžΌαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™ Docker αŸ” David αž˜αžΆαž“β€‹αž…αŸ†αžŽαž„αŸ‹β€‹αžαŸ’αž›αžΆαŸ†αž„β€‹αž…αŸ†αž–αŸ„αŸ‡β€‹αž€αŸ’αžšαžΆαž αŸ’αžœβ€‹αž—αŸ’αž›αžΎαž„ αž αžΎαž™β€‹αžαŸ‚αž„αžαŸ‚β€‹αžŸαž˜αŸ’αž›αžΉαž„β€‹αžšαž€β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαž“β€‹αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–β€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”

Lorenzo Fontana αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž€αŸ’αžšαž»αž˜αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αž“αŸ… Sysdig αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž‚αžΆαžαŸ‹αž•αŸ’αžαŸ„αžαž‡αžΆαž…αž˜αŸ’αž”αž„αž›αžΎ Falco αžŠαŸ‚αž›αž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„ Cloud Native Computing Foundation αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžš αž“αž·αž„αž€αžΆαžšαžšαž€αžƒαžΎαž‰αž—αžΆαž–αž˜αž·αž“αž’αž˜αŸ’αž˜αžαžΆαžαžΆαž˜αžšαž™αŸˆαž˜αŸ‰αžΌαžŒαž»αž›αžαžΊαžŽαŸ‚αž› αž“αž·αž„ eBPF αŸ” αž‚αžΆαžαŸ‹αžŸαŸ’αžšαž›αžΆαž‰αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™ αž”αžŽαŸ’αžαžΆαž‰αž€αŸ†αžŽαžαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž›αžΈαž“αž»αž… αžαžΊαžŽαŸ‚αž› αž“αž·αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

Β» αž–αŸαžαŸŒαž˜αžΆαž“αž›αŸ†αž’αž·αžαž’αŸ†αž–αžΈαžŸαŸ€αžœαž—αŸ… αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ… αž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™
Β» αžαžΆαžšαžΆαž„αž˜αžΆαžαž·αž€αžΆ
Β» αžŸαž˜αŸ’αžšαž„αŸ‹

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Khabrozhiteley αž€αžΆαžšαž”αž‰αŸ’αž…αž»αŸ‡αžαž˜αŸ’αž›αŸƒ 25% αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸαžŽαŸ’αžŽ - Linux

αž“αŸ…αž–αŸαž›αž”αž„αŸ‹αžαŸ’αž›αŸƒαž€αŸ’αžšαžŠαžΆαžŸ αžŸαŸ€αžœαž—αŸ…αž’αŸαž‘αž·αž…αžαŸ’αžšαžΌαž“αž·αž…αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαžαžΆαž˜αž’αŸŠαžΈαž˜αŸ‚αž›αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹