ืืืืืช ืืืืช ืืื ืืงืก, ืชืืื ืืชืื ื-Secomp
BPF ืืกืคืง ืืจื ืจืืช ืขืืฆืื ืืืจืืื ืืช ืืืืื ืืืื ืืืงืจืื ืืฆืืืืช, ืืืืื ืื ืืืืจืืช. ืืกืืื ืื, ืืคืชืื ืืืืื ืืฉืื ืฉืื ืืืื ืจืขืืื ืืื ืืืฉืชืืฉ ืืจืืกืืืืช ืฉืื ืืื ืืฉืคืจ ืืช ืืืืื ืืชืืืื ื-Seccomp ืขื ืืื ืืืืขืช ืืกื ื ื Seccomp ืื ืชืืืื ืขื ืืื ืชืืื ืืืช BPF, ืืืืืขืืช ืื ืืฉื Seccomp BPF. ืืคืจืง ืื ื ืกืืืจ ืืื Seccomp ืืืืฆื ืืฉืชืืฉืื ืื. ืืืืจ ืืื ืชืืื ืืืฆื ืืืชืื ืืกื ื ื Seccomp ืืืืฆืขืืช ืชืืื ืืืช BPF. ืืืืจ ืืื, ื ืกืชืื ืขื ื-BPF ืืืืื ืื ืืืืืืื ืืงืจื ื ืขืืืจ ืืืืืื ืืืืื ืฉื ืืื ืืงืก.
ืืืืืื ืืืืื ืฉื ืืื ืืงืก (LSM) ืื ืืกืืจืช ืืืกืคืงืช ืกื ืฉื ืคืื ืงืฆืืืช ืฉื ืืชื ืืืฉืชืืฉ ืืื ืืื ืืืืฉื ืืืืืื ืืืืื ืฉืื ืื ืืฆืืจื ืกืื ืืจืืืช. ื ืืชื ืืืฉืชืืฉ ื-LSM ืืฉืืจืืช ืืขืฅ ืืืงืืจ ืฉื ืืืืื, ืืืื Apparmor, SELinux ื-Tomoyo.
ืืืื ื ืชืืื ืืืืื ืืืืืืืช ืฉื ืืื ืืงืก.
ืืืืืืช
ืืืืืช ืฉื ืืืืืืืช ืฉื ืืื ืืงืก ืืื ืฉืขืืื ืืืขื ืืง ืืชืืืื ืืื ืืจืฉืืืช ืืจืฉืื ืืืฆืข ืืฉืืื ืืกืืืืช, ืื ืืืื ืืืฉืชืืฉ ื-suid ืืืืจื ืื, ืื ืืืคืื ืืช ืืชืืืื ืืคืจืืืืืื ืืืจื ืืืจืช, ืื ืฉืืคืืืช ืืช ืืืคืฉืจืืช ืืืชืงืคื ืืืืคืฉืจ ืืชืืืื ืืืฆืข ืืฉืืืืช ืืกืืืืืช. ืืืืืื, ืื ืืืืฉืื ืฉืื ืฆืจืื ืืคืชืื ืคืืจื ืืืืืก, ื ื ืื 80, ืืืงืื ืืืจืืฅ ืืช ืืชืืืื ืืฉืืจืฉ, ืืชื ืืืื ืคืฉืื ืืชืช ืื ืืช ืืืืืืช 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
ืขื ืืืช, ืืืืืื ืฉืืื ื ื ืืขื ืืงืื ืืจืฉืืืช ืฉืืจืฉ, ืงืื ืื ืืืจืืง ืฉืืืื ืืขืช ืงืฉืืจืช ืืคืืจื:
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1
capsh (ืื ืื ืืขืืคืช) ืืื ืืื ืืืจืืฅ ืืขืืคืช ืขื ืกื ืกืคืฆืืคื ืฉื ืืืืืืช.
ืืืงืจื ืื, ืืคื ืฉืืืจ ืฆืืื, ืืืงืื ืืืขื ืืง ืืืืืืช ืฉืืจืฉ ืืืืืช, ืืชื ืืืื ืืืคืฉืจ ืงืืฉืืจ ืคืืจื ืคืจืืืืืื ืขื ืืื ืืชื ืืืืืช 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 - ืืฉืชืืฉ ืืงืืฉ ืืงืืืคื.
- โcaps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - ืืืืืื ืฉืขืืื ื ืืฉื ืืช ืืช ืืืฉืชืืฉ (ืืื ื ื ืจืืฆืื ืืืคืขืื ื-root), ื ืฆืืื ืืช cap_net_bind_service ืืืช ืืืืืืช ืืฉื ืืช ืืคืืขื ืืช ืืืื ืืืฉืชืืฉ ื- ืฉืืจืฉ ืืืฃ ืืื, ืืืืืจ cap_setuid ื-cap_setgid.
- โkeep=1 โ ืื ืื ื ืจืืฆืื ืืฉืืืจ ืขื ืืืืืืืช ืืืืชืงื ืืช ืืขืช ืืขืืจ ืืืฉืืื ืืฉืืจืฉ.
- โuser="ืืฃ ืืื" - ืืฉืชืืฉ ืืงืฆื ืฉืืคืขืื ืืช ืืชืืื ืืช ืืืื ืืฃ ืืื.
- โaddamb=cap_net_bind_service โ ืืืืจ ืืช ื ืืงืื ืืืืืืืช ืืงืฉืืจืืช ืืืืจ ืืขืืจ ืืืฆื ืฉืืจืฉ.
- - -c "./capabilities" - ืคืฉืื ืืคืขื ืืช ืืชืืื ืืช.
ืืืืืืช ืืงืืฉืจืืช ืื ืกืื ืืืืื ืฉื ืืืืืืช ืฉืขืืืจืืช ืืืจืืฉื ืขื ืืื ืชืืื ืืืช ืืื ืืืฉืจ ืืชืืื ืืช ืื ืืืืืช ืืืฆืขืช ืืืชื ืืืืฆืขืืช execve(). ืจืง ืืืืืืช ืฉืืืชืจ ืืฉืืื, ืื ืืืืืื ืืืจืืช, ืืืืืืืช ืกืืืื, ืืืืืืช ืืขืืืจ ืืืจืืฉื.
ืืชื ืืื ืชืืื ืื ืืืฉืืขืืช ืฉื +eip ืืืืจ ืฆืืื ืืืืืืช ืืืคืฉืจืืช --caps. ืืืืื ืืื ืืฉืืฉืื ืืื ืืงืืืข ืฉืืืืืืช:
-ืืืื ืืืืืช ืืืคืขื (p);
- ืืืื ืืฉืืืืฉ (ื);
-ืืืื ืืขืืืจ ืืืจืืฉื ืขื ืืื ืชืืืืื ืฆืืฆื (i).
ืืืืืื ืฉืื ื ืจืืฆืื ืืืฉืชืืฉ ื-cap_net_bind_service, ืขืืื ื ืืขืฉืืช ืืืช ืขื ืืืื e. ืืืืจ ืืื ื ืชืืื ืืช ืืืขืืคืช ืืคืงืืื. ืื ืืจืืฅ ืืช ืืืืืืืช ืืืื ืืจืืืช ืืขืืื ื ืืกืื ืืืชื ืืืื i. ืืืกืืฃ, ืื ื ืจืืฆืื ืฉืืชืืื ื ืชืืื ืืืคืขืืช (ืขืฉืื ื ืืืช ืืืื ืืฉื ืืช ืืช ื-UID) ืขื p. ืื ื ืจืื ืืื cap_net_bind_service+eip.
ืืชื ืืืื ืืืืืง ืืช ืืชืืฆืื ืืืืฆืขืืช ss. ืืืื ื ืงืฆืจ ืืขื ืืช ืืคืื ืืื ืืืชืืื ืืืฃ, ืืื ืืื ืืฆืื ืืช ืืืฆืืื ืืืืื ืืืฉืชืืฉ ืืืฉืืืืื ืืืื 0, ืืืงืจื ืื 65:
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0
ืืืืืื ืื ืืฉืชืืฉื ื ื-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, ืืื ืืืืืจ ืืงืืืข ืืงืื ืืืงืืจ ืฉื ืืืืื ืืงืืืฅ 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.
ืืกืขืืฃ ืืื ืืจืื ืืืฆื ืืืฉืชืืฉ ืืชืืื ืืช ืืืื ืกืื ืื, ืื ืืืืฆืขืืช ืืื ืืงื ืืืจืช ืืืืคืฉืจืช ืื ื ืืืืฉื ืืืืคื ืคืจืืืจืืื ืืช ืืืกื ื ืื ืฉืื ื.
Secomp
Seccomp ืจืืฉื ืชืืืืช ืฉื Secure Computing ืืืื ืฉืืืช ืืืืื ืืืืืฉืืช ืืืืืช ืืื ืืงืก ืืืืคืฉืจืช ืืืคืชืืื ืืกื ื ืงืจืืืืช ืืขืจืืช ืืกืืืืืช. ืืืจืืช ืฉ-Secomp ืืืื ืืืืืืืช ืืืื ืืงืก, ืืืืืืช ืฉืื ืื ืื ืฉืืืืช ืืขืจืืช ืืกืืืืืช ืืืคืืช ืืืชื ืืืืืฉื ืืจืื ืืืชืจ ืืืฉืืืื ืืืืื.
ืชืืื ืืช Seccomp ื-Linux ืืื ื ืกืืชืจืืช ืื ืืช ืื ืืืขืชืื ืงืจืืืืช ืืฉืืฉืืช ืืื ืืื ืืืคืืง ืชืืขืืช ืืฉืชื ืืืืฉืืช. ืืืืืื, ืืืชืื ืฉืชืจืฆื ืืชืช ืืชืืืื ืืช ืืืืืช CAP_NET_ADMIN ืื ืื ืืืคืฉืจ ืื ืืงืื ืืืืืจื ืฉืงืข, ืืืกืื ืืช ืืงืืื ืืงืืืช ืงืจืืืืช ืืืขืจืืช.
ืฉืืืช ืืกืื ืื ืฉื 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 ืืืขืืจ ืืืจืื ืืืฉืชืืฉ ืืขืจื ืืฉืืืื. ืืืชืื ืืกืืืช ืืฉืืืื, ืืืืืจืื ืขืจืื ืฉืืืื ืฉืื ืื. ืจืฉืืื ืฉื ืืกืคืจื ืฉืืืืืช ืืกืืคืงืช ืืกืขืืฃ ืืื.
- SECCOMP_RET_TRACE - ืืฉืืฉ ืืื ืืืืืืข โโื-ptrace tracer ืืืืฆืขืืช - PTRACE_O_TRACESECCOMP ืืื ืืืืจื ืืืฉืจ ืืืืฆืขืช ืงืจืืืช ืืขืจืืช ืืื ืืจืืืช ืืืฉืืื ืืชืืืื ืื. ืื ืืขืงื ืื ืืืืืจ, ืืืืืจืช ืฉืืืื, errno ืืืืืจ ื-ENOSYS, ืืงืจืืื ืืืขืจืืช ืื ืืืืฆืขืช.
- SECCOMP_RET_LOG - ืงืจืืืช ืืืขืจืืช ื ืคืชืจื ืื ืจืฉืืช.
- SECCOMP_RET_ALLOW - ืงืจืืืช ืืืขืจืืช ืคืฉืื ืืืชืจืช.
ptrace ืืื ืงืจืืืช ืืขืจืืช ืืืืืขืช ืื ืื ืื ื ืืขืงื ืืชืืืื ืื ืงืจื tracee, ืขื ืืืืืช ื ืืืืจ ืืืงืจื ืขื ืืืฆืืข ืืชืืืื. ืชืืื ืืช ืืืขืงื ืืืืื ืืืฉืคืืข ืืืขืืืืช ืขื ืืืืฆืืข ืืืฉื ืืช ืืช ืืืืจื ืืืืืจืื ืฉื tracee. ืืืงืฉืจ ืฉื Seccomp, ื ืขืฉื ืฉืืืืฉ ื-ptrace ืืืฉืจ ืืื ืืืคืขื ืขื ืืื ืงืื ืืืฆื SECCOMP_RET_TRACE, ืื ืฉื-Tracer ืืืื ืืื ืืข ืืช ืืืฆืืข ืงืจืืืช ืืืขืจืืช ืืืืืฉื ืืช ืืืืืืื ืฉืื.
ืฉืืืืืช Secomp
ืืขืช ืืขืช, ืชืื ืืื ืขืืืื ืขื 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 ืืื'.
Secomp ืืืื ื ืจืืืช ืื ืืื ืืื ืืืืืืืช ืืจืื ืืื, ืืื ืืื ืื. Seccomp ืืื ืืื ืขืืจ ืืืืคืฉืจ ืืืฉืชืืฉืื ืืคืชื ืื ืื ืื ืืจืื ืืื. ืืขืช ืืืื ื ืกืชืื ืืืฆื ื ืืฆืจืืช ืชืืื ืืืช ืืื ืืจืืงืฆืื ืขื ืืฉืชืืฉืื ืืืืฆืขืืช ืืกื ื ืื ืงืจื ืืฉืืจืืช ืขื ืืื ืงืจืืืช ืืืขืจืืช ืฉื Seccomp.
ืืืืื ืืืกื ื BPF Secomp
ืืื ื ืจืื ืืืฆื ืืฉืื ืืช ืฉืชื ืืคืขืืืืช ืฉื ืืื ื ืงืืื ืืื, ืืืืืจ:
- ื ืืชืื ืชืืื ืืช 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_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, arch, 0, 3) - ืืืืง ืืืืฆืขืืช BPF_JEQ ืืื ืขืจื ืืืจืืืืงืืืจื ืืงืืืข ืืฆืืจ BPF_K ืฉืืื ืืงืฉืช. ืื ืื, ืงืืคืฅ ืืืืกื 0 ืืืืจืื ืืืื, ืืืจืช ืงืืคืฅ ืืืืกื 3 (ืืืงืจื ืื) ืืื ืืืจืืง ืฉืืืื ืื ืืงืฉืช ืื ืชืืืืช.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - ืืืขื ืืืฆืืืจ ื-BPF_LD ืืฆืืจื ืฉื ืืืืื BPF_W, ืฉืืื ืืกืคืจ ืืฉืืื ืฉื ืืืขืจืืช ืืืืื ืืงืืืื ืืงืืืข ืฉื BPF_ABS.
โ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) โ ืืฉืืื ืืช ืืกืคืจ ืืฉืืื ืฉื ืืืขืจืืช ืขื ืืขืจื ืฉื ืืฉืชื ื nr. ืื ืื ืฉืืืื, ืขืืืจ ืืืืจืื ืืืื ืืืฉืืืช ืืช ืงืจืืืช ืืืขืจืืช, ืืืจืช ืืืคืฉืจ ืืช ืงืจืืืช ืืืขืจืืช ืขื SECCOMP_RET_ALLOW.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)) - ืืกืืื ืืช ืืชืืื ืืช ืขื BPF_RET ืืืชืืฆืื ืืื ืืืืฆืจ ืฉืืืื SECCOMP_RET_ERRNO ืขื ืืืกืคืจ ืืืฉืชื ื ืืฉืืืื.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - ืืกืืื ืืช ืืชืืื ืืช ืขื BPF_RET ืืืืคืฉืจ ืืืฆืืข ืงืจืืืช ืืืขืจืืช ืืืืฆืขืืช SECCOMP_RET_ALLOW.
SECCOMP ืืื CBPF
ืืืื ืืชื ืชืืื ืืืืข ื ืขืฉื ืฉืืืืฉ ืืจืฉืืืช ืืืจืืืช ืืืงืื ืืืืืืงื ELF ืืืืืจ ืื ืชืืื ืืช C ืืืืืจืืช ืฉื JIT.ืืฉ ืืื ืฉืชื ืกืืืืช.
โข ืจืืฉืืช, 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:
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 ืืื ืืืืืืช ืฉืืจืฉ.
ืืขืช ื ืืื ืืงืจืื ืืคืื ืงืฆืื 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 -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 ืืื ืืจืืืช ืื ืงืืจื:
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 ืืืืฉืืช ืืช ืืจืขืืื ืฉื ืืืืืืืช. ืฉืืืช 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. ืืื ื ืืื ืืืขืจืืืช ืืืืืจืืช, ืจืฉืชืืช ืืืืืจืืช ืชืืื ื, ืืืืช ืืื ืืงืก ืื ืืชืื ืืืฆืืขืื.
ยป ืคืจืืื ื ืืกืคืื ืขื ืืกืคืจ ื ืืชื ืืืฆืื ืืืชืืืช
ยป
ยป
ืขืืืจ Khabrozhiteley 25% ืื ืื ืืืืฆืขืืช ืงืืคืื - ืืื ืืงืก
ืืชืฉืืื ืืจืกืช ืื ืืืจ ืฉื ืืกืคืจ ืืฉืื ืกืคืจ ืืืงืืจืื ื ืืืืื.
ืืงืืจ: www.habr.com