เบชเบฐเบเบฒเบเบเบตเบเบฒเบง Khabro! เปเบเบทเปเบญเบ virtual BPF เปเบกเปเบเบซเบเบถเปเบเปเบเบญเบปเบเบเบฐเบเบญเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบเบเบญเบ Linux kernel. เบเบฒเบเบเปเบฒเปเบเปเบเบตเปเปเบซเบกเบฒเบฐเบชเบปเบกเบเบญเบเบกเบฑเบเบเบฐเบเปเบงเบเปเบซเปเบงเบดเบชเบฐเบงเบฐเบเบญเบเบฅเบฐเบเบปเบเบชเบฒเบกเบฒเบเบเบญเบเบซเบฒเบเปเปเบเบปเบเบเปเบญเบเปเบฅเบฐเปเบเปเปเบเบเบฑเบเบซเบฒเบเบตเปเบชเบฑเบเบชเบปเบเบเบตเปเบชเบธเบ. เบเปเบฒเบเบเบฐเบฎเบฝเบเบฎเบนเปเบงเบดเบเบตเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบเบตเปเบเบดเบเบเบฒเบกเปเบฅเบฐเบเบฑเบเปเบเบเบเบถเบเบเบดเบเปเบฒเบเบญเบ kernel, เบงเบดเบเบตเบเบฒเบเบเบฐเบเบดเบเบฑเบเบฅเบฐเบซเบฑเบเบขเปเบฒเบเบเบญเบเปเบเปเบเบทเปเบญเบเบดเบเบเบฒเบกเปเบซเบเบเบฒเบเปเบ kernel, เปเบฅเบฐเบญเบทเปเบเปเบญเบตเบ. David Calavera เปเบฅเบฐ Lorenzo Fontana เบเบฐเบเปเบงเบเปเบซเปเบเปเบฒเบเบเบปเบเบฅเบฑเบญเบเบเบฐเบฅเบฑเบเบเบฒเบเบเบญเบ BPF. เบเบฐเบซเบเบฒเบเบเบงเบฒเบกเบฎเบนเปเบเบญเบเบเปเบฒเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบ, เปเบเบทเบญเบเปเบฒเบ, เบเบงเบฒเบกเบเบญเบเปเบ. - เปเบเป BPF เปเบเบทเปเบญเบเบดเบเบเบฒเบกเปเบฅเบฐเบเบฑเบเปเบเบเบเบถเบเบเบดเบเปเบฒเบเบญเบ Linux kernel. - เปเบชเปเบฅเบฐเบซเบฑเบเปเบเบทเปเบญเบเบดเบเบเบฒเบกเปเบซเบเบเบฒเบ kernel เบขเปเบฒเบเบเบญเบเปเบเปเบเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบงเบเบฅเบงเบก kernel เบซเบผเบท reboot เบฅเบฐเบเบปเบ. โ เปเบเปเบเบปเบงเบขเปเบฒเบเบฅเบฐเบซเบฑเบเบเบตเปเบชเบฐเบเบงเบเปเบ C, Go เบซเบผเบท Python. - เบเบงเบเบเบธเบกเปเบเบเบเบฒเบเปเบเบฑเบเปเบเบปเปเบฒเบเบญเบเปเบเบเบเบฒเบ BPF.
Linux Kernel Security, เบเบธเบเบชเบปเบกเบเบฑเบเบเบญเบเบกเบฑเบ เปเบฅเบฐ Seccomp
BPF เบชเบฐเบซเบเบญเบเบงเบดเบเบตเบเบฒเบเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเปเบเบเบฒเบเบเบฐเบซเบเบฒเบเปเบเปเบเบเบญเบเปเบเปเบเปเบเบเบเปเปเบกเบตเบเบฒเบเปเบชเบเบชเบฐเบฅเบฐเบเบงเบฒเบกเบซเบกเบฑเปเบเบเบปเบ, เบเบงเบฒเบกเบเบญเบเปเบ, เบซเบผเบทเบเบงเบฒเบกเปเบง. เบชเปเบฒเบฅเบฑเบเปเบซเบเบเบปเบเบเบตเป, เบเบฑเบเบเบฑเบเบเบฐเบเบฒ kernel เบเบดเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบเบงเบฒเบกเบเบดเบเบเบตเปเบเบตเบเบตเปเบเบฐเปเบเปเบเบงเบฒเบกเบเบทเบเบซเบเบธเปเบเบเบญเบเบกเบฑเบเปเบเบทเปเบญเบเบฑเบเบเบธเบเบเบฒเบเปเบเบเบเปเบฝเบงเบเบญเบเบเบฐเบเบงเบเบเบฒเบเปเบ Seccomp เปเบเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบปเบงเบเบญเบ Seccomp เบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเปเบเบเปเบเบเบเบฒเบ BPF, เปเบเบดเปเบเปเบญเบตเปเบเบเบฑเบเบงเปเบฒ Seccomp BPF. เปเบเบเบปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบญเบฐเบเบดเบเบฒเบเบงเปเบฒ Seccomp เปเบกเปเบเบซเบเบฑเบเปเบฅเบฐเบกเบฑเบเบเบทเบเบเปเบฒเปเบเปเปเบเบงเปเบ. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเปเบฒเบเบเบฐเบฎเบฝเบเบฎเบนเปเบงเบดเบเบตเบเบฒเบเบเบฝเบเบเบปเบงเบเบญเบ Seccomp เปเบเบเปเบเปเปเบเปเบเบผเบก BPF. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบดเปเบ hooks BPF เบเบตเปเบกเบตเบขเบนเปเปเบเบเบปเบงเบเบตเปเบฅเบงเบกเบขเบนเปเปเบ kernel เบชเปเบฒเบฅเบฑเบเปเบกเบเบนเบเบเบงเบฒเบกเบเบญเบเปเบ Linux.
เปเบกเบเบนเบเบเบงเบฒเบกเบเบญเบเปเบ Linux (LSM) เปเบกเปเบเบเบญเบเบเบตเปเบชเบฐเบซเบเบญเบเบเบธเบเบเบญเบเบซเบเปเบฒเบเบตเปเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบฎเบนเบเปเบเบเบเบงเบฒเบกเบเบญเบเปเบเบเปเบฒเบเปเปเบเบฅเบฑเบเบชเบฐเบเบฐเบกเบฒเบเบเบฐเบเบฒเบ. LSM เบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเปเบเบเบเบปเบเปเบเบเบปเปเบเปเบซเบผเปเบเปเบเปเบ, เปเบเบฑเปเบ Apparmor, SELinux เปเบฅเบฐ Tomoyo.
เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเปเบเบเบเบฒเบเบชเบปเบเบเบฐเบเบฒเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบ Linux.
เบเบธเบเบเบฐเบชเบปเบกเบเบฑเบ
เปเบเบเปเบเบทเปเบญเปเบเปเปเบฅเปเบงเบเบญเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบ Linux เปเบกเปเบเบงเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฐเบเบงเบเบเบฒเบเบเบตเปเบเปเปเบกเบตเบชเบดเบเบเบดเบเบดเปเบชเบเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบงเบฝเบเบเบฒเบเบชเบฐเปเบเบฒเบฐเปเบเบซเบเบถเปเบ, เปเบเปเปเบเบเบเปเปเบกเบตเบเบฒเบเบเปเบฒเปเบเป 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เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบทเปเบญเบเบเบฒเบเบเบงเบเปเบฎเบปเบฒเบเปเปเปเบเปเปเบซเปเบชเบดเบเบเบด root, เบฅเบฐเบซเบฑเบเบเบตเปเบเบฐเบเบดเปเบกเบเบงเบฒเบกเบเบดเบเบเบฒเบเปเบเปเบงเบฅเบฒเบเบตเปเบเบนเบเบกเบฑเบเบเบญเบ:
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1capsh (เบเบนเปเบเบฑเบเบเบฒเบเปเบเบฐ) เปเบกเปเบเปเบเบทเปเบญเบเบกเบทเบเบตเปเบเปเบฒเปเบเบตเบเบเบฒเบ shell เบเบตเปเบกเบตเบเบธเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบชเบฐเปเบเบฒเบฐ.
เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบฑเปเบเบเบตเปเปเบเปเบเปเบฒเบงเบกเบฒเปเบฅเปเบง, เปเบเบเบเบตเปเบเบฐเปเบซเปเบชเบดเบเบฎเบฒเบเบขเปเบฒเบเปเบเบฑเบกเบเบตเป, เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบตเบเปเบเปเบเบฒเบเบเบนเบเบกเบฑเบเบเบญเบเบเบตเปเบกเบตเบชเบดเบเบเบดเบเบดเปเบชเบเปเบเบเบเบฒเบเบชเบฐเบซเบเบญเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบ 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 เปเบฅเบฐเบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเปเบฝเบเบฅเบฐเบซเบฑเบเบเบนเปเปเบเปเบเบปเบงเบเบดเบเบเบฒเบ เบฎเบฒเบเปเบเบซเบฒเบเปเปเบกเบตเปเบ, เบเบท cap_setuid เปเบฅเบฐ cap_setgid.
- โkeep=1 โ เบเบงเบโเปเบฎเบปเบฒโเบเปเบญเบโเบเบฒเบโเบเบตเปโเบเบฐโเบฎเบฑเบโเบชเบฒโเบเบงเบฒเบกโเบชเบฒโเบกเบฒเบโเบเบตเปโเบเบดเบโเบเบฑเปเบโเปเบโเปเบงโเบฅเบฒโเบเบตเปโเบเปเบฝเบโเบเบฒเบโเบเบฑเบโเบเบตโเบฎเบฒเบโ.
- โuser=โnobodyโ โ เบเบนเปโเปเบเปโเบชเบธเบโเบเปเบฒเบโเบเบตเปโเบเปเบฒโเปเบเบตเบโเปเบเบโเบเบฒเบโเบเบฐโเบเปเปโเบกเบตโเปเบ.
- โaddamb=cap_net_bind_service โ เบเบฑเปเบโเบเบฒเบโเบฅเปเบฒเบโเบเบงเบฒเบกโเบชเบฒโเบกเบฒเบโเบเบตเปโเบเปเบฝเบงโเบเปเบญเบโเบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเปเบฝเบโเบเบฒเบโเบฎเบนเบโเปเบเบโเบฎเบฒเบโ.
- - -c "./capabilities" - เบเบฝเบเปเบเปเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบเบเบฒเบ.
เบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบตเปเปเบเบทเปเบญเบกเปเบเบเปเบกเปเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบดเปเบชเบเบเบตเปเบชเบทเบเบเบญเบเบกเบฒเบเบฒเบเบเบฑเบเบเบฒเปเบเบเบเบฒเบเปเบเบฑเบเบเปเบญเบ เปเบกเบทเปเบญเปเบเบเบเบฒเบเบเบฐเบเบธเบเบฑเบเบเบฐเบเบดเบเบฑเบเบเบงเบเบกเบฑเบเปเบเบเปเบเป execve(). เบเบฝเบเปเบเปเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบตเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเปเบเบทเปเบญเบกเปเบเบ, เบซเบผเบทเปเบเบเปเบฒเบชเบฑเบเบเปเบฒเบเปเบญเบทเปเบเป, เปเบเบฑเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเปเบฒเบเบชเบดเปเบเปเบงเบเบฅเปเบญเบก, เบชเบฒเบกเบฒเบเปเบเปเบฎเบฑเบเบเบฒเบเบชเบทเบเบเบญเบ.
เบเปเบฒเบเบญเบฒเบเบเบฐเบชเบปเบเปเบชเบงเปเบฒ +eip เบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเปเบเบงเปเบเบซเบผเบฑเบเบเบฒเบเบฅเบฐเบเบธเบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบปเบงเปเบฅเบทเบญเบ --caps. เบเบธเบเปเบซเบผเบปเปเบฒเบเบตเปเบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบเปเบฒเบเบปเบเบงเปเบฒเบเบงเบฒเบกเบชเบฒเบกเบฒเบ:
- เบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบฐเบเบธเปเบ (p);
- เบชเบฒเบกเบฒเบเปเบเปเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฒเปเบเป (e);
-เบชเบฒเบกเบฒเบเปเบเปเบฎเบฑเบเบเบฒเบเบชเบทเบเบเบญเบเปเบเบเบเบฐเบเบงเบเบเบฒเบเบเบญเบเปเบเบฑเบ (i).
เปเบเบทเปเบญเบเบเบฒเบเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบเป cap_net_bind_service, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบฎเบฑเบเบชเบดเปเบเบเบตเปเบเปเบงเบเบเบธเบ e. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฅเบตเปเบกเบเบปเปเบ shell เปเบเบเปเบฒเบชเบฑเปเบ. เบเบตเปเบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบชเบญเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบซเบกเบฒเบเบกเบฑเบเบเปเบงเบเบเบธเบ i. เบชเบธเบเบเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบซเปเบเบธเบเบชเบปเบกเบเบฑเบเบเบทเบเปเบเบตเบเปเบเปเบเบฒเบ (เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบฎเบฑเบเบชเบดเปเบเบเบตเปเปเบเบเบเปเปเบกเบตเบเบฒเบเบเปเบฝเบ UID) เบเบฑเบ p. เปเบเบดเปเบเบเบทเบงเปเบฒ 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, เปเบเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฝเบ shell เปเบเบเปเบเป libcap. เบชเปเบฒเบฅเบฑเบเบเปเปเบกเบนเบเปเบเบตเปเบกเปเบเบตเบก, เปเบเบดเปเบ man 3 libcap.
เปเบกเบทเปเบญเบเบฝเบเปเบเบผเปเบเบผเบก, เบชเปเบงเบเบซเบผเบฒเบเปเบฅเปเบงเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเปเปเบฎเบนเปเบฅเปเบงเบ เปเปเบฒ เบเบธเบเบฅเบฑเบเบชเบฐเบเบฐเบเบฑเบ เปเบปเบ เบเบตเปเปเบเบเบเบฒเบเบเปเบญเบเบเบฒเบเปเบเปเบงเบฅเบฒเปเบฅเปเบ; เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เบฅเบฑเบเบชเบฐเบเบฐเปเบซเบผเบปเปเบฒเบเบตเปเบญเบฒเบเบเบฐเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเปเบเบฎเบธเปเบเปเบซเบกเป.
เปเบเบทเปเบญเปเบเบปเปเบฒเปเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบเปเบเปเบเบกเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบตเบเบถเปเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบญเบปเบฒเปเบเบทเปเบญเบเบกเบท BCC เบเบตเปเบกเบตเบเบงเบฒเบกเบชเบฒเบกเบฒเบ, เปเบเบดเปเบเบเปเบฒเบเบปเบ kprobe เบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฑเบ kernel 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 เปเบชเบฑเปเบเบเบฝเบงเปเบเบเบฑเบเบเบฑเบ kernel 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, เบกเบฑเบเบเบทเบเบเปเบฒเบเบปเบเปเบเบฑเบเบเปเบฒเบเบปเบเบเบตเปเปเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบ kernel เปเบเปเบเบฅเป 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">เบเบงเบฒเบกเบชเบฒเบกเบฒเบเบกเบฑเบเบเบฐเบเบทเบเปเบเบตเบเปเบเปเปเบ runtime เบชเปเบฒเบฅเบฑเบ containers เปเบเบฑเปเบ 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 เปเบฅเบฐเปเบเบฑเบเบเบฑเปเบเบเบงเบฒเบกเบเบญเบเปเบเบเบตเปเบเบฐเบเบดเบเบฑเบเบขเบนเปเปเบ Linux kernel เบเบตเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบชเบฒเบกเบฒเบเบเบฑเปเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบฒเบเบขเปเบฒเบ. เปเบเบดเบเปเบกเปเบเบงเปเบฒ Seccomp เบกเบตเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบฝเบเบเบฝเบเบเบฑเบ Linux, เบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเบฑเบเบเบฒเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบฒเบเบขเปเบฒเบเปเบฎเบฑเบเปเบซเปเบกเบฑเบเบกเบตเบเบงเบฒเบกเบเบทเบเบซเบเบธเปเบเบซเบผเบฒเบเปเบกเบทเปเบญเบเบฝเบเบเบฑเบเบเบงเบเบกเบฑเบ.
เบเบธเบเบชเบปเบกเบเบฑเบเบเบญเบ Seccomp เปเบฅเบฐ Linux เบเปเปเปเบกเปเบเบชเบฐเปเบเบฒเบฐเปเบเบดเปเบเบเบฑเบเปเบฅเบฐเบเบฑเบ เปเบฅเบฐเบกเบฑเบเบเบฐเบเบทเบเบเปเบฒเปเบเปเบฎเปเบงเบกเบเบฑเบเปเบเบทเปเบญเบฎเบฑเบเบเบปเบเบเบฐเปเบซเบเบเบเบฒเบเบเบฑเบเบชเบญเบเบงเบดเบเบตเบเบฒเบ. เบเบปเบงเบขเปเบฒเบ, เบเปเบฒเบเบญเบฒเบเบเบฐเบเปเบญเบเบเบฒเบเปเบซเปเบเบฐเบเบงเบเบเบฒเบ CAP_NET_ADMIN เบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเปเบเปเปเปเบซเปเบกเบฑเบเบเบญเบกเบฎเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบญเบเปเบเบฑเบ, เบเบฑเบเบเบงเบฒเบเบเบฒเบเบเบญเบกเบฎเบฑเบเปเบฅเบฐเบเบญเบกเบฎเบฑเบเบเบฒเบเปเบเบฅเบฐเบเบปเบ 4.
เบงเบดเบเบตเบเบฒเบเบเบฒเบเบเบฑเปเบเบเบญเบ Seccomp เปเบกเปเบเบญเบตเบเปเบชเปเบเบปเบงเบเบญเบ BPF เบเบตเปเบเปเบฒเปเบเบตเบเบเบฒเบเบขเบนเปเปเบเปเบซเบกเบ SECCOMP_MODE_FILTER, เปเบฅเบฐเบเบฒเบเบเบฑเปเบเบเบญเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเปเบกเปเบเบเปเบฒเปเบเบตเบเปเบเปเบเบเบเบฝเบงเบเบฑเบเบเบฑเบเปเบเบฑเบเปเบเบฑเบ.
เบเบปเบงเบเบญเบ Seccomp เบเบทเบเปเบซเบฅเบเปเบเบเปเบเป prctl เบเปเบฒเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ PR_SET_SECOMP. เบเบฒเบเบเบฑเปเบเบเบญเบเปเบซเบผเบปเปเบฒเบเบตเปเปเบเปเบฎเบนเบเปเบเบเบเบญเบเปเบเบเบเบฒเบ BPF เบเบตเปเบเบทเบเบเบฐเบเบดเบเบฑเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบเบธเบ Seccomp เบเบตเปเบชเบฐเปเบเบเปเบเบเปเบเบเบชเปเบฒเบ seccomp_data. เปเบเบเบชเปเบฒเบเบเบตเปเบเบฐเบเบญเบเบเปเบงเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบญเปเบฒเบเบญเบตเบ, เบเปเบฒเปเบเบฐเบเปเบฒเบเบญเบเบเบปเบงเบเบตเปเปเบเบซเบฒเปเบเปเบเบเปเบเบตเปเบเปเบงเบฅเบฒเบเบตเปเปเบเบซเบฒเบฅเบฐเบเบปเบ, เปเบฅเบฐเบชเบนเบเบชเบธเบเบเบญเบเบซเบปเบเบเบฒเบเปเบเปเบเบฝเบเบเบฒเบเปเบเบฅเบฐเบเบปเบ, เบชเบฐเปเบเบเปเบเบฑเบ uint64.
เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเปเบเบเบชเปเบฒเบ seccomp_data เบเปเบฒเบเบเบทเบเบฒเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบ kernel เปเบเปเบเบฅเป linux/seccomp.h:
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};เบเบฑเปเบเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบซเบฑเบเปเบเปเบเบฒเบเปเบเบเบชเปเบฒเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบฑเปเบเบเบญเบเปเบเบเบเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบ, เบเบฒเบเปเบเปเบเบฝเบเบเบญเบเบกเบฑเบ, เบซเบผเบทเบเบฒเบเบเบฐเบชเบปเบกเบเบฐเบชเบฒเบเบเบญเบเบเบฑเบเบชเบญเบ.
เบซเบผเบฑเบเบเบฒเบเปเบเปเบฎเบฑเบเปเบเปเบฅเบฐเบเบธเบ Seccomp, เบเบฒเบเบเบฑเปเบเบเบญเบเบเปเบญเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบธเบเปเบเปเบเปเบเบทเปเบญเบเบฑเบเบชเบดเบเปเบเบชเบธเบเบเปเบฒเบเปเบฅเบฐเบเบญเบ 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 tracer เปเบเบเปเบเป - PTRACE_O_TRACESECCOMP เปเบเบทเปเบญเบเบฑเบเบเบงเบฒเบเปเบกเบทเปเบญเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเบทเปเบญเปเบเบดเปเบเปเบฅเบฐเบเบงเบเบเบธเบกเบเบฐเบเบงเบเบเบฒเบเบเบฑเปเบ. เบเปเบฒ tracer เบเปเปเปเบเปเปเบเบทเปเบญเบกเบเปเป, เบเปเปเบเบดเบเบเบฒเบเบเบฐเบเบทเบเบชเบปเปเบเบเบทเบ, errno เบเบทเบเบเบฑเปเบเปเบเบฑเบ -ENOSYS, เปเบฅเบฐเบเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบเบเปเปเปเบเปเบเปเบฒเปเบเบตเบเบเบฒเบ.
- SECOMP_RET_LOG - เบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบทเบเปเบเปเปเบ เปเบฅเบฐเปเบเบปเปเบฒเบฅเบฐเบเบปเบเปเบฅเปเบง.
- SECOMP_RET_ALLOW - เบเบฒเบเปเบเบฅเบฐเบเบปเบเปเบกเปเบเบญเบฐเบเบธเบเบฒเบเบขเปเบฒเบเบเปเบฒเบเบเบฒเบ.
ptrace เปเบกเปเบเบเบฒเบเปเบญเบตเปเบเบฅเบฐเบเบปเบเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบปเบเปเบเบเบฒเบเบเบดเบเบเบฒเบกเปเบเบเบฐเบเบงเบเบเบฒเบเบเบตเปเปเบญเบตเปเบเบงเปเบฒ tracee, เบกเบตเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบดเบเบเบฒเบกเปเบฅเบฐเบเบงเบเบเบธเบกเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบเบฐเบเบงเบเบเบฒเบ. เปเบเบฃเปเบเบก trace เบชเบฒเบกเบฒเบเบกเบตเบญเบดเบเบเบดเบเบปเบเบเปเปเบเบฒเบเบเบฐเบเบดเบเบฑเบ เปเบฅเบฐเบเบฑเบเปเบเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบเบงเบฒเบกเบเบปเบเบเบณเบเบญเบ 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 โ เบชเบฒโเบกเบฒเบโเบกเบตโเบชเบตเปโเปเบซเบโเบเบปเบโเบเบตเปโเบเบตเปโ:
- เบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบตเปเบฎเปเบญเบเบเปเปเบกเปเบเบเปเปเบฎเบนเปเบเบฑเบเบซเบผเบทเบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเปเบเบ kernel เปเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบฐเบเบธเบเบฑเบ;
- เบเบธเบเบเบตเปเบฅเบฐเบเบธเปเบงเปเบเปเปเบเบทเบเบเปเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบตเปเบฎเปเบญเบเบเป;
-operation เบเบฐเบเบญเบเบกเบต BPF_ABS, เปเบเปเบกเบตเบเบฑเบเบซเบฒเบเบฑเบเบเบฒเบเบเบปเบเปเบเบตเบเบเบตเปเบฅเบฐเบเบธเปเบงเป, เปเบเบดเปเบเบญเบฒเบเบเบฐเปเบเบตเบเบเบฐเบซเบเบฒเบเบเบญเบเปเบเบเบชเปเบฒเบ seccomp_data;
- เบเปเบฒเบเบงเบเบเบญเบเบเปเบฒเปเบเบฐเบเปเบฒเบเบตเปเบชเบปเปเบเบเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบตเบเบชเบนเบเบชเบธเบ;
โ ENOMEM โ เบเปเปโเบกเบตโเบเบงเบฒเบกโเบเบปเบโเบเปเบฒโเบเบฝเบโเบเปโเบเบตเปโเบเบฐโเบเบฐโเบเบดโเบเบฑเบโเปเบเบโเบเบฒเบโ;
- EOPNOTSUPP - เบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบตเปเปเบซเปเปเบซเบฑเบเบงเปเบฒเบเบฑเบ SECCOMP_GET_ACTION_AVAIL เบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบกเปเบเบกเบตเบขเบนเป, เปเบเป kernel เบเปเปเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเบปเบเบเบญเบเปเบเบเปเบเบเบฒเบเปเบเปเบเบฝเบ;
โ ESRCH โ เบเบฑเบโเบซเบฒโเปเบเปโเปเบเบตเบโเบเบถเปเบโเปเบโเปเบงโเบฅเบฒโเบเบตเป synchronizing เบชเบฒเบโเบโเปโเปโเบญเบทเปเบโ;
- ENOSYS - เบเปเปเบกเบตเบเบปเบงเบเบดเบเบเบฒเบกเบเบตเปเบเบดเบเบเบฑเบเบเบณเบชเบฑเปเบ SECOMP_RET_TRACE.
prctl เปเบกเปเบเบเบฒเบเปเบญเบตเปเบเบฅเบฐเบเบปเบเบเบตเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเปเบเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเปเบชเบฒเบกเบฒเบเบเบฑเบเบเบฒเบ (เบเปเบฒเบเบปเบเปเบฅเบฐเบฎเบฑเบ) เบฅเบฑเบเบชเบฐเบเบฐเบชเบฐเปเบเบฒเบฐเบเบญเบเบเบฐเบเบงเบเบเบฒเบ, เปเบเบฑเปเบ: byte endianness, เบเบทเป thread, เบฎเบนเบเปเบเบเบเบฒเบเบเบดเบเปเบฅเปเบเบตเปเบเบญเบเปเบ (Seccomp), เบชเบดเบเบเบดเบเบดเปเบชเบ, เปเบซเบเบเบฒเบ Perf, เปเบฅเบฐเบญเบทเปเบเป.
Seccomp เบญเบฒเบเบเบฐเปเบเบดเปเบเบเบทเบงเปเบฒเปเบเบฑเบเปเบเบเปเบเปเบฅเบเบต sandbox เบชเปเบฒเบฅเบฑเบเบเปเบฒเบ, เปเบเปเบกเบฑเบเบเปเปเปเบกเปเบ. Seccomp เปเบเบฑเบเบเบปเบเบเบฐเปเบซเบเบเบเบตเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบนเปเปเบเปเบเบฑเบเบเบฐเบเบฒเบเบปเบเปเบ sandbox. เบเบญเบเบเบตเปเปเบซเปเปเบเบดเปเบเบงเบดเบเบตเบเบฒเบเบเบตเปเปเบเบเบเบฒเบเบเบฒเบเปเบเปเบเบญเบเบเบนเปเปเบเปเบเบทเบเบชเปเบฒเบเบเบทเปเบเปเบเบเปเบเปเบเบปเบงเบเบญเบเบเบตเปเบเบทเบเปเบญเบตเปเบเปเบเบเบเบปเบเปเบเบเบฅเบฐเบเบปเบ Seccomp call.
เบเบปเบงเบขเปเบฒเบเบเบปเบงเบเบญเบ BPF Seccomp
เปเบโเบเบตเปโเบเบตเปโเบเบงเบโเปเบฎเบปเบฒโเบเบฐโเบชเบฐโเปเบเบโเปเบซเปโเปเบซเบฑเบโเบงเบดโเบเบตโเบเบฒเบโเบชเบปเบกโเบเบปเบโเบชเบญเบโเบเบฒเบโเบเบฐโเบเบดโเบเบฑเบโเบเบตเปโเปเบเปโเบเบถเบโเบชเบฒโเบซเบฒโเบฅเบทโเบเปเบญเบโเบซเบเปเบฒโเบเบตเปโ, เบเบทโ:
โ เบเบงเบโเปเบฎเบปเบฒโเบเบฐโเบเบฝเบโเปเบเบโเบเบฒเบ Seccomp BPFโ, เปเบเบดเปเบโเบเบฐโเบเบทเบโเบเปเบฒโเปเบเปโเปเบเบฑเบโเบเบปเบงโเบเบฑเปเบโเบเบญเบโเบเบตเปโเบกเบตโเบฅเบฐโเบซเบฑเบโเบเบปเบโเบเบญเบโเปเบเบโเบเบตเปโเปเบเบโเบเปเบฒเบโเบเบฑเบโเบเบถเปเบโเบเบฑเบโเบเบฒเบโเบเบฑเบโเบชเบดเบโเปเบโเปเบเปโ;
- เปเบซเบผเบเบเบปเบงเบเบญเบเปเบเบเปเบเป prctl.
เบเปเบฒเบญเบดเบเบเปเบฒเบเบเปเบญเบเบเบฒเบ headers เบเบฒเบเบซเปเบญเบเบชเบฐเบซเบกเบธเบเบกเบฒเบเบเบฐเบเบฒเบเปเบฅเบฐ 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 เบเบฑเปเบเปเบเบฑเบ y. เปเบเปเบเบทเปเบญเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบงเบเบชเบญเบเปเบเปเปเบเบฑเปเบเบเบตเป:
cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP
เบชเปเบงเบเบเบตเปเปเบซเบผเบทเบญเบเบญเบเบฅเบฐเบซเบฑเบเปเบกเปเบเบซเบเปเบฒเบเบตเปเบเบดเบเบเบฑเปเบ_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. เบเปเบฒเปเบเบฑเบเบเบฑเปเบเบเบฑเปเบ, เปเบเบเบขเบนเปเบเบตเป offset 0 เปเบเบซเบฒเบเปเบฒเปเบเบฐเบเปเบฒเบเปเปเปเบ, เบเปเบฒเบเปเปเบเบฑเปเบเบเบฑเปเบเบเบฐเปเบเบเบขเบนเปเบเบตเป offset 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.
- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - เบขเบธเบเปเบเบเบเบฒเบเบเปเบงเบ BPF_RET เปเบฅเบฐเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบเปเบเบเปเบเป SECOMP_RET_ALLOW.
SECOMP เปเบกเปเบ CBPF
เบเปเบฒเบเบญเบฒเบเบเบฐเบชเบปเบเปเบชเบงเปเบฒเปเบเบฑเบเบซเบเบฑเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเปเบฒเปเบเบฐเบเปเบฒเบเบทเบเบเปเบฒเปเบเปเปเบเบเบเบตเปเบเบฐเปเบเบฑเบเบงเบฑเบเบเบธ ELF เบเบตเปเบฅเบงเบเบฅเบงเบกเบซเบผเบทเปเบเบเบเบฒเบ C เบเบตเปเบฅเบงเบเบฅเบงเบก JIT.เบกเบตเบชเบญเบเปเบซเบเบเบปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป.
โขเบเปเบฒเบญเบดเบ, Seccomp เปเบเป cBPF (BPF เบเบฅเบฒเบชเบชเบดเบ) เปเบฅเบฐเบเปเปเปเบกเปเบ eBPF, เบเบถเปเบเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒ: เบกเบฑเบเบเปเปเบกเบตเบเบฐเบเบฝเบ, เปเบเปเบงเปเบฒเบเบฝเบเปเบเปเบชเบฐเบชเบปเบกเปเบเบทเปเบญเปเบเบฑเบเบเบปเบเบชเบธเบเบเปเบฒเบเบเบญเบเบเบฒเบเบเบดเบเปเบฅเป, เบเบฑเปเบเบเบตเปเปเบซเบฑเบเปเบเปเปเบเบเบปเบงเบขเปเบฒเบ.
โขเบญเบฑเบเบเบตเบชเบญเบ, Seccomp เบเบญเบกเบฎเบฑเบเบเบปเบงเบเบตเปเปเบเบซเบฒ array เบเบญเบเบเปเบฒเปเบเบฐเบเปเบฒ 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 เบเบญเบเบเบฐเปเบเบ 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 เปเบฅเบฐเบเบฝเบเปเบเปเปเบซเปเบชเบดเบเบเบตเปเบเบฑเบเบเบงเบฒเบเบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบเบฑเบเปเบปเบ. เบซเบผเบฑเบเบเบฒเบเบเบฒเบเบเบดเบเบเบฑเปเบเบเบปเบงเบเบญเบ, เบเบงเบเปเบฎเบปเบฒเบชเบทเบเบเปเปเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบเปเบเป argument เบเปเบฒเบญเบดเบ:
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 เปเบเบทเปเบญเปเบเบดเปเบเบงเปเบฒเบกเบตเบซเบเบฑเบเปเบเบตเบเบเบถเปเบ:
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, เบเบปเบเบชเปเบงเบเปเบซเบเปเบเบดเบเบงเปเบฒเบเบงเบเปเบเบปเบฒเบเบฝเบเปเบเปเบเบฝเบเปเบฅเบฐเปเบซเบฅเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเบกเบตเบชเบดเบเบเบดเบเบดเปเบชเบเบเบญเบเบเบนเปเบเปเบฅเบดเบซเบฒเบ. เปเบเบเบฐเบเบฐเบเบตเปเบเปเบฒเบเบฐเปเบซเบผเบเบเบตเปเปเบกเปเบเบเบงเบฒเบกเบเบดเบเปเบเบเบเบปเปเบงเปเบ, kernel เบเบฐเบเบดเบเบฑเบเบเบธเบเบเบญเบเบเบปเบเปเบเปเบเบทเปเบญเบเบปเบเบเปเบญเบเบงเบฑเบเบเบธ eBPF เปเบเบฅเบฐเบเบฑเบเบเปเบฒเบเป. เบเบปเบเปเบเปเบซเบผเบปเปเบฒเบเบตเปเปเบญเบตเปเบเบงเปเบฒ BPF LSM traps.
BPF LSM เบเบฑเบเบเบฑเบ
เปเบเบทเปเบญเปเบซเปเบเบฒเบเบเบดเบเบเบฒเบกเปเบซเบเบเบฒเบเบเบญเบเบฅเบฐเบเบปเบเปเบเบเปเบญเบเบฐเบฅเบฒเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ, LSM เบเบฐเบเบดเบเบฑเบเปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบเปเบชเปเบเบฑเบเบเบฑเบ. เบเบฒเบเปเบเบซเบฒ hook เปเบกเปเบเบเบฒเบเบเปเบฒเบเบงเบดเบเบฒเบเบฒเบเบเปเบฒเบเบเบทเบเบฑเบเบเบฑเบเบเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบ, เปเบเปเปเบเบฑเบเบฅเบฐเบเบปเบเปเบญเบเบฐเบฅเบฒเบเปเบฅเบฐเบเบฐเบชเบปเบกเบเบฐเบชเบฒเบเบเบฑเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบ. LSM เบชเบฐเบซเบเบญเบเปเบเบงเบเบงเบฒเบกเบเบดเบเปเบซเบกเปเบเบตเปเบเบฑเปเบ abstraction เบชเบฒเบกเบฒเบเบเปเบงเบเบซเบผเบตเบเปเบงเบฑเปเบเบเบฑเบเบซเบฒเบเบตเปเบเบปเบเปเบเปเบงเบฅเบฒเบเบตเปเบเบฑเบเบเบฒเบเบเบฑเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเปเบฝเบงเบเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ.
เปเบเปเบงเบฅเบฒเบเบฝเบ, kernel เบกเบตเปเบเบฑเบ hooks เบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบเปเบเบเบเบฒเบ BPF, เปเบฅเบฐ SELinux เปเบกเปเบ LSM เบเบตเปเบกเบตเบเบปเบงเบเบฝเบงเบเบตเปเบเบฐเบเบดเบเบฑเบเบเบงเบเบกเบฑเบ.
เบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบญเบเบเบฑเบเปเบกเปเบเบเบฑเปเบเบขเบนเปเปเบ kernel tree เปเบเปเบเบฅเป 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 เบชเบปเปเบเบเบทเบเปเบเบฅเป descriptor เบชเปเบฒเบฅเบฑเบเปเบเบเบเบตเป;
- security_bpf_prog - เบเบงเบเปเบเบดเปเบเปเบงเบฅเบฒเบเบตเป kernel เบชเบปเปเบเบเบทเบเปเบเบฅเป descriptor เบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบ eBPF;
โ security_bpf_map_alloc โ เบเบงเบโเปเบเบดเปเบโเบงเปเบฒโเบเบฒเบโเบชเบฐโเบซเบเบฒเบกโเบเบงเบฒเบกโเบเบญเบโเปเบโเบเบฒเบโเปเบโเปเบเบโเบเบตเป BPF เปเบกเปเบโเปเบเปโเปเบฅเบตเปเบกโเบเบปเปเบโ;
- security_bpf_map_free - เบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบฒเบเบชเบฐเบซเบเบฒเบกเบเบงเบฒเบกเบเบญเบเปเบเปเบเปเบเบทเบเบญเบฐเบเบฒเปเบกเบขเบนเปเปเบเปเบเบเบเบตเป BPF;
โ security_bpf_prog_alloc โ เบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบฒเบเบชเบฐเบซเบเบฒเบกเบเบงเบฒเบกเบเบญเบเปเบเปเบเปเบเบทเบเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเปเบเปเบเบเบเบฒเบ BPF;
- security_bpf_prog_free - เบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบฒเบเบชเบฐเบซเบเบฒเบกเบเบงเบฒเบกเบเบญเบเปเบเปเบเปเบเบทเบเบญเบฐเบเบฒเปเบกเบเบฒเบเปเบเปเบเบเบเบฒเบ BPF.
เปเบเบเบฑเบเบเบธเบเบฑเบ, เปเบซเบฑเบเบเบฑเบเบซเบกเบปเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเปเบเบปเปเบฒเปเบ: เปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบ LSM BPF interceptors เปเบกเปเบเบงเปเบฒเบเบงเบเปเบเบปเบฒเบชเบฒเบกเบฒเบเบชเบฐเบซเบเบญเบเบเบฒเบเบเบปเบเบเปเบญเบเปเบเปเบฅเบฐเบงเบฑเบเบเบธ eBPF, เบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบเบฝเบเปเบเปเบเบนเปเบเบตเปเบกเบตเบชเบดเบเบเบดเบเบตเปเปเบซเบกเบฒเบฐเบชเบปเบกเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเบฑเบเปเบฅเบฐเปเบเบเบเบฒเบ.
Summary
เบเบงเบฒเบกโเบเบญเบโเปเบโเบเปเปโเปเบกเปเบโเบเบฒเบโเบชเบดเปเบโเบเบฒเบโเบขเปเบฒเบโเบเบตเปโเบเปเบฒเบโเบชเบฒโเบกเบฒเบโเบเบฐโเบเบดโเบเบฑเบโเปเบโเบงเบดโเบเบตโเบเบฒเบโเบเบฐโเบซเบเบฒเบโเบเบฝเบงโเปเบซเบกเบฒเบฐโเบชเปเบฒโเบฅเบฑเบโเบเบธเบโเบชเบดเปเบโเบเบธเบโเบขเปเบฒเบโเบเบตเปโเบเปเบฒเบโเบเปเบญเบโเบเบฒเบโเบเบปเบโเบเบฑเบโเบฎเบฑเบโเบชเบฒโ. เบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบชเปเบฒเบเบฑเบเบเบตเปเบเบฐเบชเบฒเบกเบฒเบเบเบปเบเบเปเบญเบเบฅเบฐเบเบปเบเบเปเบฒเบเปเปเบเบฅเบฐเบเบฑเบเบเปเบฒเบเปเปเบฅเบฐเปเบเบเบฒเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ. เปเบเบทเปเบญเบซเบผเบทเบเปเป, เบงเบดเบเบตเบเบตเปเบเบตเบเบตเปเบชเบธเบเปเบเบเบฒเบเบฎเบฑเบเบชเบฒเบเบงเบฒเบกเบเบญเบเปเบเบเบญเบเบฅเบฐเบเบปเบเปเบกเปเบเบเบฒเบเบเบฑเบเบฅเบฐเบเบฝเบเบฅเบฐเบเบฑเบเบเบฒเบเบเบปเบเบเปเบญเบเบเบฒเบเบเปเบฒเปเบซเบเปเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ, เบเบฑเปเบเบเบฑเปเบเบเบฒเบเบซเบผเบธเบเบเปเบญเบเบเบงเบฒเบกเบเบญเบเปเบเบเบญเบเบฅเบฐเบเบฑเบเบซเบเบถเปเบเบเปเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเปเบเบปเปเบฒเปเบเบดเบเบฅเบฐเบเบปเบเบเบฑเบเบซเบกเบปเบ. เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบซเบผเบฑเบเปเบเปเปเบฎเบฑเบเบงเบฝเบเบเบตเปเบเบตเปเบเบเบฒเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบธเบเบเบฑเปเบเบเปเบฒเบเป เปเบฅเบฐเบเบธเบเบชเปเบฒเบเบฑเบเบเปเบฒเบเป. เบเบงเบเปเบฎเบปเบฒเบซเบงเบฑเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบเปเปเบซเปเบเปเบฒเบเปเบเบปเปเบฒเปเบเบเบตเบเปเบฝเบงเบเบฑเบเบชเบดเปเบเบเบตเปเบเบฑเปเบเปเบกเปเบเปเบฅเบฐเบงเบดเบเบตเบเบฒเบเบเปเบฒเปเบเปเปเบเบผเปเบเบผเบก BPF เปเบเบทเปเบญเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเบงเบเบกเบฑเบ.
เบเปเบฝเบงเบเบฑเบเบเบนเปเบเบฝเบ
David Calavera เปเบกเปเบ CTO เบขเบนเป Netlify. เบฅเบฒเบงเปเบเปเปเบฎเบฑเบเบงเบฝเบเปเบเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบ Docker เปเบฅเบฐเบเบฐเบเบญเบเบชเปเบงเบเปเบเบปเปเบฒเปเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเปเบเบทเปเบญเบเบกเบท Runc, Go เปเบฅเบฐ BCC, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเปเบเบเบเบฒเบเปเบซเบผเปเบเปเบเบตเบเบญเบทเปเบเป. เปเบเบฑเบเบเบตเปเบฎเบนเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเบฅเบฒเบงเบเปเบฝเบงเบเบฑเบเปเบเบเบเบฒเบ Docker เปเบฅเบฐเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบฅเบฐเบเบปเบเบเบดเปเบงเบ Docker plugin. David เบกเบตเบเบงเบฒเบกเบเบฐเบเบทเบฅเบทเบฅเบปเปเบเบซเบผเบฒเบเบเปเบฝเบงเบเบฑเบเปเบชเบฑเปเบเบชเบฐเปเบเบ flame เปเบฅเบฐเบชเบฐเปเบซเบกเบตเบเบญเบเบซเบฒเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ.
Lorenzo Fontana เปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบเบเบตเบกเบเบฒเบเปเบซเบผเปเบเปเบเบตเบเบขเบนเป Sysdig, เบเปเบญเบเบเบตเปเบฅเบฒเบงเบชเบธเบกเปเบชเปเบเบปเปเบเบเปเบเปเบฝเบงเบเบฑเบ Falco, เปเบเบเบเบฒเบ Cloud Native Computing Foundation เบเบตเปเบชเบฐเบซเบเบญเบเบเบงเบฒเบกเบเบญเบเปเบเบเบญเบ container runtime เปเบฅเบฐเบเบฒเบเบเบงเบเบชเบญเบเบเบงเบฒเบกเบเบดเบเบเบปเบเบเบฐเบเบดเบเปเบฒเบเปเบกเบเบนเบเปเบเปเบเปเบฅเบฐ eBPF. เบฅเบฒเบงเบกเบตเบเบงเบฒเบกเบเบฐเบเบทเบฅเบทเบฅเบปเปเบเบเปเบฝเบงเบเบฑเบเบฅเบฐเบเบปเบเปเบเบเบขเบฒเบ, เบเบญเบเปเบงเบเบตเปเบเปเบฒเบเบปเบเปเบเบทเบญเบเปเบฒเบ, เปเบเปเบ Linux, เปเบฅเบฐเบเบฒเบเบงเบดเปเบเบฒเบฐเบเบฐเบชเบดเบเบเบดเบเบฒเบ.
ยป เบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเบเปเบฝเบงเบเบฑเบเบเบถเปเบกเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเปเบเบดเปเบเปเบเปเบเบตเป
ยป
ยป
เบชเปเบฒเบฅเบฑเบ Khabrozhiteley เบชเปเบงเบเบฅเบปเบ 25% เบเบฒเบเบเปเบฒเปเบเปเบเบนเบเบญเบ - Linux
เบเบฒเบเบซเบผเบฑเบเบเบฒเบเบเปเบฒเบฅเบฐเบชเบฐเบเบฑเบเปเบเปเบเบเบญเบเบเบถเปเบก, เบเบถเปเบกเบญเบตเปเบฅเบฑเบเปเบเบฃเบเบดเบเบเบฐเบเบทเบเบชเบปเปเบเปเบเบเบฒเบเบญเบตเปเบกเบฅ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com
