áááşášáááŹá፠Khabro ááąáááŻááşáá°ááťáŹá¸á BPF virtual machine áááş Linux kernel á áĄááąá¸ááźáŽá¸ááŻáśá¸ áĄá áááşáĄáááŻááşá¸ááťáŹá¸áá˛ááž áá áşááŻááźá áşáááşá áááşá¸ááážááşáááşááąáŹáĄááŻáśá¸ááźáŻáážáŻáááş á áá áşáĄááşááťááşááŽááŹááťáŹá¸áĄáŹá¸ ááťááŻáˇáá˝ááşá¸ááťááşááťáŹá¸áááŻáážáŹáá˝áąáááŻááşááźáŽá¸ áĄáážáŻááşáá˝áąá¸ááŻáśá¸ááźáżááŹááťáŹá¸áááŻáááş ááźáąáážááşá¸áááŻááşá áąáááşááźá áşáááşá Kernel á áĄááźáŻáĄáá°ááᯠá áąáŹááˇáşááźááˇáşááźáŽá¸ ááźáŻááźááşáá˝ááşá¸ááśáááˇáş ááááŻááááşááťáŹá¸ááᯠáááşáááŻáˇááąá¸ááááşáááşá¸á kernel áĄáá˝ááşá¸áážá áĄááźá áşáĄááťááşááťáŹá¸ááᯠá áąáŹááˇáşááźááˇáşáááş ááŻááşááᯠááąá¸áááşá¸á á˝áŹ áĄááąáŹááşáĄáááşááąáŹáşáááşá¸áážááˇáş áĄááźáŹá¸áĄááŹááťáŹá¸á á˝áŹááᯠááąáˇááŹáááŻááşáááşááźá áşáááşá David Calavera áážááˇáş Lorenzo Fontana áááŻáˇáááş BPF áááŤááŤáááŻáá˝ááˇáşáááşáá°ááŽááááˇáşáááşá á á˝ááşá¸ááąáŹááşáááş áĄááąáŹááşá¸ááŻáśá¸ááźá áşáĄáąáŹááşá áá˝ááşáááşááťáááşáááşáážáŻá ááŻáśááźáŻáśááąá¸áááŻááşáᏠáááşááĄáááááŹááᯠááťá˛áˇáá˝ááşááŤá - Linux kernel ááĄááźáŻáĄáá°áááŻá áąáŹááˇáşááźááˇáşáááşáážááˇáşááźáŻááźááşáááş BPF áááŻááŻáśá¸ááŤá - kernel ááᯠááźááşáááşááąáŤááşá¸á ááşá¸áááş áááŻáˇáááŻááş á áá áşááᯠááźááşáááşá áááşáááş ááááŻáĄááşáᲠkernel ááźá áşáááşááťáŹá¸ááᯠááŻáśááźáŻáśá á˝áŹ á áąáŹááˇáşááźááˇáşáááş ááŻááşááᯠáááˇáşáá˝ááşá¸ááŤá â Cá Go áááŻáˇáááŻááş Python áá˝ááş áĄáááşááźáąááąáŹ ááŻááşááá°ááŹááťáŹá¸ááᯠááŻáśá¸ááŤá - BPF ááááŻááááşáááááśáááŹáááŻáááŻááşáááŻááşááźááşá¸ááźááˇáşááááşá¸ááťáŻááşááŤá
Linux Kernel ááŻáśááźáŻáśááąá¸á áááşá¸ááĄááşášááŤáááşááťáŹá¸áážááˇáş Seccomp
BPF áááş áááşááźáááşáážáŻá ááŻáśááźáŻáśááąá¸ áááŻáˇáááŻááş ááźááşáážáŻááşá¸ááᯠááááááŻááşá áąáᲠkernel ááᯠáááŻá¸ááťá˛áˇáááş áĄá á˝ááşá¸áááşááąáŹáááşá¸áááşá¸ááᯠááśáˇáááŻá¸ááąá¸ááŤáááşá á¤áĄááźáąáŹááşá¸ááźáąáŹááˇáşá kernel developer ááťáŹá¸áááş Seccomp BPF ááŻáááşá¸ááááźááąáŹ BPF ááááŻááááşááťáŹá¸áážááśáˇáááŻá¸ááąáŹ Seccomp á á áşááŻááşáážáŻááťáŹá¸áááŻáĄááąáŹááşáĄáááşááąáŹáşááźááşá¸ááźááˇáş Seccomp áá˝ááş ááŻááşáááşá¸á ááşáĄááŽá¸ááťááşáážáŻááᯠááźážááˇáşáááşáááş áááşá¸ááááşá áŻáśá á˝ááşá¸áááŹá¸ááᯠáĄááŻáśá¸ááźáŻáááş áĄááźáśááąáŹááşá¸ááźá áşáááşáᯠáá°áááŤáááşá á¤áĄáááşá¸áá˝ááş Seccomp áááş áĄáááşáĄááŹáážááˇáş áááşá¸áááŻáĄááŻáśá¸ááźáŻááźáąáŹááşá¸ááᯠááťá˝ááşáŻááşáááŻáˇáážááşá¸ááźááŤáááşá áááŻáˇááąáŹááş BPF ááááŻááááşááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻá Seccomp filters ááťáŹá¸ááᯠáááşáááŻáˇááąá¸ááááşááᯠááąáˇááŹááááşááźá áşááŤáááşá áááşá¸ááąáŹááşá Linux ááŻáśááźáŻáśááąá¸ modules áĄáá˝ááş kernel áá˝ááşááŤáážáááąáŹ built-in BPF ááťáááşááťáŹá¸ááᯠááźááˇáşáážáŻááŤáááşá
Linux Security Modules (LSM) áááş á áśáááşáážááşááŹá¸áááˇáşááŻáśá áśááźááˇáş áĄááťááŻá¸ááťááŻá¸ááąáŹ ááŻáśááźáŻáśááąá¸ááąáŹáşáááşááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááş áĄááŻáśá¸ááźáŻáááŻááşáááˇáş ááŻááşááąáŹááşááťááşááťáŹá¸áĄá áŻáśááᯠááąáŹááşááśáˇááąá¸áááˇáş áá°ááąáŹááşáá áşááŻááźá áşáááşá LSM ááᯠApparmorá SELinux áážááˇáş Tomoyo áá˛áˇáááŻáˇááąáŹ kernel áááşá¸ááźá áşáá áşáá˝ááş áááŻááşáááŻááşáĄááŻáśá¸ááźáŻáááŻááşááŤáááşá
Linux áá á˝ááşá¸áááşááťáŹá¸ááᯠáá˝áąá¸áá˝áąá¸ááźááşá¸ááźááˇáş á áááşááźááŤá ááŻáˇá
áĄáá˝ááşáˇáĄáááşá¸
Linux áá á˝ááşá¸ááąáŹááşáááŻááşáážáŻááĄáážá áşááŹááážáŹ áááşáááş áĄááťááŻáˇááąáŹááŻááşáááşá¸ááŹáááşáá áşááŻááŻááşááąáŹááşáááş áĄáá˝ááˇáşáá°á¸áááśáááąá¸ááąáŹ ááŻááşáááşá¸á ááşááᯠáá˝ááˇáşááźáŻááťááşááąá¸áááş áááŻáĄááşáááşá áááŻáˇááąáŹáş áááŻáááşáá˝ááşááťááşáĄáá˝ááş suid áááŻáááŻáśá¸áᲠáááŻáˇáááŻááş áĄááźáŹá¸áááşá¸ááźááˇáş ááŻááşáááşá¸á ááşááᯠáĄáá˝ááˇáşáá°á¸ááśááźá áşá áąáááşá áááŻááşáááŻááşáážáŻááźá áşáááŻááşááźáąááᯠááťážáąáŹáˇááťáááşáážááˇáş ááŻááşáááşá¸á ááşáĄááťááŻáˇááᯠááŻááşááąáŹááşáááş áá˝ááˇáşááźáŻááźááşá¸áááşááźá áşáááşá áĽáááŹáĄáŹá¸ááźááˇáşá áááˇáşáĄáááŽááąá¸áážááşá¸áááş áĄáá˝ááˇáşáá°á¸ááśááááşáááşá¸áááŻáá˝ááˇáşáááş áááŻáĄááşááŤáá ááŻááşáááşá¸á ááşááᯠroot áĄááźá áşááŻááşááąáŹááşáááˇáşáĄá áŹá¸ 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áááŻáˇááąáŹáşá ááťá˝ááşáŻááşáááŻáˇáááş root áĄáá˝ááˇáşáá°á¸ááťáŹá¸ááᯠáááąá¸ááąáŹááźáąáŹááˇáşá port ááᯠbinding ááŻááşááąáŹáĄááŤá á¤ááŻááşáááş áĄáážáŹá¸áĄáá˝ááşá¸ááźá áşáá˝áŹá¸áááş-
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1capsh (shell manager) áááş ááááťááąáŹá á˝ááşá¸áááşáĄá áŻáśááźááˇáş shell áá áşááŻááᯠrun áááˇáşááááááŹáá áşááŻááźá áşáááşá
á¤ááá ášá áá˝ááşá ááąáŹáşááźááŹá¸ááźáŽá¸ááźá áşáááˇáşáĄáááŻááşá¸á áĄááźááˇáşáĄáááááŻááşáá˝ááˇáşááťáŹá¸ááᯠááąá¸áááˇáşáĄá áŹá¸á ááááŻááááşáá˝ááşáážáááźáŽá¸ááŹá¸áĄááŹáĄáŹá¸ááŻáśá¸áážááˇáşáĄáá° cap_net_bind_service á á˝ááşá¸áááşááᯠááąá¸ááźááşá¸ááźááˇáş áááşáááş privileged port binding ááᯠáá˝ááˇáşáááŻááşáááşá áááşá¸áááŻááŻááşááąáŹááşáááş ááťá˝ááşáŻááşáááŻáˇáááááŻááááşááᯠ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 ááᯠshell áĄááźá áşáĄááŻáśá¸ááźáŻááŤá
- âcaps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - ááťá˝ááşáŻááşáááŻáˇáááş áĄááŻáśá¸ááźáŻáá°ááᯠááźáąáŹááşá¸áá˛áááş áááŻáĄááşááąáŹááźáąáŹááˇáş (ááťá˝ááşáŻááşáááŻáˇáááş root áĄááąááźááˇáş áááŻááşááąáŹááşáááŻááŤ) cap_net_bind_service ááᯠáááşáážááşááąá¸áááşááźá áşááźáŽá¸ áĄááŻáśá¸ááźáŻáá° ID ááᯠáĄáážááşááááş ááźáąáŹááşá¸áá˛áááŻááşá áąáááşááźá áşáááşá cap_setuid áážááˇáş cap_setgid ááᯠáááşáá°ááž root ááŻááşááŤá
- âkeep=1 â ááťá˝ááşáŻááşáááŻáˇáááş root áĄááąáŹááˇáşáážááźáąáŹááşá¸ááąáŹáĄááŤáá˝ááş áááˇáşáá˝ááşá¸ááŹá¸ááąáŹá á˝ááşá¸áááşááťáŹá¸ááᯠááááşá¸ááááşá¸ááŹá¸áááŻááŤáááşá
- âuser=ânobodyâ â ááááŻááááşááᯠáĄááŻáśá¸ááźáŻáá°áááş áááşáá°ááťáž ááźá áşáááşáááŻááşááąá
- âaddamb=cap_net_bind_service â áĄááźá áşááŻááşáážááźáąáŹááşá¸ááźáŽá¸ááąáŹááş áááşáááŻááşááŹá á˝ááşá¸áááşááťáŹá¸ááᯠáážááşá¸áááşá¸áááşáážááşááŤá
- - -c "./capabilities" - ááááŻááááşááᯠrun áááŻááşááŤá
ááťáááşáááşááŹá¸ááąáŹá á˝ááşá¸áááşááťáŹá¸áááş áááşáážáááááŻááááşá áááşá¸áááŻáˇááᯠexecve() áááŻáĄááŻáśá¸ááźáŻá ááŻááşááąáŹááşáááˇáşáĄá፠áááąá¸ááááŻááááşááťáŹá¸ááž áĄáá˝áąáááşááśáááˇáş áĄáá°á¸á á˝ááşá¸áááşáá áşááťááŻá¸ááźá áşáááşá áááşá ááşáááŻááşáá˝ááˇáşáážáááąáŹ á á˝ááşá¸áááşááťáŹá¸áᏠáááŻáˇáááŻááş ááááşá¸áĄáŹá¸ááźááˇáş áááşáááşá¸ááťááşá á˝ááşá¸áááşááťáŹá¸áĄááźá áş áĄáá˝áąáááşááśáááŻááşááŤáááşá
--caps áá˝áąá¸ááťááşáážáŻáá˝ááş ááŻááşáááŻááşá á˝ááşá¸ááᯠáááşáážááşááźáŽá¸ááąáŹááş +eip á ááŹáááŻáááŻáááŻáááşááᯠáááşáĄáśáˇááźááąááąáááşá á á˝ááşá¸áááşááᯠááŻáśá¸ááźááşáááş á¤áĄááśááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻáááş-
- activated ááźá áşááááş (p);
- áĄááŻáśá¸ááźáŻáááş (á);
- áááąá¸ááŻááşáááşá¸á ááşááťáŹá¸ááźááˇáş áĄáá˝áąáááşááśáááŻááşáááş (i)á
cap_net_bind_service ááᯠáĄááŻáśá¸ááźáŻáááŻááąáŹááźáąáŹááˇáşá áááşá¸ááᯠe áĄááśááźááˇáş ááźáŻááŻááşáááş áááŻáĄááşááŤáááşá áááŻáˇááąáŹááş command áá˝ááş shell áááŻá áááşááŤáááşá áááşá¸áááş ááŻááşááąáŹááşáááŻááşá á˝ááşá¸ binary ááᯠááŻááşááąáŹááşáááşááźá áşááźáŽá¸ áááşá¸ááᯠi áĄááśááźááˇáş áĄáážááşáĄááŹá¸ááźáŻáááş áááŻáĄááşáááşá ááąáŹááşááŻáśá¸áá˝ááşá ááťá˝ááşáŻááşáááŻáˇáááş áĄááşášááŤáááşááᯠáá˝ááˇáşááŹá¸á áąáááŻáááş (ááťá˝ááşáŻááşáááŻáˇáááş UID ááᯠáááźáąáŹááşá¸áá˛áᲠáááşá¸ááᯠp ááźááˇáş ááźáŻááŻááşáá˛áˇáááş)á cap_net_bind_service+eip ááźá áşááŻáśááááşá
ss áááŻáĄááŻáśá¸ááźáŻá ááááşáááŻáááşá á áşááąá¸áááŻááşáááşá á áŹááťááşáážáŹááąáŤáşáá˝ááş áĄáśáááşáá˝ááşááťááźá áşá áąáááş áĄáá˝ááşááᯠáĄáááşá¸áááş áĄáááŻááťáŻáśá¸ááźááŤá ááŻáˇá áááŻáˇááąáŹáş áááşá¸áááş 0 áážáá˝á˛á áĄááźáŹá¸áááşá ááşááąáŹ port áážááˇáş áĄááŻáśá¸ááźáŻáá° ID áááŻááźááááşááźá áşááźáŽá¸á á¤ááá ášá áá˝ááş 65-
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0á¤ááá°ááŹáá˝ááş ááťá˝ááşáŻááşáááŻáˇáááş capsh áááŻáĄááŻáśá¸ááźáŻáááşá áááŻáˇááąáŹáş áááşáááş libcap áááŻáĄááŻáśá¸ááźáŻá shell áááŻááąá¸áááŻááşáááşá áááŻáááŻáááážááááŻááŤáá man 3 libcap áááŻááźááˇáşááŤá
ááááŻááááşáá˝áąááąá¸áá˛áˇáĄááŤá ááąáŹáˇááşáá˛ááąá¸ááŹá¸áá°áᏠááááŻááááşáááşáááşááąááťáááşáážáŹ áááŻáĄááşááąáá˛áˇ áĄááşášááŤáááşáĄáŹá¸ááŻáśá¸ááᯠááźááŻááááááşááŤáá°á¸á áááŻáˇáĄááźááşá á¤áĄááşášááŤáááşááťáŹá¸áááş ááŹá¸áážááşá¸áĄáá áşááťáŹá¸áá˝ááş ááźáąáŹááşá¸áá˛áááŻááşáááşá
ááťá˝ááşáŻááşáááŻáˇáááááŻááááşáá á˝ááşá¸áááşááťáŹá¸ááᯠáááŻáááŻááąáŹááşá¸áá˝ááşá á˝áŹááŹá¸áááşáááşá cap_capable kernel ááŻááşááąáŹááşááťááşáĄáá˝ááş kprobe ááᯠáááşáážááşááąá¸áááˇáş BCC á á˝ááşá¸áááşáážáááąáŹ ááááááŹááᯠááťá˝ááşáŻááşáááŻáˇáá°áááŻááşáááş-
/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 1cap_capable kernel ááŻááşááąáŹááşááťááşáážá one-liner 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 ááźá áşááźáŽá¸á áááşá¸ááᯠáááŻááşáážá kernel áĄáááşá¸áĄááźá áşááŻááşáá˝ááş ááááşá¸ááąáĄááźá áş áááşáážááşááŹá¸áááş-
/* 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 áĄááşááŹááąáˇá áşááᯠáááˇáşáááş áá˝ááşáááşáááˇáşááşáá áşááŻááᯠá áŽá ááşáááşáážááşáááŻááşá áąáááşááźá áşáááşá
ááąáŹááşáĄáááŻááşá¸áá˝ááş á á áşááŻááşááźááşá¸áá˛áˇáááŻáˇááąáŹ áĄááşášááŤáááşááťáŹá¸ááᯠáááşáááŻáˇáĄááŻáśá¸ááźáŻááááşááᯠááźáááŹá¸ááąáŹáşáááşá¸ ááťá˝ááşáŻááşáááŻáˇááááŻááşáááŻááş filter ááťáŹá¸ááᯠááááŻááááşá áá áşáááťáĄááąáŹááşáĄáááşááąáŹáşáááŻááşá áąáááˇáş ááá°ááŽááąáŹáááşá¸áááŹááᯠáĄááŻáśá¸ááźáŻááŹá¸áááşá
Seccomp
Seccomp áááş Secure Computing ááᯠáááŻááşá áŹá¸ááźáŻááźáŽá¸ áĄááťááŻáˇááąáŹ á áá áşááąáŤáşáááŻáážáŻááťáŹá¸ááᯠdeveloper ááťáŹá¸áĄáŹá¸ á á áşááŻááşáá˝ááˇáşááźáŻáááˇáş Linux kernel áá˝ááş áĄááąáŹááşáĄáááşááąáŹáşáááˇáş ááŻáśááźáŻáśááąá¸áĄáá˝ážáŹáá áşááŻááźá áşáááşá Seccomp áááş Linux áážááˇáş áážááşáááŻááşááąáŹáşáááşá¸á áĄááťááŻáˇááąáŹ á áá áşááąáŤáşáááŻáážáŻááťáŹá¸ááᯠá áŽááśáááˇáşáá˝á˛áááŻááşá á˝ááşá¸áááş áááşá¸áááŻáˇáážááˇáş áážááŻááşá¸áážááşááŤá áááŻáááŻááźáąáŹááşá¸áá˝ááşááźááşáá˝ááşáážáá áąáááşá
Seccomp áážááˇáş Linux áĄááşášááŤáááşááťáŹá¸áááş áĄááźááşáĄáážááşááŽá¸áááˇáşáááŻááşáááˇáşáĄááźááş ááťááşá¸áááşáážáŻáážá áşááŻá ááŻáśá¸ááž áĄááťááŻá¸áážáá áąáááş áááźáŹáá áĄáá°ááá˝áĄááŻáśá¸ááźáŻááźáááşá áĽáááŹáĄáŹá¸ááźááˇáşá áááşáááş CAP_NET_ADMIN á á˝ááşá¸áááşááᯠááŻááşáááşá¸á ááşáá áşáᯠááąá¸áááŻááąáŹáşáááşá¸ áááşá¸ááᯠsocket ááťáááşáááşáážáŻááťáŹá¸ááᯠáááşááśáááşá áááşááśááźááşá¸áážááˇáş áááşááśááźááşá¸ 4 á áá áşááąáŤáşáááŻáážáŻááťáŹá¸ááᯠááááşáááŻáˇááźááşá¸ááž áá˝ááˇáşáááźáŻááŤá
Seccomp á á áşááŻááşááźááşá¸áááşá¸áááşá¸áááş SECOMP_MODE_FILTER ááŻááşáá˝ááş ááŻááşááąáŹááşááąááąáŹ BPF á á áşááŻááşáážáŻááťáŹá¸áĄááąáŤáş áĄááźáąááśááŹá¸ááźáŽá¸ á áá áşááąáŤáşáááŻáážáŻ á á áşááŻááşááźááşá¸áĄáŹá¸ áááşáááşááťáŹá¸áĄáá˝ááşáá˛áˇáááŻáˇ áĄááŹá¸áá°áááşá¸áááşá¸ááźááˇáş ááŻááşááąáŹááşááŤáááşá
PR_SET_SECOMP áááşáááşáážáŻáážááááˇáş prctl ááᯠáĄááŻáśá¸ááźáŻá Seccomp á á áşááŻááşáážáŻááťáŹá¸ááᯠáááşááŹá¸áááşá á¤á á áşááŻááşáážáŻááťáŹá¸áááş seccomp_data áá˝á˛áˇá ááşá¸ááŻáśááźááˇáşáááŻááşá áŹá¸ááźáŻááąáŹ Seccomp áááşáááşáá áşááŻá áŽáĄáá˝ááş ááŻááşááąáŹááşáááˇáş BPF ááááŻááááşáááŻáśá áśááźá áşáááşá á¤áá˝á˛áˇá ááşá¸ááŻáśáá˝ááş áĄáááŻá¸áĄááŹá¸ááááŻááŹá á áá áşááąáŤáşáááŻááťáááşáá˝ááş ááááŻáááşááŹáááşá¸áá˝ážááşááťááşáá áşááŻáážááˇáş uint64 áĄááźá áşááąáŹáşááźááąáŹ áĄááťáŹá¸ááŻáśá¸ááźáąáŹááşááŻááąáŹ á áá áşááąáŤáşáááŻáážáŻáááŻááşáᏠáĄááźáąáŹááşá¸ááźááťááşááťáŹá¸ ááŤáááşááŤáááşá
áááşá¸áááş linux/seccomp.h áááŻááşáážá kernel áĄáááşá¸áĄááźá áşááŻááşááž seccomp_data áááşááąáŹááşááŻáśáážááˇáş áá°áááş-
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};á¤áá˝á˛áˇá ááşá¸ááŻáśááž áááşáá˝áąáˇááźááşááááˇáşáĄáááŻááşá¸á ááťá˝ááşáŻááşáááŻáˇáááş á áá áşááąáŤáşáááŻáážáŻá áááşá¸á áĄááźáąáŹááşá¸ááźááťááşááťáŹá¸á áááŻáˇáááŻááş áážá áşááŻááŻáśá¸ááᯠááąáŤááşá¸á ááşááźááşá¸ááźááˇáş á á áşááŻááşáááŻááşááŤáááşá
Seccomp packet áá áşááŻá áŽááᯠáááşááśááážáááźáŽá¸ááąáŹááşá filter áááş ááąáŹááşááŻáśá¸ááŻáśá¸ááźááşááťááşáá áşááŻááťáááşáážááˇáş kernel ááᯠááŹáááşááŻááşááááşáááşá¸á ááąáŹááşááŻáśá¸ááŻáśá¸ááźááşááťááşááᯠááźááşááąá¸áááşáááŻá¸ááťáŹá¸ (áĄááźáąáĄááąááŻááşááťáŹá¸) ááž ááŻááşááąáŹáşáááşá
- SECOMP_RET_KILL_PROCESS - áááşá¸ááźáąáŹááˇáş áááŻááşááąáŹááşáááŻááşááąáŹ á áá áşááąáŤáşáááŻáážáŻááᯠá á áşááŻááşááźáŽá¸ááąáŹááş ááŻááşáááşá¸á ááşáá áşááŻááŻáśá¸ááᯠááťááşááťááşá¸áááşáá áşáááşá
- SECOMP_RET_KILL_THREAD - á¤áĄááŹááźáąáŹááˇáş áááŻááşááąáŹááşáááŻááşááąáŹ á áá áşááąáŤáşáááŻáážáŻáá áşááŻááᯠá á áşááŻááşááźáŽá¸ááąáŹááş ááťááşááťááşá¸áááş áááşáážáá áŹáá˝á˛ááᯠáááşá á˛áááşá
â SECOMP_RET_KILL â SECOMP_RET_KILL_THREAD áĄáá˝ááş ááśáááşá ááąáŹááşááźááşáááŻááşáááşáááŻááşá áąáááş ááťááşááŹá¸áá˛áˇáááşá
- SECOMP_RET_TRAP - á áá áşááąáŤáşáááŻáážáŻááᯠááŹá¸ááźá áşááŹá¸ááźáŽá¸ SIGSYS (Bad System Call) áĄááťááşááźáážáŻááᯠáááşá¸áááŻááąáŤáşáááŻáááˇáşááŻááşáááşá¸ááŹáááşááś ááąá¸áááŻáˇáááşá
- SECOMP_RET_ERRNO - á áá áşááąáŤáşáááŻáážáŻáĄáŹá¸ ááŻááşááąáŹááşááźááşá¸ááážáááŤá áážááˇáş SECOMP_RET_DATA á á áşááŻááşááźááşá¸ááá áşá áááşáá áşáááŻááşá¸ááᯠerrno áááşáááŻá¸áĄááźá áş áĄááŻáśá¸ááźáŻáá°ááąááŹáááŻáˇ áá˝ážá˛ááźáąáŹááşá¸ááąá¸ááŤáááşá áĄáážáŹá¸ááĄááźáąáŹááşá¸áááşá¸ááąáŤáşáá°áááşá ááá°ááŽááąáŹ errno áááşáááŻá¸ááťáŹá¸ááᯠááźááşááąá¸áááşá ááąáŹááşáĄáááŻááşá¸áá˝ááş áĄáážáŹá¸ááśááŤááşááťáŹá¸á áŹáááşá¸ááᯠááąá¸ááŹá¸áááşá
- SECOMP_RET_TRACE - áááŻááŻááşáááşá¸á ááşáááŻááźááˇáşáážáŻáááşáážááˇáş ááááşá¸ááťáŻááşáááşáĄáá˝ááş á áá áşááąáŤáşáááŻáážáŻááᯠááŻááşááąáŹááşáááˇáşáĄá፠ááźáŹá¸ááźááşáááş - PTRACE_O_TRACESECCOMP ááᯠââáĄááŻáśá¸ááźáŻá ptrace ááźáąááŹááśááᯠáĄááźáąáŹááşá¸ááźáŹá¸áááş áĄááŻáśá¸ááźáŻááŤáááşá ááźáąááŹááśááááááŹááᯠáááťáááşáááşááŤá áĄáážáŹá¸áĄáá˝ááşá¸áá áşáᯠááźááşááŹáááşá errno ááᯠ-ENOSYS ááŻáááşáážááşááŹá¸ááźáŽá¸ á áá áşááąáŤáşáááŻáážáŻááᯠááŻááşááąáŹááşáááşáááŻááşááŤá
- SECOMP_RET_LOG - á áá áşááąáŤáşáááŻáážáŻááᯠááźáąáážááşá¸ááźáŽá¸ áĄááąáŹááˇáşáááşááŹá¸áááşá
- SECOMP_RET_ALLOW - á áá áşááąáŤáşáááŻáážáŻááᯠáááŻá¸áážááşá¸á á˝áŹ áá˝ááˇáşááźáŻááŹá¸áááşá
ptrace áááş tracee ááŻááąáŤáşááąáŹ ááŻááşáááşá¸á ááşáá áşááŻáá˝ááş ááźáąááŹááśááášáááŹá¸ááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááş á áá áşááąáŤáşáááŻáážáŻááźá áşááźáŽá¸ ááŻááşáááşá¸á ááşáááŻááşááąáŹááşáážáŻááᯠá áąáŹááˇáşááźááˇáşááááşá¸ááťáŻááşáááŻááşá á˝ááşá¸áážááááşá ááźáąááŹááśááááŻááááşáááş ááŻááşááąáŹááşáážáŻááᯠááááááąáŹááşááąáŹááş áá˝ážááşá¸áááŻá¸áááŻááşááźáŽá¸ tracee á áážááşááŹááşá áŹáááşá¸ááťáŹá¸ááᯠáá˝ááşá¸ááśáááŻááşáááşá Seccomp áĄááźáąáŹááşá¸áĄááŹáá˝ááş SECOMP_RET_TRACE áĄááźáąáĄááąááŻááşááźááˇáş áĄá ááťááŻá¸ááąáŹáĄá፠ptrace ááᯠáĄááŻáśá¸ááźáŻáááşá áááŻáˇááźáąáŹááˇáş tracer áááş á áá áşááąáŤáşáááŻáážáŻááᯠááŻááşááąáŹááşááźááşá¸ááž ááŹá¸ááŽá¸áááŻááşááźáŽá¸ áááşá¸ááááŻááşáááŻááş logic ááᯠáĄááąáŹááşáĄáááşááąáŤáşááźááşá¸ááž ááŹá¸ááŽá¸áááŻááşááŤáááşá
Seccomp áĄáážáŹá¸ááťáŹá¸
ááśáááşááśááŤá Seccomp áážááˇáşáĄááŻááşááŻááşááąá ááşá áááşáááş SECOMP_RET_ERRNO áĄááťááŻá¸áĄá áŹá¸ááźááşáááşáááŻá¸ááźááˇáşáááşáážááşááŹá¸ááąáŹ áĄááťááŻá¸ááťááŻá¸ááąáŹáĄáážáŹá¸áĄáá˝ááşá¸ááťáŹá¸áááŻááźáŻáśáá˝áąáˇáááááˇáşáááşá áĄáážáŹá¸áĄáá˝ááşá¸áá áşááŻááᯠááááşá¸áááŻáˇáááşá seccomp á áá áşááąáŤáşáááŻáážáŻáááş 1 áĄá áŹá¸ -0 áááŻáˇ ááźááşáá˝áŹá¸ááŤáááşá
áĄáąáŹááşá፠áĄáážáŹá¸ááťáŹá¸ ááźá áşáááŻááşáááş-
- EACCESS - ááąáŤáşáááŻáá°áĄáŹá¸ á áá áşááąáŤáşáááŻáážáŻááźáŻááŻááşáááş áá˝ááˇáşáááźáŻááŤá áááşá¸áá˝ááş CAP_SYS_ADMIN áĄáá˝ááˇáşáá°á¸ááťáŹá¸ ááážáááąáŹááźáąáŹááˇáş áááŻáˇáááŻááş no_new_privs ááᯠprctl ááᯠáĄááŻáśá¸ááźáŻá ááááşáážááşááŹá¸ááąáŹááźáąáŹááˇáş ááźá áşáááşáááş (ááťá˝ááşáŻááşáááŻáˇ á¤áĄááźáąáŹááşá¸ááᯠááąáŹááşááž áá˝áąá¸áá˝áąá¸ááŤáááş)á
â EFAULT â áá˝ááşáá˛áˇááąáŹ áĄááźáąáŹááşá¸ááźááťááşááťáŹá¸ (seccomp_data áááşááąáŹááşááŻáśáážá args) áá˝ááş áážááşáááşááąáŹááááşá ᏠááážáááŤá
â EINVAL â á¤ááąááŹáá˝ááş áĄááźáąáŹááşá¸áááşá¸ááąá¸ááŻáážááááŻááşáááş-
- áááşáážááá˝á˛áˇá ááşá¸ááŻáśáá˝ááş kernel ááž ááąáŹááşá¸áááŻááŹá¸ááąáŹ ááŻááşááąáŹááşááťááşááᯠááááážá áááŻáˇáááŻááş áááśáˇáááŻá¸ááŤá
- ááąáŹááşá¸áááŻááŹá¸ááąáŹ ááŻááşááąáŹááşááťááşáĄáá˝ááş áááşáážááşááŹá¸ááąáŹ áĄááśááťáŹá¸áááş ááážááşáááşááŤá
-operation áá˝ááş BPF_ABS ááŤáááşáááşá áááŻáˇááąáŹáş seccomp_data áá˝á˛áˇá ááşá¸ááŻáśá áĄáá˝ááşáĄá áŹá¸áááş ááťáąáŹáşáá˝ááşáááŻááşááąáŹ áááşáážááşááŹá¸ááąáŹ offset áážááˇáş ááźáżááŹááťáŹá¸áážáááŤáááşá
- filter áááŻáˇááąá¸áááŻáˇááąáŹ áá˝ážááşááźáŹá¸ááťááşáĄááąáĄáá˝ááşáááş áĄááťáŹá¸ááŻáśá¸áááş ááťáąáŹáşáá˝ááşááąááŤáááşá
â ENOMEM â ááááŻááááşáááŻááŻááşááąáŹááşáááş áááŻáśááąáŹááşááąáŹáážááşááŹááşá
- EOPNOTSUPP - ááŻááşááąáŹááşááťááşáááş SECCOMP_GET_ACTION_AVAIL ááźááˇáş ááŻááşááąáŹááşááťááşááᯠááážááááŻááşáááşáᯠáá˝ážááşááźááąáŹáşáááşá¸ kernel áááş áĄááźáąáŹááşá¸ááźááťááşááťáŹá¸áá˝ááş ááźááşááŹááźááşá¸ááᯠáááśáˇáááŻá¸ááŤá
â ESRCH â áĄááźáŹá¸á áŽá¸ááźáąáŹááşá¸ááᯠá ááˇáşááşááŻááşááąáŹáĄá፠ááźáżááŹáá áşáᯠááźá áşáá˝áŹá¸áá˛áˇáááşá
- ENOSYS - SECOMP_RET_TRACE ááŻááşááąáŹááşááťááşáážááˇáş áá˝á˛ááŹá¸áááˇáş ááźáąááŹááś ááážáááŤá
prctl áááş áĄááŻáśá¸ááźáŻáá°-áĄáŹááŹáááááŻááááşáĄáŹá¸ ááŻááşáááşá¸á ááşáá áşááŻá ááŽá¸ááźáŹá¸áážáŻááąáŹááˇáşááťáŹá¸ááźá áşáááˇáş byte endiannessá thread namesá secure computation mode (Seccomp)á privilegesá Perf events á áááşáááŻáˇáá˛áˇáááŻáˇááąáŹ ááŻááşáááşá¸á ááşáá áşááŻáĄáŹá¸ áááŻááşáá˝ááşáááş áá˝ááˇáşááźáŻáááˇáş á áá áşááąáŤáşáááŻáážáŻáá áşááŻááźá áşáááşá
Seccomp áááş áááˇáşáĄáá˝ááş sandbox áááşá¸áááŹáá áşááŻáá˛áˇáááŻáˇ áááşáááąáŹáşáááşá¸ áááşá¸áááş áááŻááşááŤá Seccomp áááş áĄááŻáśá¸ááźáŻáá°ááťáŹá¸áĄáŹá¸ sandbox ááášáááŹá¸áá áşááŻááᯠáááşááŽá¸áááŻááşá áąáááˇáş áĄááŻáśá¸áááşáážáŻáá áşááŻááźá áşáááşá ááᯠSeccomp á áá áşááąáŤáşáááŻáážáŻááž áááŻááşáááŻááşááąáŤáşááąáŹ á á áşááŻááşáážáŻááᯠáĄááŻáśá¸ááźáŻá áĄááŻáśá¸ááźáŻáá° áĄááźááşáĄáážááşáĄááťááŻá¸ááźáŻáááˇáş ááááŻááááşááťáŹá¸ááᯠáááşáááŻáˇáááşááŽá¸ááŹá¸áááşááᯠááźááˇáşááźááŤá ááŻáˇá
BPF Seccomp Filter áĽáááŹ
á¤ááąááŹáá˝ááş á áąáŹá áąáŹá áá˝áąá¸áá˝áąá¸áá˛áˇáááˇáş ááŻááşááąáŹááşááťááşáážá áşááŻááᯠááąáŤááşá¸á ááşáááşá¸ááᯠááźáááŤáááşá
â ááťá˝ááşáŻááşáááŻáˇáááş Seccomp BPF ááááŻááááşááᯠááąá¸ááŹá¸áááşááźá áşááźáŽá¸á ááŻáśá¸ááźááşááťááşááťáŹá¸ááąáŤáşáá°áááşá ááá°ááŽááąáŹááźááşááŻááşááťáŹá¸ááŤáááˇáş á á áşááŻááşáážáŻáá áşááŻáĄááźá áş áĄááŻáśá¸ááźáŻáááşááźá áşáááşá
â prctl ááᯠáĄááŻáśá¸ááźáŻá filter ááᯠáááşááŤá
áŚá¸á á˝áŹ áááşáááş á áśá áŹááźááˇáşáááŻááşáážááˇáş Linux kernel áááŻáˇááž ááąáŤááşá¸á áŽá¸ááťáŹá¸ áááŻáĄááşáááş-
#include <errno.h>
#include <linux/audit.h>
#include <linux/bpf.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <unistd.h>á¤áĽáááŹááᯠáááźááŻá¸á áŹá¸ááŽá kernel ááᯠCONFIG_SECCOMP áážááˇáş CONFIG_SECOMP_FILTER ááŻáááşáážááşááŹá¸ááźááşá¸ááźááˇáş kernel ááᯠá áŻá ááşá¸ááŹá¸ááźáąáŹááşá¸ ááąááťáŹáááŤáááşá áĄááŻááşááŻááşáááˇáşá ááşáá˝ááş á¤áá˛áˇáááŻáˇá á áşááąá¸áááŻááşáááş-
cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP
ááťááşááŻááşáááş áážá áşáááŻááşá¸ install_filter ááŻááşááąáŹááşááťááşááźá áşáááşá ááááĄáááŻááşá¸áá˝ááş ááťá˝ááşáŻááşáááŻáˇá BPF á á áşááŻááşááźááşá¸áááŻááşáᏠáá˝ážááşááźáŹá¸ááťááşááťáŹá¸á áŹáááşá¸ááŤáážááááşá
static int install_filter(int nr, int arch, int error) {
struct sock_filter filter[] = {
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, arch))),
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3),
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, nr))),
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1),
BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)),
BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),
}; áááşá¸áá˝ážááşááťááşááťáŹá¸ááᯠlinux/filter.h áááŻááşáá˝ááş áááşáážááşááŹá¸ááąáŹ BPF_STMT áážááˇáş BPF_JUMP áááşááááŻááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻá áááşáážááşááŹá¸áááşá
áá˝ážááşááźáŹá¸ááťááşááťáŹá¸áážááááˇáşáá˝áŹá¸ááźááŤá
ááŻáˇá
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_dataá arch))) - á áá áşáááş BPF_LD ááž BPF_W á ááŹá¸ááŻáśá¸ááŻáśá áśááźááˇáş ááŻááşáááŻá¸ááźáŽá¸ ááŻááşáááŻá¸ááąááŹáááş ááŻáśááą áĄáąáŹáˇááşáááş BPF_ABS áá˝ááş áááşáážááááşá
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_Ká arch, 0, 3) - BPF_JEQ ááᯠáĄááŻáśá¸ááźáŻá BPF_K accumulator áááşáááŻá¸áááş arch áážááˇáş ááŽááťážááźááşá¸áážáááážá á á áşááąá¸áááşá áááŻáˇáááŻááťážááşá arch áážááˇáş ááááŻááşááŽááąáŹááźáąáŹááˇáş áĄáážáŹá¸áá áşááŻáááŻáá áşáááş offset 0 (á¤ááá ášá áá˝ááş) ááž ááŻááşáááşáááşá
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - BPF_LD á ááŻáśááą áĄáąáŹáˇááşáááşáá˝ááşááŤáážáááąáŹ á áá áşááąáŤáşáááŻáážáŻááśááŤááşááźá áşáááˇáş BPF_W áá°ááąáŹ á ááŹá¸ááŻáśá¸ááŻáśá áśááźááˇáş BPF_LD ááž á áŻá ááşá¸áááŻááşááŤáááşá
â BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) â á áá áşááąáŤáşáááŻáážáŻááśááŤááşáĄáŹá¸ nr variable ááááşáááŻá¸áážááˇáş áážááŻááşá¸áážááşáááşá áááşá¸áááŻáˇáááş áá°ááŽááŤáá ááąáŹááşáá˝ážááşááźáŹá¸ááťááşáááŻáˇ áááşáá˝áŹá¸áᏠá áá áşááąáŤáşáááŻáážáŻááᯠááááşááŤá áááŻáˇáááŻááşááŤá á áá áşááąáŤáşáááŻáážáŻááᯠ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 áĄááŹááášáᯠáááŻáˇáááŻááş JIT compiled C ááááŻááááşáĄá áŹá¸ áá˝ážááşááźáŹá¸ááťááşááťáŹá¸á áŹáááşá¸ááᯠáĄáááşááźáąáŹááˇáş áĄááŻáśá¸ááźáŻáááźáąáŹááşá¸ áááşáĄáśáˇááźááąááąáááşáááŽáĄáá˝ááş áĄááźáąáŹááşá¸ááźááťááş áážá áşááŻáážáááŤáááşá
⢠ááááŚá¸á á˝áŹá Seccomp áááş cBPF (ááášááááş BPF) áááŻáĄááŻáśá¸ááźáŻááźáŽá¸ eBPF áááŻááşáá˛á áááŻáááŻáááşáážáŹ- áááşá¸áá˝ááş á áŹáááşá¸áá˝ááşá¸áážáŻááťáŹá¸ááážáááąáŹáşáááşá¸ ááá°ááŹáá˝ááşáá˝áąáˇáááŻááşáááˇáşáĄáááŻááşá¸ ááąáŹááşááŻáśá¸áá˝ááşááťááşáážáŻááááşááᯠááááşá¸áááşá¸áááşáĄáá˝ááş á áŻá ááşá¸áážáŻáá áşááŻááŹááźá áşáááşá
⢠ááŻáááá Seccomp áááş BPF áá˝ážááşááźáŹá¸ááťááşááťáŹá¸á array áá áşááŻááŽáááŻáˇ áá˝ážááşááźááťááşááᯠáááşááśááźáŽá¸ áĄááźáŹá¸ááŹááťážááážáááŤá ááťá˝ááşáŻááşáááŻáˇáĄááŻáśá¸ááźáŻááŹá¸ááąáŹ áááşááááŻááťáŹá¸áááş ááááŻááááşááŹááťáŹá¸áĄáá˝ááş áĄáááşááźáąááąáŹáááşá¸áááşá¸ááźááˇáş á¤áá˝ážááşááźáŹá¸ááťááşááťáŹá¸ááᯠáááşáážááşááŹáá˝ááş áá°ááŽááąá¸ááŤáááşá
á¤á ááşá¸ááąá¸áá˝á˛áĄáŹá¸ ááŹá¸áááşáááş ááąáŹááşáááşáĄáá°áĄáᎠáááŻáĄááşááŤáá áá°ááŽááąáŹáĄááŹááᯠááŻááşááąáŹááşáááˇáş 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 áá˝á˛áˇá ááşá¸ááŻáśáážá filter ááŻááşááᯠáááşáážááşááźáŽá¸ááąáŹááşá ááŻááşáážááˇáş filter á áá˝ááşááťááşááŹá¸ááąáŹ áĄáážááşááŤáážáááąáŹ sock_fprog ááᯠáááşáážááşáááş áááŻáĄááşáááşá ááąáŹááşáááŻááşá¸áá˝ááş ááŻááşááąáŹááşáááş ááŻááşáááşá¸á ááşááᯠááźáąááŹáááşáĄáá˝ááş á¤ááąááŹáá˝á˛áˇá ááşá¸ááŻáśáááş áááŻáĄááşáááş-
struct sock_fprog prog = {
.len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
.filter = filter,
};install_filter ááŻááşááąáŹááşááťááşáá˝ááş ááŻááşá ááŹáá áşááŻáᏠááťááşááąáŹáˇáááş - ááááŻááááşááᯠáá°áˇááŹááŹáá° áááşááŤá áááşá¸áááŻááŻááşááąáŹááşáááşá ááťá˝ááşáŻááşáááŻáˇáááş PR_SET_SECOMP áĄáŹá¸ ááŻáśááźáŻáśááąáŹáá˝ááşááťá°ááŹááŻááşáááŻáˇáááşááąáŹááşáááş áá˝áąá¸ááťááşáážáŻáá áşááŻáĄááźá áş prctl áááŻáĄááŻáśá¸ááźáŻáááşá áááŻáˇááąáŹááş sock_fprog áĄááťááŻá¸áĄá áŹá¸á prog variable áá˝ááşááŤáážáááąáŹ SECOMP_MODE_FILTER áááŻáĄááŻáśá¸ááźáŻá 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 ááᯠáĄááŻáśá¸ááźáŻáááşáááŻáĄááşááźáŽá¸ áááŻáˇááźáąáŹááˇáş áááąá¸ááŻááşáááşá¸á ááşááťáŹá¸áááş áááşá¸áááŻáˇááááááťáŹá¸áááş áááŻáááŻáĄáá˝ááˇáşáá°á¸ááťáŹá¸ááážááááˇáşáĄááźáąáĄááąááᯠáážáąáŹááşáážáŹá¸áááş áááŻáĄááşááŤáááşá á¤áĄááŹááźááˇáşá ááťá˝ááşáŻááşáááŻáˇáááş root ááŻááşáááŻááşáá˝ááˇáşááážááᲠáĄáąáŹááşá፠prctl ááąáŤáşáááŻáážáŻááťáŹá¸ááᯠinstall_filter ááŻááşááąáŹááşááťááşáá˝ááş ááźáŻááŻááşáááŻááşááŤáááşá
áááŻááťá˝ááşáŻááşáááŻáˇáááş install_filter ááŻááşááąáŹááşááťááşáááŻááąáŤáşáááŻáááŻááşáááşá X86-64 ááááŻááŹáážááˇáşáááşá ááşááąáŹ á áŹááąá¸á áá áşááąáŤáşáááŻáážáŻááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠááááşáááŻáˇááźáŽá¸ ááźááŻá¸á áŹá¸áážáŻáĄáŹá¸ááŻáśá¸ááᯠááááşáááŻáˇáááˇáş áá˝ááˇáşááźáŻááťááşáá áşáᯠááąá¸áááŻááşááŤá á á áşááŻááşáážáŻááᯠáááˇáşáá˝ááşá¸ááźáŽá¸ááąáŹááşá ááťá˝ááşáŻááşáááŻáˇáááş ááááĄááźááşá¸áĄááŻáśááᯠáĄááŻáśá¸ááźáŻá áááşáááşááŻááşááąáŹááşáááş-
int main(int argc, char const *argv[]) {
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
perror("prctl(NO_NEW_PRIVS)");
return 1;
}
install_filter(__NR_write, AUDIT_ARCH_X86_64, EPERM);
return system(argv[1]);
}á áááŻááşááźá ááŻáˇá ááťá˝ááşáŻááşáááŻáˇáááááŻááááşááᯠá áŻá ááşá¸áááşáĄáá˝ááş ááťá˝ááşáŻááşáááŻáˇáááş áĄáá°á¸áá˝áąá¸ááťááşá ááŹááťáŹá¸áááŤáᲠmain.c áááŻááşááᯠááźáŻá áŻááŹáá˝ááş clang áááŻáˇáááŻááş gcc áá áşááŻááŻááᯠáĄááŻáśá¸ááźáŻáááŻááşáááşá
clang main.c -o filter-writeáážááşááŹá¸ááŹá¸áááˇáşáĄáááŻááşá¸á ááťá˝ááşáŻááşáááŻáˇáááş ááááŻááááşáážá áááˇáşáá˝ááşá¸áážáŻááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠááááşáááŻáˇááŹá¸ááŤáááşá áááşá¸áááŻá ááşá¸áááşáááşáĄáá˝ááş áááşáááş áá áşááŻááŻááᯠááŻááşááąá¸áááˇáş ááááŻááááşáá áşáᯠáááŻáĄááşáááş - ls áááş ááąáŹááşá¸áá˝ááşááąáŹ áááŻááşá áŹá¸áážááşáá áşáŚá¸ááźá áşááŻáśááááşá á¤áááşáážáŹ áá°á ááźáŻáá°ááąáˇáážááááş-
ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Apr 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Apr 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Apr 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Apr 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Apr 28 21:08 main.c
áĄáśáˇááźáá˝ááş! á¤áááşáážáŹ ááťá˝ááşáŻááşáááŻáˇá wrapper ááááŻááááşááᯠáĄááŻáśá¸ááźáŻá ááŻáśááášááŹááşáá°áááş- ááťá˝ááşáŻááşáááŻáˇáááş ááááĄááźááşá¸áĄááŻáśáĄááźá áş ááťá˝ááşáŻááşáááŻáˇ á ááşá¸áááşáááŻááąáŹ ááááŻááááşááᯠáááŻá¸áážááşá¸á á˝áŹ ááťáąáŹáşááźááşáááş-
./filter-write "ls -la"áá˝ááşááťááşááąáŹáĄááŤá á¤ááááŻááááşáááş ááŻáśá¸ááĄááťááşá¸áážáŽá¸ááąáŹ output áááŻááŻááşááąá¸áááşá áááşáááŻáˇáááşáááŻá áąááŹáá°á ááťá˝ááşáŻááşáááŻáˇáááş áĄáááşáĄááŹááźá áşááťááşááąáááşáááŻááźááˇáşáááş ááźáąááŹáááŻááŻáśá¸áááŻááşáááş-
strace -f ./filter-write "ls -la"áĄááŻááşáááááşáááş áĄáá˝ááşáááŻááąáŹááşá¸ááąáŹáşáááşá¸ áááşá¸áážááˇáşáááşáááŻááşááąáŹáĄáááŻááşá¸áááş ááťá˝ááşáŻááşáááŻáˇááźááşáááşááŹá¸áááˇáşáĄáááŻááşá¸áááş EPERM áĄáážáŹá¸ááźááˇáş áážááşáááşá¸ááťáŹá¸ááᯠááááşáááŻáˇááŹá¸ááźáąáŹááşá¸ ááźááááşá áááŻáááŻáááşáážáŹ program áááş write system call áááŻáááşááąáŹááşáááááąáŹááźáąáŹááˇáş áááşáááˇáşáĄááŹáááŻááťáž output áááąá¸ááŤáá
[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 ááááŻááááşááťáŹá¸áĄááźáąáŹááşá¸áá˝áąá¸ááąáŹáĄááŤá áá°áĄááťáŹá¸á áŻá áááşá¸áááŻáˇááᯠáááŻá¸áááŻá¸áážááşá¸áážááşá¸ááąá¸ááźáŽá¸ á áŽááśáááˇáşáá˝á˛áá°áĄáá˝ááˇáşáá°á¸ááťáŹá¸ááźááˇáş áááşáááşáᯠáááşááźáááşá á¤ááąáŹáşááźááťááşáááş ááąáá°ááťáĄáŹá¸ááźááˇáş áážááşááąáŹáşáááşá¸á kernel áááş áĄáááˇáşáĄááťááŻá¸ááťááŻá¸áá˝ááş eBPF áĄááŹááášááŻááťáŹá¸ááᯠááŹáá˝ááşáááş ááášáááŹá¸áĄá áŻáá áşááŻááᯠáĄááąáŹááşáĄáááşááąáŹáşáááşá á¤ááášáááŹá¸ááťáŹá¸ááᯠBPF LSM ááąáŹááşááťáąáŹááşááťáŹá¸ááŻááąáŤáşáááşá
BPF LSM ááąáŹááşááťáąáŹááşááťáŹá¸
á áá áşááźá áşáááşááťáŹá¸ááᯠááááŻááŹ-áĄáážáŽáĄáááŻáááşá¸ááąáŹá áąáŹááˇáşááźááˇáşáážáŻááąá¸áááşáĄáá˝ááş LSM áááş ááąáŹááşááťáąáŹááşááťáŹá¸ááááąáŹáááŹá¸áááŻáĄááąáŹááşáĄáááşááąáŹáşáááşá ááťáááşááąáŤáşáááŻáážáŻáá áşááŻáááş á áá áşááąáŤáşáááŻáážáŻáá áşááŻáážááˇáş áááşá¸áááŹáĄá áááşáá°ááąáŹáşáááşá¸ á áá áşáá˝ááşáááşááźáŽá¸ áĄááźáąááśáĄááąáŹááşáĄáĄáŻáśáážááˇáş ááąáŤááşá¸á ááşááŹá¸áááşá LSM áááş ááá°ááŽááąáŹ ááááŻááŹááťáŹá¸áááŻááşáᏠá áá áşááąáŤáşáááŻáážáŻááťáŹá¸áážááˇáş áááŻááşáá˝ááşááŹáá˝ááş ááźáŻáśáá˝áąáˇáááąáŹ ááźáżááŹááťáŹá¸ááᯠáážáąáŹááşáážáŹá¸áááŻááşá áąáááˇáş abstraction layer áááş áĄáá°áĄááĄáá áşááᯠááąá¸ááŤáááşá
á áŹááąá¸ááťáááşáá˝ááşá kernel áá˝ááş BPF ááááŻááááşááťáŹá¸áážááˇáşáááşá ááşááąáŹááťáááşááŻáá áşááŻáážáááźáŽá¸ SELinux áááş áááşá¸áááŻáˇáááŻáĄááąáŹááşáĄáááşááąáŹáşáááˇáşáá áşááŻáááşá¸ááąáŹ built-in LSM ááźá áşáááşá
ááąáŹááşááťáąáŹááşááťáŹá¸áĄáá˝ááş áááşá¸ááźá áşááŻááşáááş áááŻááşáážá kernel áá áşáááşáá˝ááş áááşáážááááş include/linux/security.h:
extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);áááşá¸áááŻáˇááᯠáá˝ááşááťááşááźááşá¸ áĄáááˇáşáĄááŽá¸ááŽá¸áá˝ááş áááşá¸áááŻáˇááᯠááąáŤáşááąáŤáşáááş-
â security_bpf â áá˝ááşááťááşááŹá¸ááąáŹ BPF á áá áşááąáŤáşáááŻáážáŻááťáŹá¸á áááŚá¸á á áşááąá¸áážáŻááᯠááŻááşááąáŹááşáááşá
- security_bpf_map - kernel áááş ááźáąááŻáśáĄáá˝ááş áááŻááşááąáŹáşááźááťááşáá áşááŻááᯠááźááşááąá¸áááˇáşáĄá፠á á áşááąá¸áááşá
- security_bpf_prog - kernel áááş eBPF ááááŻááááşáĄáá˝ááş áááŻááşááąáŹáşááźááťááşáá áşááŻááᯠááźááşááąá¸áááˇáşáĄá፠á á áşááąá¸áááşá
â security_bpf_map_alloc â BPF ááźáąááŻáśááťáŹá¸áĄáá˝ááşá¸ ááŻáśááźáŻáśááąá¸áĄáá˝ááşááᯠáĄá ááźáŻááŹá¸ááźááşá¸ áážááááážá á á áşááąá¸áááş á
- security_bpf_map_free - ááŻáśááźáŻáśááąá¸áĄáá˝ááşááᯠBPF ááźáąááŻáśááťáŹá¸áĄáá˝ááşá¸ áážááşá¸áááşá¸ááźááşá¸áážáááážá á á áşááąá¸áááş á
â security_bpf_prog_alloc â ááŻáśááźáŻáśááąá¸áĄáá˝ááşááᯠBPF ááááŻááááşááťáŹá¸áĄáá˝ááşá¸ áĄá ááźáŻááŹá¸ááźááşá¸ áážááááážá á á áşááąá¸áááşá
- security_bpf_prog_free - ááŻáśááźáŻáśááąá¸áĄáá˝ááşááᯠBPF ááááŻááááşááťáŹá¸áĄáá˝ááşá¸ áážááşá¸áááşá¸ááźááşá¸áážáááážá á á áşááąá¸áááşá
ááᯠá¤áĄááŹáĄáŹá¸ááŻáśá¸áááŻááźááşááťážááş ááťá˝ááşáŻááşáááŻáˇááŹá¸áááşááŤáááş- LSM BPF ááźáŹá¸ááźááşááááááŹááťáŹá¸ááąáŹááşáá˝ááşáážá áĄáá°áĄááážáŹ áááşá¸áááŻáˇáááş eBPF áĄááŹááášááŻáááŻááşá¸áĄáá˝ááş áĄááŹáĄáá˝ááşááąá¸áááŻááşááźáŽá¸ áááˇáşááťáąáŹáşááąáŹáĄáá˝ááˇáşáá°á¸ááťáŹá¸ááážááá°ááťáŹá¸áᏠáááşááťáŹá¸áážááˇáş ááááŻááááşááťáŹá¸áá˝ááş ááŻááşááąáŹááşááťááşááťáŹá¸ááᯠááŻááşááąáŹááşáááŻááşááźáąáŹááşá¸ ááąááťáŹá áąááŤáááşá
áĄááťááşá¸ááťáŻááş
ááŻáśááźáŻáśááąá¸áááş áááşááŹáá˝ááşáááŻáááˇáşáĄááŹáĄáŹá¸ááŻáśá¸áĄáá˝ááş áĄáá˝ááşáĄá áŹá¸-áĄáśáááşáá˝ááşááťááźá áşá áąáááˇáşáááşá¸áááşá¸ááźááˇáş áááşáĄááąáŹááşáĄáááşááąáŹáşáááŻááşááąáŹ áĄááŹáááŻááşááŤá ááá°ááŽááąáŹáĄáááˇáşááťáŹá¸áážááˇáş ááá°ááŽááąáŹáááşá¸áááşá¸ááťáŹá¸ááźááˇáş á áá áşááťáŹá¸ááᯠááŹáá˝ááşáááŻááşá áąáááş áĄááąá¸ááźáŽá¸ááŤáááşá ááŻáśáááşááźá áşá áąá áááŻáśáááşááźá áşá áąá á áá áşáá áşááŻááᯠááŻáśááźáŻáśáĄáąáŹááşááźáŻááŻááşáááş áĄááąáŹááşá¸ááŻáśá¸áááşá¸áááşá¸áážáŹ ááá°ááŽááąáŹááŹáá°á¸ááťáŹá¸ááž ááŹáá˝ááşáážáŻáĄáááˇáşááťáŹá¸ááᯠá áŻá ááşá¸ááŹá¸ááźááşá¸ááźá áşáááşá áááŻáˇáážáᏠáĄáááˇáşáá áşááŻáááŻáśááźáŻáśááąá¸ááᯠááťážáąáŹáˇááťááźááşá¸ááźááˇáş á áá áşáá áşááŻááŻáśá¸ááᯠáááşááąáŹááşáá˝ááˇáşáááźáŻáááŻááşááąá áááşá developer ááťáŹá¸áááş ááá°ááŽááąáŹ áĄáá˝ážáŹááťáŹá¸áážááˇáş áááá˝áąáˇáážáŻááąááŹááťáŹá¸ááᯠááąá¸ááąáŹááşáááş ááąáŹááşá¸áá˝ááşááąáŹáĄááŻááşááťáŹá¸ ááŻááşááąáŹááşáá˛áˇáááşá áĄáá˝ážáŹááťáŹá¸áááş áĄáááşáĄáá˝ážáŹááťáŹá¸ááźá áşááźáŽá¸ áááşá¸áááŻáˇáážááˇáşááŻááşááąáŹááşáááş BPF ááááŻááááşááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻááŻáśáááŻáˇááᯠááąáŹááşá¸á á˝áŹááŹá¸áááşáááąáŹááąáŤááşáááŻááşáááşáᯠááťážáąáŹáşáááˇáşááŤáááşá
á áŹááąá¸áááŹááťáŹá¸áĄááźáąáŹááşá¸
David Calavera Netlify áá˝ááş CTO ááźá áşáááşá áá°áááş Docker ááśáˇáááŻá¸áá°ááŽáážáŻáá˝ááş áĄááŻááşááŻááşáá˛áˇááźáŽá¸ Runcá Go áážááˇáş BCC ááááááŹááťáŹá¸áĄááźááş áĄááźáŹá¸ááąáŹ open source áááąáŹááťááşááťáŹá¸ááᯠááśáˇáááŻá¸áá°ááŽáá˛áˇáááşá Docker áááąáŹááťááşááťáŹá¸áážááˇáş Docker ááááşáĄááşááąáá áá áşá áá˝áśáˇááźááŻá¸áááŻá¸áááşáážáŻáĄáá˝ááş áá°áááŻááşááąáŹááşáážáŻááźáąáŹááˇáş áá°ááááťáŹá¸áááşá David áááş ááŽá¸ááąáŹááşááááşáá áşááťáŹá¸ááᯠáĄáá˝ááşá áááşáĄáŹá¸áááşáááşááźáŽá¸ á á˝ááşá¸ááąáŹááşáááşááᯠáĄááąáŹááşá¸ááŻáśá¸ááźá áşáĄáąáŹááş áĄááźá˛áážáŹáá˝áąááąááŤáááşá
Lorenzo Fontana Kernel module áážááˇáş eBPF áážááááˇáş áá˝ááşááááşáᏠruntime ááŻáśááźáŻáśááąá¸áážááˇáş áá˝á˛áá˝á˛ááťááşááťáŹá¸ááᯠáááážááááŻááşá áąáááş ááśáˇáááŻá¸ááąá¸ááąáŹ Cloud Native Computing Foundation áááąáŹááťááş Falco ááᯠáĄááááĄáŹááŻáśá ááŻááşááŹá¸áááˇáş Sysdig áážá open source áĄáá˝á˛áˇáá˝ááş áĄááŻááşááŻááşááŤáááşá áá°áááş ááźááˇáşááąáááˇáşá áá áşááťáŹá¸á ááąáŹáˇááşáá˛ááşáááşáážááşááŹá¸ááąáŹ áá˝ááşáááşááťáááşáááşáážáŻá Linux kernel áážááˇáş á á˝ááşá¸ááąáŹááşáááşáááŻááşá¸áá˝á˛ááźááşá¸á áááşááźáŹáážáŻááťáŹá¸ááᯠá áááşáĄáŹá¸áááşáááşáá°ááźá áşáááşá
Âť á
áŹáĄáŻááşáážááˇáşáááşáááşááąáŹ áĄááąá¸á
áááşáĄááťááşáĄáááşááťáŹá¸ááᯠáĄáąáŹááşááŤáááˇáşáá˝ááş ááźááˇáşáážáŻáááŻááşááŤáááşá
Âť
Âť
Khabrozhiteley áá°áá˝ááşáááŻáĄááŻáśá¸ááźáŻá 25% ááťážáąáŹáˇá áťáąá¸áĄáá˝ááş - Linux áááŻ
á
áŹáĄáŻááşá á
áášáá°ááŹá¸áážááşá¸ááᯠáá˝áąááąá¸ááťáąááźáŽá¸ááŤá áĄáŽáááşááá˝ááşáá
áşá
áŹáĄáŻááşááᯠáĄáŽá¸ááąá¸ááşááźááˇáş ááąá¸áááŻáˇáááşááźá
áşáááşá
source: www.habr.com
