แแแแแ แฏแแแ แฎแแแ แแก แแแกแแฎแแแแแแ! BPF แแแ แขแฃแแแฃแ แ แแแแฅแแแ Linux-แแก แแแ แแแแก แแ แ-แแ แแ แงแแแแแแ แแแแจแแแแแแแแแ แแแแแแแแแขแแ. แแแกแ แกแฌแแ แแ แแแแแงแแแแแ แกแแจแฃแแแแแแก แแแกแชแแแก แกแแกแขแแแแก แแแแแแ แแแก แแแแแแ แฎแแ แแแแแแ แแ แแแแแญแ แแก แงแแแแแแ แ แแฃแแ แแ แแแแแแแแแช แแ. แแฅแแแ แจแแแกแฌแแแแแ แ แแแแ แแแฌแแ แแ แแ แแแ แแแแแ, แ แแแแแแแช แแแแแขแ แแแแแแ แแ แชแแแแแ แแแ แแแแก แฅแชแแแแก, แ แแแแ แฃแกแแคแ แแฎแแ แแแแแ แแแ แแแแ แแแ แแแจแ แแแแแแแแแแก แแแแแขแแ แแแแแกแแแแก แแ แแ แแแแแ แกแฎแแ. แแแแแ แแแแแแแ แ แแ แแแ แแแชแ แคแแแขแแแ แแแแแฎแแแ แแแแแ แแแแแแแแแ BPF-แแก แซแแแ. แแแแคแแ แแแแแ แแฅแแแแ แชแแแแ แจแแกแ แฃแแแแแก แแแขแแแแแแชแแแก, แฅแกแแแแก, แฃแกแแคแ แแฎแแแแแก แจแแกแแฎแแ. - แแแแแแงแแแแ BPF Linux-แแก แแแ แแแแก แฅแชแแแแก แแแแแขแแ แแแแแกแ แแ แจแแกแแชแแแแแแ. - แจแแแขแแแแ แแแแ แแแ แแแแก แแแแแแแแแแก แฃแกแแคแ แแฎแแ แแแแแขแแ แแแแแกแแแแก, แแแ แแแแก แฎแแแแฎแแแ แแแแแแแแชแแแก แแ แกแแกแขแแแแก แแแแแขแแแ แแแแก แแแ แแจแ. - แแแแแแงแแแแ แแแกแแฎแแ แฎแแแแแ แแแแแก แแแแแแแแแแ C, Go แแ Python-แจแ. - แแแฆแแ แแแแขแ แแแ BPF แแ แแแ แแแแก แกแแกแแชแแชแฎแแ แชแแแแแก แคแแแแแ.
Linux Kernel Security, แแแกแ แแแฎแแกแแแแแแแแแ แแ Seccomp
BPF แฃแแ แฃแแแแแงแแคแก แแแ แแแแก แแแคแแ แแแแแแก แแซแแแแ แแแแก แกแขแแแแแฃแ แแแแก, แฃแกแแคแ แแฎแแแแแก แแ แกแแฉแฅแแ แแก แจแแฌแแ แแแก แแแ แแจแ. แแ แแแแแแแ, แแแ แแแแก แแแแแแแแแ แแแแ แฉแแแแแแแก, แ แแ แแแ แแ แแแแ แแฅแแแแแแ แแแกแ แแ แแแแแคแแ แแแแแแแก แแแแแงแแแแแ Seccomp-แจแ แแ แแชแแกแแก แแแแแแชแแแก แแแกแแฃแแฏแแแแกแแแแแ Seccomp แคแแแขแ แแแแก แแแแแ แแแแ, แ แแแแแแแช แแฎแแ แแแญแแ แแแแ BPF แแ แแแ แแแแแแ, แแกแแแ แชแแแแแแ แ แแแแ แช Seccomp BPF. แแ แแแแจแ แฉแแแ แแแแฎแกแแแ แ แ แแ แแก Seccomp แแ แ แแแแ แแแแแแงแแแแแ. แจแแแแแ แแฅแแแ แจแแแกแฌแแแแแ แแฃ แ แแแแ แฃแแแ แแแฌแแ แแ Seccomp แคแแแขแ แแแ BPF แแ แแแ แแแแแแก แแแแแงแแแแแแ. แแแแก แจแแแแแ, แฉแแแ แแแแแแฎแแแแแ แฉแแจแแแแแฃแ BPF แแแแแแแก, แ แแแแแแแช แจแแแแก แแแ แแแจแ Linux แฃแกแแคแ แแฎแแแแแก แแแแฃแแแแแกแแแแก.
Linux แฃแกแแคแ แแฎแแแแแก แแแแฃแแแแ (LSM) แแ แแก แฉแแ แฉแ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแก แคแฃแแฅแชแแแแแก แแ แแแแแแแแแก, แ แแแแแแช แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แฃแกแแคแ แแฎแแแแแก แกแฎแแแแแกแฎแแ แแแแแแแแแก แกแขแแแแแ แขแแแแแฃแแ แฌแแกแแ แแแแกแแฎแแ แชแแแแแแแแ. LSM แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แฃแจแฃแแแแ แแแ แแแแก แฌแงแแ แแก แฎแแจแ, แ แแแแ แแชแแ Apparmor, SELinux แแ Tomoyo.
แแแแแฌแงแแ Linux-แแก แจแแกแแซแแแแแแแแแแก แแแแฎแแแแแ.
แจแแกแแซแแแแแแแแแ
Linux-แแก แจแแกแแซแแแแแแแแแแก แแ แกแ แแแแจแ แแแแแแแ แแแแก, แ แแ แแฅแแแ แฃแแแ แแแแแแญแแ แแ แแแ แแแแแแแแ แแแฃแ แแ แแชแแกแก แแแ แแแแฃแแ แแแแแแแแแก แจแแกแ แฃแแแแแก แแแแแ แแแ, แแแแ แแ แแ แแแแแแ 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 1capsh (แญแฃแ แแแก แแแแแฏแแ แ) แแ แแก แแแกแขแ แฃแแแแขแ, แ แแแแแแช แแฌแแ แแแแแก แญแฃแ แแก แแแ แแแแฃแแ แจแแกแแซแแแแแแแแแแก แแแแ แแแแ.
แแ แจแแแแฎแแแแแจแ, แ แแแแ แช แฃแแแ แแฆแแแแจแแแ, แกแ แฃแแ 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 แแ แคแแฅแขแแแ แแแแ แแแแฎแแแ แแแแแก ID-แแก แจแแชแแแแก แจแแกแแซแแแแแแแแก. root to nobody, แแแ แซแแ cap_setuid แแ cap_setgid.
- โkeep=1 โ แแแกแฃแ แก แจแแแแแแ แฉแฃแแแ แแแแแกแขแแแแ แแแฃแแ แจแแกแแซแแแแแแแแแ root แแแแแ แแจแแแแ แแแแแกแแแแกแแก.
- โuser=โแแ แแแแโ โ แแ แแแ แแแแก แแแจแแแแแก แกแแแแแแ แแแแฎแแแ แแแแแ แแฅแแแแ แแ แแแแ.
- โaddamb=cap_net_bind_service โ แแแแงแแแแ แจแแกแแแแแแกแ แจแแกแแซแแแแแแแแแแก แแแกแฃแคแแแแแแ root แ แแแแแแแแ แแแแแกแแแแก แจแแแแแ.
- - -c "./capabilities" - แฃแแ แแแแ แแแฃแจแแแ แแ แแแ แแแ.
แแแแแแจแแ แแแฃแแ แจแแกแแซแแแแแแแแแ แแ แแก แกแแแชแแแแฃแ แ แขแแแแก แจแแกแแซแแแแแแแแแ, แ แแแแแแแช แแแแแแแแ แแแแแ แแแแฆแแแ แจแแแแแแแแ แแ แแแ แแแแแแก แแแแ , แ แแแแกแแช แแแแแแแแ แ แแ แแแ แแแ แแแ แแฎแแ แชแแแแแแก execve() แแแแแงแแแแแแ. แแฎแแแแ แแก แจแแกแแซแแแแแแแแแ, แ แแแแแแแช แแแแแแแ แแฃแแแ แแกแแชแแ แแแฃแแ, แแ แกแฎแแ แกแแขแงแแแแแ แ แแ แแแฅแแแ, แ แแแแ แช แแแ แแแแก แจแแกแแซแแแแแแแแแ, แจแแแซแแแแ แแแแแแแแ แแแแแ แแแแแแแแแก.
แแฅแแแ แแแแแ แแแแแขแแ แแกแแแ แ แแก แแแจแแแแก +eip แแคแชแแแจแ --caps แจแแกแแซแแแแแแแแก แแแแแแแแแก แจแแแแแ. แแก แแ แแจแแแ แแแแแแงแแแแแ แแแแก แแแกแแแแแแแ, แ แแ แจแแกแแซแแแแแแแแแ:
-แฃแแแ แแงแแก แแแแฅแขแแฃแ แแแฃแแ (p);
-แฎแแแแแกแแฌแแแแแแ แแแแแกแแงแแแแแแแ (e);
- แจแแแซแแแแ แแแแแแแแ แแแแแ แแแแแแแแแก แแแแจแแแก แแ แแชแแกแแแแ (i).
แแแแแแแแ แฉแแแ แแแแแแ แแแแแแแงแแแแ cap_net_bind_service, แแก แฃแแแ แแแแแแแแแ e แแ แแจแแ. แจแแแแแ แฉแแแ แแแแแฌแงแแแ แแแ แกแก แแ แซแแแแแแจแ. แแก แแแฃแจแแแแก แแ แแแแ แจแแกแแซแแแแแแแแแก แแ แฉแแแ แฃแแแ แแแแแแจแแแ แแก i แแ แแจแแ. แแ แแแแแก, แฉแแแ แแแแแแ, แ แแ แคแฃแแฅแชแแ แฉแแ แแฃแแ แแงแแก (แแก แแแแแแแแแ UID-แแก แจแแชแแแแก แแแ แแจแ) แ. แ แแแแ แช แฉแแแก cap_net_bind_service+eip.
แแฅแแแ แจแแแแซแแแแ แจแแแแแฌแแแ แจแแแแแ ss-แแก แแแแแงแแแแแแ. แแแแแ แจแแแแแแแแแ แแแแแแแแแแ, แ แแแ แแแแ แแแก แแแแ แแแ, แแแแ แแ แแก แแฉแแแแแแก แแกแแชแแ แแแฃแ แแแ แขแก แแ แแแแฎแแแ แแแแแก ID-แก แแแ แแ 0-แแกแ, แแ แจแแแแฎแแแแแจแ 65:
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0แแ แแแแแแแแจแ แฉแแแ แแแแแแแงแแแแ capsh, แแแแ แแ แแฅแแแ แจแแแแซแแแแ แแแฌแแ แแ แญแฃแ แแ 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 kernel แคแฃแแฅแชแแแจแ:
bpftrace -e
'kprobe:cap_capable {
time("%H:%M:%S ");
printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
}'
| grep -i capabilitiesแแก แแแแแแ แแกแแแแกแ แ แแ, แแฃ แฉแแแแ แแ แแแ แแแแก แจแแกแแซแแแแแแแแแ แฉแแ แแฃแแแ kprobe-แแก แจแแแแแ:
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 10 1แแแฎแฃแแ แกแแแขแ แแ แแก แจแแกแแซแแแแแแแแแ, แ แแช แแ แแชแแกแก แกแญแแ แแแแ, แแ แ แแแแแ แแก แจแแแแแ แแแแชแแแก แแ แแแฃแแแขแแ แฃแ แแแแแแแแแก, แฉแแแ แแฎแแแแแ แงแแแแ แแ แแแฃแแแขแแ แฃแ แจแแแแฌแแแแแก แแ แแแแแก แกแแญแแ แ แจแแกแแซแแแแแแแแแก แแฃแแแขแแก แแ แแจแแ (แแแแ แแแแแแแแแแจแ) แแแงแแแแแฃแแ 1. แจแแกแแซแแแแแแแแแ. แฉแแแ แแแแแแขแแ แแกแแแก แแ แแก CAP_NET_BIND_SERVICE, แแก แแแแกแแแฆแแ แฃแแแ, แ แแแแ แช แแฃแแแแแ แแแ แแแแก แแแแแก แคแแแแจแ include/uapi/linux/ability.h แแแแแขแแคแแแแขแแ แแ 10:
/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */
#define CAP_NET_BIND_SERVICE 10<source lang="go">แจแแกแแซแแแแแแแแแ แฎแจแแ แแ แฉแแ แแฃแแแ แแแจแแแแแก แแ แแก แแแแขแแแแแ แแแแกแแแแก, แ แแแแ แแชแแ 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 แแแจแแแแก Secure Computing-แก แแ แแ แแก แฃแกแแคแ แแฎแแแแแก แคแแแ, แ แแแแแแช แแแแแ แแแแแ Linux-แแก แแแ แแแจแ, แ แแแแแแช แแแแแแแแแ แแแก แกแแจแฃแแแแแแก แแซแแแแก แแแคแแแขแ แแ แแแ แแแแฃแแ แกแแกแขแแแฃแ แ แแแ แแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ Seccomp แจแแกแแซแแแแแแแแแแ แจแแแแ แแแฃแแแ Linux-แแแ, แแแ แแแแฃแแ แกแแกแขแแแฃแ แ แแแ แแแแก แแแ แแแแก แฃแแแ แ แแแก แแแแ แแ แฃแคแ แ แแแฅแแแแก แฎแแแก แแแแแแ แจแแแแ แแแแ.
Seccomp แแ Linux แคแฃแแฅแชแแแแ แแ แแ แแก แฃแ แแแแ แแแแแแแ แแชแฎแแแ แแ แฎแจแแ แแ แแแแแแงแแแแแ แแ แแแ แแ แแแ แแแแแแแแ แกแแ แแแแแแแแกแแแแก. แแแแแแแแแ, แจแแแซแแแแ แแกแฃแ แแแ แแ แแชแแกแก แแแแแแญแแ CAP_NET_ADMIN แจแแกแแซแแแแแแแ, แแแแ แแ แแ แแแกแชแแ แฃแคแแแแ, แแแแฆแแก แกแแแแขแแก แแแแจแแ แแแ, แแแแแแแแก แแแฆแแแแกแ แแ แแแฆแแแแก4 แกแแกแขแแแฃแ แ แแแ แแแ.
Seccomp แคแแแขแ แแชแแแก แแแแแแ แแคแฃแซแแแแ BPF แคแแแขแ แแแก, แ แแแแแแแช แแฃแจแแแแแ SECCOMP_MODE_FILTER แ แแแแแจแ แแ แกแแกแขแแแฃแ แ แแแ แแก แคแแแขแ แแชแแ แฎแแ แชแแแแแแแ แแกแแแ, แ แแแแ แช แแแแแขแแแแกแแแแก.
Seccomp แคแแแขแ แแแ แแขแแแ แแแแ prctl-แแก แแแแแงแแแแแแ PR_SET_SECCOMP แแแแ แแชแแแ. แแก แคแแแขแ แแแ แแฆแแแแ BPF แแ แแแ แแแแก แคแแ แแแก, แ แแแแแแช แจแแกแ แฃแแแแฃแแแ แแแแแแฃแแ Seccomp แแแแแขแแกแแแแก, แ แแแแแแช แฌแแ แแแแแแแแแแ seccomp_data แกแขแ แฃแฅแขแฃแ แแ. แแก แกแขแ แฃแฅแขแฃแ แ แจแแแชแแแก แกแแชแแแแแ แ แแ แฅแแขแแฅแขแฃแ แแก, แแแฉแแแแแแแแก แแ แแชแแกแแ แแก แแแกแขแ แฃแฅแชแแแแแ แกแแกแขแแแฃแ แ แแแแแซแแฎแแแแก แแ แแก แแ แแแฅแกแแแฃแ แแฅแแก แกแแกแขแแแฃแ แ แแแแแซแแฎแแแแก แแ แแฃแแแแขแก, แแแแแฎแแขแฃแแ uint64.
แแกแ แแแแแแงแฃแ แแแ seccomp_data แกแขแ แฃแฅแขแฃแ แ แแแ แแแแก แฌแงแแ แแก แแแแแแแ linux/seccomp.h แคแแแแจแ:
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 แคแแแขแ แแก แแแแ แฃแแแแแก แแแแจแแแแแแแแก แแแฌแแแ แแแแแแชแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแก, แ แแแแ แช errno แแแแจแแแแแแแ. แจแแชแแแแแก แแแแแแฌแแแแ แแแแแแแแแ แแแแแแแแแแ แ, แแ แฃแแแแแ แกแฎแแแแแกแฎแแ แจแแชแแแแแก แแแแจแแแแแแแ. แจแแชแแแแแแแก แแแแ แแแแก แกแแ แแแชแแแฃแแแ แจแแแแแ แแแแงแแคแแแแแแจแ.
- SECCOMP_RET_TRACE - แแแแแแงแแแแแ ptrace tracer-แแก แจแแกแแขแงแแแแแแแแแ - PTRACE_O_TRACESECCOMP, แ แแแ แฉแแแญแ แแก แกแแกแขแแแฃแ แ แแแ แ แแ แแ แแชแแกแแก แกแแแแฎแแแแ แแ แแแกแแแแแขแ แแแแแแแ. แแฃ แขแ แแกแแ แ แแ แแ แแก แแแแแแจแแ แแแฃแแ, แจแแชแแแแ แแ แฃแแแแแ, errno แแแงแแแแแฃแแแ -ENOSYS-แแ แแ แกแแกแขแแแฃแ แ แแแ แ แแ แจแแกแ แฃแแแแแ.
- SECCOMP_RET_LOG - แกแแกแขแแแฃแ แ แแแ แ แแแแแแ แแแฃแแแ แแ แแแ แแแแกแขแ แแ แแแฃแแแ.
- SECCOMP_RET_ALLOW - แกแแกแขแแแฃแ แ แแแ แ แฃแแ แแแแ แแแจแแแแฃแแแ.
ptrace แแ แแก แกแแกแขแแแฃแ แ แแแแแซแแฎแแแ แขแ แแกแแ แแแแก แแแฅแแแแแแแแแก แแแแแ แแแแก แแ แแชแแกแจแ, แ แแแแแกแแช แแฌแแแแแ tracee, แแ แแชแแกแแก แจแแกแ แฃแแแแแก แแแแแขแแ แแแแแกแ แแ แแแแขแ แแแแก แจแแกแแซแแแแแแแแ. แแแแแแคแแแแชแแแก แแ แแแ แแแแก แจแแฃแซแแแ แแคแแฅแขแฃแ แแ แแแแแแแ แแแแฎแแแแแก แจแแกแ แฃแแแแแแ แแ แจแแชแแแแแก แแแแแแคแแแแชแแแก แแแฎแกแแแ แแแแก แ แแแแกแขแ แแแ. Seccomp-แแก แแแแขแแฅแกแขแจแ, ptrace แแแแแแงแแแแแ SECCOMP_RET_TRACE แกแขแแขแฃแกแแก แแแแแ แแแจแแแแแกแแก, แแกแ แ แแ, แขแ แแกแแ แก แจแแฃแซแแแ แฎแแแ แจแแฃแจแแแแก แกแแกแขแแแแก แแแ แแก แจแแกแ แฃแแแแแก แแ แแแแแฎแแ แชแแแแแก แกแแแฃแแแ แ แแแแแแ.
Seccom-แแก แจแแชแแแแแแ
แแ แแแแแ แ Seccomp-แแแ แแฃแจแแแแแกแแก แจแแฎแแแแแแ แกแฎแแแแแกแฎแแ แจแแชแแแแแแก, แ แแแแแแแช แแแแแขแแคแแชแแ แแแฃแแแ SECCOMP_RET_ERRNO แขแแแแก แแแแ แฃแแแแฃแแ แแแแจแแแแแแแแ. แจแแชแแแแแก แจแแกแแขแงแแแแแแแแแ, seccomp แกแแกแขแแแฃแ แ แแแ แ 1-แแก แแแชแแแแ แแแแ แฃแแแแแ -0-แแ.
แจแแกแแซแแแแแแแ แจแแแแแแ แจแแชแแแแแแ:
- EACCESS - แแแแแแแขแก แแ แแฅแแก แฃแคแแแแ แแแแแฎแแ แชแแแแแก แกแแกแขแแแฃแ แ แแแ แ. แแก แฉแแแฃแแแแ แแ แฎแแแแ แแแแก แแแแ, แ แแ แแแก แแ แแฅแแก CAP_SYS_ADMIN แแ แแแแแแแแแแ แแ no_new_privs แแ แแ แแก แแแงแแแแแฃแแ prctl-แแก แแแแแงแแแแแแ (แแแแแ แแแแแแแแแแแ แแแกแแฃแแ แแแ);
โ EFAULT โ แแแฆแแแฃแ แแ แแฃแแแแขแแแก (args seccomp_data แกแขแ แฃแฅแขแฃแ แแจแ) แแ แแฅแแ แกแฌแแ แ แแแกแแแแ แแ;
โ EINVAL โ แแฅ แแแฎแ แแแแแแ แจแแแซแแแแ แแงแแก:
-แแแแฎแแแแแแ แแแแ แแชแแ แฃแชแแแแแ แแ แแ แแ แแก แแฎแแ แแแญแแ แแแ แแแ แแแแก แแแแ แแแแแแแแ แ แแแแคแแแฃแ แแชแแแจแ;
- แแแแแแแแฃแแ แแ แแจแแแ แแ แแแฅแแแแแแก แแแแฎแแแแแแ แแแแ แแชแแแกแแแแก;
-แแแแ แแชแแ แแแแชแแแก BPF_ABS, แแแแ แแ แแ แแก แแ แแแแแแแแ แแแแแแแแฃแ แแคแกแแขแแแ แแแแแแจแแ แแแแ, แ แแแแแแช แจแแแซแแแแ แแฆแแแแขแแแแแแก seccomp_data แกแขแ แฃแฅแขแฃแ แแก แแแแแก;
-แคแแแขแ แแ แแแแแชแแแฃแแ แแแกแขแ แฃแฅแชแแแแแก แ แแแแแแแแ แแฆแแแแขแแแ แแแฅแกแแแฃแแก;
โ ENOMEM - แแ แแ แแก แกแแแแแ แแกแ แแแฎแกแแแ แแแ แแ แแแ แแแแก แจแแกแแกแ แฃแแแแแแ;
- EOPNOTSUPP - แแแแ แแชแแแ แแแฃแแแแ, แ แแ SECCOMP_GET_ACTION_AVAIL แฅแแแแแแ แแงแ แฎแแแแแกแแฌแแแแแ, แแแแ แแ แแแ แแแ แแ แฃแญแแ แก แแฎแแ แก แแ แแฃแแแแขแแแจแ แแแแ แฃแแแแแก;
โ ESRCH โ แฌแแ แแแแจแแ แแ แแแแแแ แกแฎแแ แแแแแแแก แกแแแฅแ แแแแแแชแแแกแแก;
- ENOSYS - SECCOMP_RET_TRACE แแแฅแแแแแแแแ แแ แแ แแก แแแแแแ แแแฃแแ แขแ แแกแแ แ.
prctl แแ แแก แกแแกแขแแแฃแ แ แแแ แ, แ แแแแแแช แกแแจแฃแแแแแแก แแซแแแแก แแแแฎแแแ แแแแแแ แกแแแ แชแแก แแ แแแ แแแแก แแแแแแฃแแแ แแแ แแแแฎแแแแแก (แแแแงแแแแก แแ แแแแฆแแก) แแ แแชแแกแแก แแแแแ แแขแฃแแ แแกแแแฅแขแแแ, แ แแแแ แแชแแ แแแแขแแก แกแแกแฃแกแขแ, แซแแคแแแแก แกแแฎแแแแแ, แฃแกแแคแ แแฎแ แแแแแแแแแก แ แแแแแ (Seccomp), แแ แแแแแแแแแแ, Perf แแแแแแแแแ แแ แ.แจ.
Seccomp แจแแแซแแแแ แแแแแฉแแแแแ, แ แแแแ แช sandbox แขแแฅแแแแแแแ, แแแแ แแ แแก แแกแ แแ แแ แแก. 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),
}; แแแกแขแ แฃแฅแชแแแแ แแแงแแแแแฃแแแ 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, แแแฆแ, 0, 3) - แแแแฌแแแแก BPF_JEQ-แแก แแแแแงแแแแแแ, แแ แแก แแฃ แแ แ แแ แฅแแขแแฅแขแฃแ แแก แแแแจแแแแแแแ BPF_K แแแฃแแฃแแแขแแ แแก แแฃแแแแแจแ แแแฆแแก แขแแแ. แแฃ แแกแแ, แแแแแฎแขแแแ แแคแกแแขแแ 0 แจแแแแแ แแแกแขแ แฃแฅแชแแแแ, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แแแแแฎแขแแแ แแคแกแแขแแ 3 (แแ แจแแแแฎแแแแแจแ) แจแแชแแแแแก แแแแแกแแขแแแแ, แ แแแแแ แแแฆแ แแ แแแแฎแแแแ.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - แแขแแแ แแแแ แแ แแ แแแแแแ BPF_LD-แแแ แกแแขแงแแแก BPF_W แกแแฎแแ, แ แแแแแแช แแ แแก แกแแกแขแแแแก แแแ แแก แแแแแ แ, แ แแแแแแช แจแแแชแแแก BPF_ABS-แแก แคแแฅแกแแ แแแฃแ แแคแกแแขแจแ.
โ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) โ แแแแ แแแก แกแแกแขแแแแก แแแ แแก แแแแแ แก nr แชแแแแแแก แแแแจแแแแแแแแกแแแ. แแฃ แแกแแแ แแแแแแแ แแ, แแแแแแแก แจแแแแแ แแแกแขแ แฃแฅแชแแแแ แแ แแแแแ แแแแก แกแแกแขแแแฃแ แแแ แก, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แแแแแก แ แแแแก แกแแกแขแแแฃแ แแแ แก SECCOMP_RET_ALLOW-แแ.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)) - แฌแงแแแขแก แแ แแแ แแแแก BPF_RET-แแ แแ แจแแแแแแ แฌแแ แแแฅแแแแก แจแแชแแแแแก SECCOMP_RET_ERRNO แ แแชแฎแแแ err แชแแแแแ.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - แฌแงแแแขแก แแ แแแ แแแแก BPF_RET-แแ แแ แกแแจแฃแแแแแแก แแซแแแแก แกแแกแขแแแฃแ แ แแแ แแก แจแแกแ แฃแแแแแก SECCOMP_RET_ALLOW-แแก แแแแแงแแแแแแ.
SECCOMP แแ แแก CBPF
แจแแแซแแแแ แแแแแขแแ แแกแแแ, แ แแขแแ แแแแแแงแแแแแ แแแกแขแ แฃแฅแชแแแแแก แกแแ แแแแแแแแ แแแฃแแ ELF แแแแแฅแขแแก แแ JIT แแแแแแแแ แแแฃแแ C แแ แแแ แแแแก แแแชแแแแ.แแแแก แแ แ แแแแแแ แแ แกแแแแแก.
โข แแแ แแแ แ แแแจแ, Seccomp แแงแแแแแก cBPF-แก (แแแแกแแแฃแ แ BPF) แแ แแ แ eBPF-แก, แ แแช แแแจแแแแก: แแแก แแ แแฅแแก แ แแแแกแขแ แแแ, แแแแ แแ แแฅแแก แแฎแแแแ แแแฃแแฃแแแขแแ แ แแแแ แแแแแแแ แแจแแแแก แจแแแแแแก แจแแกแแแแฎแแ, แ แแแแ แช แแก แฉแแแก แแแแแแแแจแ.
โข แแแแ แ, Seccomp แแฆแแแก แแแฉแแแแแแแแก BPF แแแกแขแ แฃแฅแชแแแแแก แแแกแแแแก แแแ แแแแแ แแ แกแฎแแ แแ แแคแแ แก. แแแแ แแแแ, แ แแแแแแแช แฉแแแ แแแแแแแงแแแแ, แฃแแ แแแแ แแแแฎแแแ แแแ แแ แแแกแขแ แฃแฅแชแแแแแก แแแแกแแแฆแแ แแจแ แแ แแแ แแแแกแขแแแแกแแแแก แแแกแแฎแแ แฎแแแแแ แแแแ.
แแฃ แแญแแ แแแแแ แแแขแ แแแฎแแแ แแแ แแ แแกแแแแแแแก แแแกแแแแแแ, แแแแแฎแแแแ แคแกแแแแแแแแ, แ แแแแแแช แแแแแแก แแแแแแแก:
if (arch != AUDIT_ARCH_X86_64) {
return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;Socket_filter แกแขแ แฃแฅแขแฃแ แแจแ แคแแแขแ แแก แแแแแก แแแแกแแแฆแแ แแก แจแแแแแ, แแฅแแแ แฃแแแ แแแแกแแแฆแแ แแ sock_fprog, แ แแแแแแช แจแแแชแแแก แแแแก แแ แคแแแขแ แแก แแแแแแแแแ แกแแแ แซแแก. แแก แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แ แกแแญแแ แแ, แ แแแแ แช แแ แแฃแแแแขแ แแ แแชแแกแแก แแแแแแแแแแแ แแแกแแจแแแแแ แแแแแชแฎแแแแแแกแแแแก:
struct sock_fprog prog = {
.len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
.filter = filter,
};install_filter แคแฃแแฅแชแแแจแ แ แฉแแแ แแฎแแแแ แแ แแ แ แแ - แฉแแขแแแ แแแ แแแแแ แแ แแแ แแแ! แแแแกแแแแแก แฉแแแ แแแงแแแแแ prctl-แก แแ แแแฆแแแ PR_SET_SECCOMP-แก, แ แแแแ แช แฃแกแแคแ แแฎแ แแแแแแแแแก แ แแแแแจแ แจแแกแแกแแแแแแ. แจแแแแแ แฉแแแ แแแฃแแแแแแ แ แแแแแก, แ แแ แฉแแขแแแ แแแก แคแแแขแ แ SECCOMP_MODE_FILTER-แแก แแแแแงแแแแแแ, แ แแแแแแช แจแแแชแแแก sock_fprog แขแแแแก prog แชแแแแแจแ:
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
แแจแแแแแแ แแ! แแ, แ แแแแ แแแแแแงแฃแ แแแ แฉแแแแ wrapper แแ แแแ แแแแก แแแแแงแแแแแ: แฉแแแ แฃแแ แแแแ แแแแแแชแแแ แแ แแแ แแแแก, แ แแแแแก แแแแแชแแแช แแแแแแ, แ แแแแ แช แแแ แแแแ แแ แแฃแแแแขแ:
./filter-write "ls -la"แ แแแแกแแช แจแแกแ แฃแแแแแ, แแก แแ แแแ แแแ แแฌแแ แแแแแก แกแ แฃแแแแ แชแแ แแแ แแแแแแแแแแก. แแฃแแชแ, แฉแแแ แจแแแแแซแแแ แแแแแแแงแแแแ แกแขแ แแกแ, แ แแแ แแแแแแแฎแแ แ แ แฎแแแแ:
strace -f ./filter-write "ls -la"แกแแแฃแจแแแก แจแแแแแ แแแแจแแแแแแแแแ แจแแแชแแ แแ, แแแแ แแ แแแกแ แจแแกแแแแแแกแ แแแฌแแแ แแฉแแแแแแก, แ แแ แฉแแแแฌแแ แแแ แแแแแแแแแแ EPERM แจแแชแแแแแ - แแแแแ, แ แแช แฉแแแ แแแแแงแแแแ. แแก แแแจแแแแก, แ แแ แแ แแแ แแแ แแ แแคแแ แก แแแแแกแชแแแก, แ แแแแแ แแแก แแ แจแแฃแซแแแ แฉแแฌแแ แแก แกแแกแขแแแฃแ แ แแแ แแก แฌแแแแแ:
[pid 25099] write(2, "ls: ", 4) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "write error", 11) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "n", 1) = -1 EPERM (Operation not permitted)แแฎแแ แแฅแแแ แแแกแแแ, แ แแแแ แแฃแจแแแแก Seccomp BPF แแ แแแฅแแ แแแ แแ แฌแแ แแแแแแแ แแแแก แจแแกแแฎแแ, แแฃ แ แ แจแแแแซแแแแ แแแแแแแแ แแแกแแแ. แแแแ แแ แแ แแกแฃแ แก แแแแแแก แแแฆแฌแแแ cBPF-แแก แแแชแแแแ eBPF-แแ, แ แแ แแแแแแงแแแ แแแกแ แกแ แฃแแ แซแแแ?
eBPF แแ แแแ แแแแแแ แคแแฅแ แแกแแก, แแแแแแแแแแแก แฃแแแขแแกแแแ แคแแฅแ แแแก, แ แแ แแกแแแ แฃแแ แแแแ แฌแแ แแ แแ แแขแแแ แแแแแ แแแแแแแกแขแ แแขแแ แแก แแ แแแแแแแแแแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแก แแแแชแฎแแแแแ แแแแแแแ แแแ แแแแแ, แแแ แแแ แแฎแแ แชแแแแแแก แแแฅแแแแแแแแแก แแ แแแแแแแแแก แกแฎแแแแแกแฎแแ แแแแแแ eBPF แแแแแฅแขแแแแก แแแกแแชแแแแ. แแ แแแฅแแแแแแแแก แฃแฌแแแแแแ BPF LSM แฎแแคแแแแแแก.
BPF LSM แฎแแคแแแแแแ
แกแแกแขแแแแก แแแแแแแแแแก แแ แฅแแขแแฅแขแฃแ แแกแแแ แแแแแฃแแแแแแแแ แแแแแขแแ แแแแแก แฃแแ แฃแแแแแกแแงแแคแแ, LSM แแฎแแ แชแแแแแแก แฎแแคแแแแแแแก แแแแชแแคแชแแแก. Hook แแแ แ แขแแฅแแแแฃแ แแ แฐแแแแก แกแแกแขแแแฃแ แแแ แก, แแแแ แแ แแ แแก แกแแกแขแแแ แแแแแฃแแแแแแแแ แแ แแแขแแแ แแ แแแฃแแแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแกแแแ. LSM แแแแแแแแแ แแฎแแ แแแแชแแคแชแแแก, แ แแแแแจแแช แแแกแขแ แแฅแชแแแก แคแแแ แแแแแฎแแแ แแแแ แแแแแแแ แแแชแแแแ แแ แแแแแแแแ, แ แแแแแแแช แฌแแ แแแแฅแแแแแ แกแฎแแแแแกแฎแแ แแ แฅแแขแแฅแขแฃแ แแแ แกแแกแขแแแฃแ แ แแแฌแแแแแแแแก แแ แแก.
แฌแแ แแก แแ แแก, แแแ แแแก แแฅแแก แจแแแแ แแแฃแญแ, แ แแแแแแแช แแแแแแจแแ แแแฃแแแ BPF แแ แแแ แแแแแแแ แแ SELinux แแ แแก แแ แแแแแ แแ แฉแแจแแแแแฃแแ LSM, แ แแแแแแช แแฎแแ แชแแแแแแก แแแ.
แฎแแคแแแแแแแก แฌแงแแ แแก แแแแ แแแแแแ แแแแก แแแ แแแแก แฎแแจแ แคแแแแจแ include/linux/security.h:
extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);แแแแแแฃแแ แแแแแแแ แแแแแแซแแฎแแแ แจแแกแ แฃแแแแแก แกแฎแแแแแกแฎแแ แแขแแแแ:
โ Security_bpf โ แแฎแแ แชแแแแแแก แจแแกแ แฃแแแแฃแแ BPF แกแแกแขแแแฃแ แ แแแ แแแแก แแแแแแแแ แแแ แจแแแแฌแแแแแก;
- security_bpf_map - แแแแฌแแแแก, แ แแแแก แแแ แฃแแแแก แแแ แแแ แคแแแแแก แแฆแฌแแ แก แ แฃแแแแ;
- security_bpf_prog - แแแแฌแแแแก, แ แแแแก แแแ แฃแแแแก แแแ แแแ แคแแแแแก แแฆแฌแแ แก eBPF แแ แแแ แแแแกแแแแก;
โ security_bpf_map_alloc โ แแแแฌแแแแก แแ แแก แแฃ แแ แ แฃแกแแคแ แแฎแแแแแก แแแแ BPF แ แฃแแแแแก แจแแแแแ แแแแชแแแแแแแแฃแแ;
- security_bpf_map_free - แแแแฌแแแแก แแ แแก แแฃ แแ แ แฃแกแแคแ แแฎแแแแแก แแแแ แแแกแฃแคแแแแแแฃแแ BPF แ แฃแแแแจแ;
โ security_bpf_prog_alloc โ แแแแฌแแแแก แแ แแก แแฃ แแ แ แฃแกแแคแ แแฎแแแแแก แแแแ แแแแชแแแแแแแแฃแแ BPF แแ แแแ แแแแแแก แจแแแแแ;
- security_bpf_prog_free - แแแแฌแแแแก แแ แแก แแฃ แแ แ แฃแกแแคแ แแฎแแแแแก แแแแ แแแกแฃแคแแแแแแฃแแ BPF แแ แแแ แแแแแจแ.
แแฎแแ, แแ แงแแแแแคแ แแก แแแแแฎแแแกแแก, แฉแแแ แแแแกแแแก: แแแแ LSM BPF แฉแแแญแ แแแแแแก แฃแแแ แแ แแก แแก, แ แแ แแแ แจแแฃแซแแแแ แฃแแ แฃแแแแแงแแ แแแชแแ แงแแแแ eBPF แแแแแฅแขแแกแแแแก, แ แแช แฃแแ แฃแแแแแงแแคแก, แ แแ แแฎแแแแ แจแแกแแแแแแกแ แแ แแแแแแแแแแแก แแฅแแแ แแแ แแแก แจแแฃแซแแแแ แจแแแกแ แฃแแแ แแแแ แแชแแแแ แแแ แแแแแกแ แแ แแ แแแ แแแแแแ.
แ แแแแฃแแ
แฃแกแแคแ แแฎแแแแ แแ แแ แแก แแก, แ แแกแ แแแแแ แแแแช แจแแแแซแแแแ แงแแแแแคแแ แแ, แ แแกแ แแแชแแแช แแกแฃแ แ. แแแแจแแแแแแแแแแ, แ แแ แจแแซแแแ แกแแกแขแแแแแแก แแแชแแ แกแฎแแแแแกแฎแแ แแแแแแ แแ แกแฎแแแแแกแฎแแ แแแแ. แแแแ แแแแฏแแ แแ แแฃ แแ แ, แกแแกแขแแแแก แฃแแ แฃแแแแแกแแงแแคแแ แกแแฃแแแแแกแ แกแแจแฃแแแแแแ แแแชแแแก แกแฎแแแแแกแฎแแ แแแแแก แแ แแแแแแแแ แกแฎแแแแแกแฎแแ แแแแแชแแแแแ, แแกแ, แ แแ แแ แแ แแแแแก แฃแกแแคแ แแฎแแแแแก แจแแแชแแ แแแแ แแ แแแกแชแแก แฌแแแแแ แแแแ แกแแกแขแแแแแ. แซแแ แแแแแ แแแแแแแแแ แแแแ แแแแแแแแก แจแแกแแแแจแแแแ แกแแแฃแจแแ, แ แแ แแแแแชแแก แกแฎแแแแแกแฎแแ แคแแแแแแกแ แแ แจแแฎแแแแก แฌแแ แขแแแแแแก แแแแ แแแ. แแแแแแแแแแแ, แ แแ แแแ แแแ แแแแแแชแแแ, แ แ แแ แแก แคแแแแแ แแ แ แแแแ แแแแแแงแแแแ BPF แแ แแแ แแแแแ แแแแแแ แแฃแจแแแแแกแแแแก.
แแแขแแ แแแแก แจแแกแแฎแแ
แแแแแ แแแแแแแ แ แแ แแก CTO Netlify-แจแ. แแก แแฃแจแแแแแ Docker-แแก แแฎแแ แแแญแแ แแจแ แแ แฌแแแแแ แจแแแขแแแ Runc, Go แแ BCC แแแกแขแ แฃแแแแขแแแแก, แแกแแแ แ แแแแ แช แกแฎแแ แฆแแ แแแแแก แแ แแแฅแขแแแแก แจแแแฃแจแแแแแแจแ. แชแแแแแแแ แแแแแกแ แแฃแจแแแแแ Docker แแ แแแฅแขแแแแ แแ Docker แแแแฃแแแก แแแแกแแกแขแแแแก แจแแแฃแจแแแแแแ. แแแแแแก แซแแแแแ แฃแงแแแ แก แคแแแแแแก แแ แแคแแแแแ แแ แงแแแแแแแแก แชแแแแแแก แแฃแจแแแแแก แแแขแแแแแแชแแแก.
แแแ แแแชแ แคแแแขแแแ แแฃแจแแแแก แฆแแ แแแแแก แแฃแแแจแ Sysdig-แจแ, แกแแแแช แแก แซแแ แแแแแแ แแ แแแแขแแ แแแฃแแแ Falco-แแ, Cloud Native Computing Foundation-แแก แแ แแแฅแขแแ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแก แแแแขแแแแแ แแก แแแจแแแแแก แฃแกแแคแ แแฎแแแแแก แแ แแแแแแแแแแแก แแแแแแแแแแก แแแ แแแแก แแแแฃแแแกแ แแ eBPF-แแก แแแจแแแแแแ. แแก แแแขแแชแแแฃแแแ แแแแแฌแแแแแฃแแ แกแแกแขแแแแแแ, แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แแแแกแแแฆแแ แฃแแ แฅแกแแแแแแ, Linux-แแก แแแ แแแแ แแ แจแแกแ แฃแแแแแก แแแแแแแแ.
ยป แแแขแ แแแคแแ แแแชแแ แฌแแแแแก แจแแกแแฎแแ แจแแแแซแแแแ แแฎแแแแ แแฅ
ยป
ยป
Khabrozhiteley-แแ 25% แคแแกแแแแแแแ แแฃแแแแแก แแแแแงแแแแแแ - Linux
แฌแแแแแก แฅแแฆแแแแแก แแแ แกแแแก แแแแแฎแแแก แจแแแแแ แแแแฅแขแ แแแฃแแ แฌแแแแ แแแแแแแแแแแ แแแแฅแขแ แแแฃแแ แคแแกแขแแ.
แฌแงแแ แ: www.habr.com
